Backend YAML Config Editor (#104406)
Add a PUT method for `/api/v3/configuration/file`, which entirely replaces `flamenco-manager.yaml` with the received JSON payload. This will be used in the future to store configuration edited in the web frontend. Ref: #99426 Reviewed-on: https://projects.blender.org/studio/flamenco/pulls/104406
This commit is contained in:
parent
0ee523a5d5
commit
58e2745838
127
addon/flamenco/manager/api/meta_api.py
generated
127
addon/flamenco/manager/api/meta_api.py
generated
@ -511,6 +511,56 @@ class MetaApi(object):
|
|||||||
},
|
},
|
||||||
api_client=api_client
|
api_client=api_client
|
||||||
)
|
)
|
||||||
|
self.update_configuration_file_endpoint = _Endpoint(
|
||||||
|
settings={
|
||||||
|
'response_type': None,
|
||||||
|
'auth': [],
|
||||||
|
'endpoint_path': '/api/v3/configuration/file',
|
||||||
|
'operation_id': 'update_configuration_file',
|
||||||
|
'http_method': 'PUT',
|
||||||
|
'servers': None,
|
||||||
|
},
|
||||||
|
params_map={
|
||||||
|
'all': [
|
||||||
|
'body',
|
||||||
|
],
|
||||||
|
'required': [
|
||||||
|
'body',
|
||||||
|
],
|
||||||
|
'nullable': [
|
||||||
|
],
|
||||||
|
'enum': [
|
||||||
|
],
|
||||||
|
'validation': [
|
||||||
|
]
|
||||||
|
},
|
||||||
|
root_map={
|
||||||
|
'validations': {
|
||||||
|
},
|
||||||
|
'allowed_values': {
|
||||||
|
},
|
||||||
|
'openapi_types': {
|
||||||
|
'body':
|
||||||
|
({str: (bool, date, datetime, dict, float, int, list, str, none_type)},),
|
||||||
|
},
|
||||||
|
'attribute_map': {
|
||||||
|
},
|
||||||
|
'location_map': {
|
||||||
|
'body': 'body',
|
||||||
|
},
|
||||||
|
'collection_format_map': {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
headers_map={
|
||||||
|
'accept': [
|
||||||
|
'application/json'
|
||||||
|
],
|
||||||
|
'content_type': [
|
||||||
|
'application/json'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
api_client=api_client
|
||||||
|
)
|
||||||
|
|
||||||
def check_blender_exe_path(
|
def check_blender_exe_path(
|
||||||
self,
|
self,
|
||||||
@ -1253,3 +1303,80 @@ class MetaApi(object):
|
|||||||
kwargs['_host_index'] = kwargs.get('_host_index')
|
kwargs['_host_index'] = kwargs.get('_host_index')
|
||||||
return self.save_setup_assistant_config_endpoint.call_with_http_info(**kwargs)
|
return self.save_setup_assistant_config_endpoint.call_with_http_info(**kwargs)
|
||||||
|
|
||||||
|
def update_configuration_file(
|
||||||
|
self,
|
||||||
|
body,
|
||||||
|
**kwargs
|
||||||
|
):
|
||||||
|
"""Overwrites the configuration file. It does not actively reload the new configuration. # noqa: E501
|
||||||
|
|
||||||
|
This method makes a synchronous HTTP request by default. To make an
|
||||||
|
asynchronous HTTP request, please pass async_req=True
|
||||||
|
|
||||||
|
>>> thread = api.update_configuration_file(body, async_req=True)
|
||||||
|
>>> result = thread.get()
|
||||||
|
|
||||||
|
Args:
|
||||||
|
body ({str: (bool, date, datetime, dict, float, int, list, str, none_type)}): The configuration values as a JSON
|
||||||
|
|
||||||
|
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:
|
||||||
|
None
|
||||||
|
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['body'] = \
|
||||||
|
body
|
||||||
|
return self.update_configuration_file_endpoint.call_with_http_info(**kwargs)
|
||||||
|
|
||||||
|
66
addon/flamenco/manager/docs/MetaApi.md
generated
66
addon/flamenco/manager/docs/MetaApi.md
generated
@ -14,6 +14,7 @@ Method | HTTP request | Description
|
|||||||
[**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_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
|
[**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.
|
[**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.
|
||||||
|
[**update_configuration_file**](MetaApi.md#update_configuration_file) | **PUT** /api/v3/configuration/file | Overwrites the configuration file. It does not actively reload the new configuration.
|
||||||
|
|
||||||
|
|
||||||
# **check_blender_exe_path**
|
# **check_blender_exe_path**
|
||||||
@ -676,3 +677,68 @@ 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)
|
[[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)
|
||||||
|
|
||||||
|
# **update_configuration_file**
|
||||||
|
> update_configuration_file(body)
|
||||||
|
|
||||||
|
Overwrites the configuration file. It does not actively reload the new configuration.
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
import time
|
||||||
|
import flamenco.manager
|
||||||
|
from flamenco.manager.api import meta_api
|
||||||
|
from flamenco.manager.model.error import Error
|
||||||
|
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)
|
||||||
|
body = {} # {str: (bool, date, datetime, dict, float, int, list, str, none_type)} | The configuration values as a JSON
|
||||||
|
|
||||||
|
# example passing only required values which don't have defaults set
|
||||||
|
try:
|
||||||
|
# Overwrites the configuration file. It does not actively reload the new configuration.
|
||||||
|
api_instance.update_configuration_file(body)
|
||||||
|
except flamenco.manager.ApiException as e:
|
||||||
|
print("Exception when calling MetaApi->update_configuration_file: %s\n" % e)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
Name | Type | Description | Notes
|
||||||
|
------------- | ------------- | ------------- | -------------
|
||||||
|
**body** | **{str: (bool, date, datetime, dict, float, int, list, str, none_type)}**| The configuration values as a JSON |
|
||||||
|
|
||||||
|
### Return type
|
||||||
|
|
||||||
|
void (empty response body)
|
||||||
|
|
||||||
|
### Authorization
|
||||||
|
|
||||||
|
No authorization required
|
||||||
|
|
||||||
|
### HTTP request headers
|
||||||
|
|
||||||
|
- **Content-Type**: application/json
|
||||||
|
- **Accept**: application/json
|
||||||
|
|
||||||
|
|
||||||
|
### HTTP response details
|
||||||
|
|
||||||
|
| Status code | Description | Response headers |
|
||||||
|
|-------------|-------------|------------------|
|
||||||
|
**204** | The configuration was successfully stored to flamenco-manager.yaml | - |
|
||||||
|
**0** | Unable to save the configuration file | - |
|
||||||
|
|
||||||
|
[[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)
|
||||||
|
|
||||||
|
1
addon/flamenco/manager_README.md
generated
1
addon/flamenco/manager_README.md
generated
@ -105,6 +105,7 @@ Class | Method | HTTP request | Description
|
|||||||
*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_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* | [**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.
|
*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.
|
||||||
|
*MetaApi* | [**update_configuration_file**](flamenco/manager/docs/MetaApi.md#update_configuration_file) | **PUT** /api/v3/configuration/file | Overwrites the configuration file. It does not actively reload the new configuration.
|
||||||
*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.
|
*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.
|
||||||
*ShamanApi* | [**shaman_checkout_requirements**](flamenco/manager/docs/ShamanApi.md#shaman_checkout_requirements) | **POST** /api/v3/shaman/checkout/requirements | Checks a Shaman Requirements file, and reports which files are unknown.
|
*ShamanApi* | [**shaman_checkout_requirements**](flamenco/manager/docs/ShamanApi.md#shaman_checkout_requirements) | **POST** /api/v3/shaman/checkout/requirements | Checks a Shaman Requirements file, and reports which files are unknown.
|
||||||
*ShamanApi* | [**shaman_file_store**](flamenco/manager/docs/ShamanApi.md#shaman_file_store) | **POST** /api/v3/shaman/files/{checksum}/{filesize} | Store a new file on the Shaman server. Note that the Shaman server can forcibly close the HTTP connection when another client finishes uploading the exact same file, to prevent double uploads. The file's contents should be sent in the request body.
|
*ShamanApi* | [**shaman_file_store**](flamenco/manager/docs/ShamanApi.md#shaman_file_store) | **POST** /api/v3/shaman/files/{checksum}/{filesize} | Store a new file on the Shaman server. Note that the Shaman server can forcibly close the HTTP connection when another client finishes uploading the exact same file, to prevent double uploads. The file's contents should be sent in the request body.
|
||||||
|
@ -193,6 +193,10 @@ type ConfigService interface {
|
|||||||
|
|
||||||
// Save writes the in-memory configuration to the config file.
|
// Save writes the in-memory configuration to the config file.
|
||||||
Save() error
|
Save() error
|
||||||
|
|
||||||
|
// Replace attempts to overwrite the configuration file on disk with the given Conf.
|
||||||
|
// If successful, it discards the in-memory configuration, and replaces it with the given Conf.
|
||||||
|
Replace(config.Conf) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type Shaman interface {
|
type Shaman interface {
|
||||||
|
@ -53,6 +53,24 @@ func (f *Flamenco) GetConfiguration(e echo.Context) error {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *Flamenco) UpdateConfigurationFile(e echo.Context) error {
|
||||||
|
logger := requestLogger(e)
|
||||||
|
|
||||||
|
var newConf config.Conf
|
||||||
|
if err := e.Bind(&newConf); err != nil {
|
||||||
|
logger.Warn().Err(err).Msg("bad request received")
|
||||||
|
return sendAPIError(e, http.StatusBadRequest, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save the final configuration to disk.
|
||||||
|
if err := f.config.Replace(newConf); err != nil {
|
||||||
|
logger.Error().Err(err).Msg("error saving configuration file")
|
||||||
|
return sendAPIError(e, http.StatusInternalServerError, "setup assistant: error saving configuration file: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return e.NoContent(http.StatusNoContent)
|
||||||
|
}
|
||||||
|
|
||||||
func (f *Flamenco) GetConfigurationFile(e echo.Context) error {
|
func (f *Flamenco) GetConfigurationFile(e echo.Context) error {
|
||||||
config := f.config.Get()
|
config := f.config.Get()
|
||||||
return e.JSON(http.StatusOK, config)
|
return e.JSON(http.StatusOK, config)
|
||||||
|
@ -17,6 +17,7 @@ import (
|
|||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"projects.blender.org/studio/flamenco/internal/manager/config"
|
"projects.blender.org/studio/flamenco/internal/manager/config"
|
||||||
"projects.blender.org/studio/flamenco/pkg/api"
|
"projects.blender.org/studio/flamenco/pkg/api"
|
||||||
|
shaman_config "projects.blender.org/studio/flamenco/pkg/shaman/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetVariables(t *testing.T) {
|
func TestGetVariables(t *testing.T) {
|
||||||
@ -401,3 +402,91 @@ func metaTestFixtures(t *testing.T) (mockedFlamenco, func()) {
|
|||||||
|
|
||||||
return mf, finish
|
return mf, finish
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestUpdateConfigurationFile checks to see if JSON attributes actually overwrite the Config struct attributes
|
||||||
|
func TestUpdateConfigurationFile(t *testing.T) {
|
||||||
|
|
||||||
|
mf, finish := metaTestFixtures(t)
|
||||||
|
defer finish()
|
||||||
|
|
||||||
|
doTest := func(body config.Conf) config.Conf {
|
||||||
|
|
||||||
|
var replacedConfig config.Conf
|
||||||
|
// Mock the loading and saving of the config.
|
||||||
|
mf.config.EXPECT().Replace(body).Do(func(newConfig config.Conf) {
|
||||||
|
replacedConfig = newConfig
|
||||||
|
})
|
||||||
|
|
||||||
|
// Call the API.
|
||||||
|
echoCtx := mf.prepareMockedJSONRequest(body)
|
||||||
|
err := mf.flamenco.UpdateConfigurationFile(echoCtx)
|
||||||
|
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
assertResponseNoContent(t, echoCtx)
|
||||||
|
|
||||||
|
return replacedConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test situation where manager name is updated
|
||||||
|
{
|
||||||
|
form := config.Conf{
|
||||||
|
Base: config.Base{
|
||||||
|
ManagerName: "abc",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
updatedConfig := doTest(form)
|
||||||
|
assert.Equal(t, form.Base.ManagerName, updatedConfig.Base.ManagerName)
|
||||||
|
// Other settings should be set to their zero values.
|
||||||
|
assert.Equal(t, form.Base.Listen, updatedConfig.Listen)
|
||||||
|
assert.Equal(t, form.Variables, updatedConfig.Variables)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test situation where listen is updated
|
||||||
|
{
|
||||||
|
form := config.Conf{
|
||||||
|
Base: config.Base{
|
||||||
|
Listen: ":3000",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
updatedConfig := doTest(form)
|
||||||
|
assert.Equal(t, form.Base.Listen, updatedConfig.Base.Listen)
|
||||||
|
// Other settings should be set to their zero values.
|
||||||
|
assert.Equal(t, form.Base.Shaman.Enabled, updatedConfig.Base.Shaman.Enabled)
|
||||||
|
assert.Equal(t, form.Base.ManagerName, updatedConfig.Base.ManagerName)
|
||||||
|
assert.Equal(t, form.Variables, updatedConfig.Variables)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test situation where shaman enabled is updated
|
||||||
|
{
|
||||||
|
form := config.Conf{
|
||||||
|
Base: config.Base{
|
||||||
|
Shaman: shaman_config.Config{
|
||||||
|
Enabled: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
updatedConfig := doTest(form)
|
||||||
|
assert.Equal(t, form.Base.Shaman.Enabled, updatedConfig.Base.Shaman.Enabled)
|
||||||
|
// Other settings should be set to their zero values.
|
||||||
|
assert.Equal(t, form.Base.Listen, updatedConfig.Base.Listen)
|
||||||
|
assert.Equal(t, form.Base.ManagerName, updatedConfig.Base.ManagerName)
|
||||||
|
assert.Equal(t, form.Variables, updatedConfig.Variables)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test situation where shaman enabled is omitted defaults to false
|
||||||
|
{
|
||||||
|
form := config.Conf{
|
||||||
|
Base: config.Base{
|
||||||
|
Shaman: shaman_config.Config{},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
updatedConfig := doTest(form)
|
||||||
|
assert.Equal(t, false, updatedConfig.Base.Shaman.Enabled)
|
||||||
|
assert.Equal(t, false, form.Base.Shaman.Enabled)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
14
internal/manager/api_impl/mocks/api_impl_mock.gen.go
generated
14
internal/manager/api_impl/mocks/api_impl_mock.gen.go
generated
@ -996,6 +996,20 @@ func (mr *MockConfigServiceMockRecorder) NewVariableToValueConverter(arg0, arg1
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewVariableToValueConverter", reflect.TypeOf((*MockConfigService)(nil).NewVariableToValueConverter), arg0, arg1)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewVariableToValueConverter", reflect.TypeOf((*MockConfigService)(nil).NewVariableToValueConverter), arg0, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Replace mocks base method.
|
||||||
|
func (m *MockConfigService) Replace(arg0 config.Conf) error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "Replace", arg0)
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace indicates an expected call of Replace.
|
||||||
|
func (mr *MockConfigServiceMockRecorder) Replace(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Replace", reflect.TypeOf((*MockConfigService)(nil).Replace), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
// ResolveVariables mocks base method.
|
// ResolveVariables mocks base method.
|
||||||
func (m *MockConfigService) ResolveVariables(arg0 config.VariableAudience, arg1 config.VariablePlatform) map[string]config.ResolvedVariable {
|
func (m *MockConfigService) ResolveVariables(arg0 config.VariableAudience, arg1 config.VariablePlatform) map[string]config.ResolvedVariable {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
|
@ -67,71 +67,71 @@ type TestTasks struct {
|
|||||||
// ConfMeta contains configuration file metadata.
|
// ConfMeta contains configuration file metadata.
|
||||||
type ConfMeta struct {
|
type ConfMeta struct {
|
||||||
// Version of the config file structure.
|
// Version of the config file structure.
|
||||||
Version int `yaml:"version"`
|
Version int `json:"version" yaml:"version"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Base contains those settings that are shared by all configuration versions.
|
// Base contains those settings that are shared by all configuration versions.
|
||||||
type Base struct {
|
type Base struct {
|
||||||
Meta ConfMeta `yaml:"_meta"`
|
Meta ConfMeta `json:"_meta" yaml:"_meta"`
|
||||||
|
|
||||||
ManagerName string `yaml:"manager_name"`
|
ManagerName string `json:"manager_name" yaml:"manager_name"`
|
||||||
|
|
||||||
DatabaseDSN string `yaml:"database"`
|
DatabaseDSN string `json:"database" yaml:"database"`
|
||||||
DBIntegrityCheck duration.Duration `yaml:"database_check_period"`
|
DBIntegrityCheck duration.Duration `json:"database_check_period" yaml:"database_check_period"`
|
||||||
|
|
||||||
Listen string `yaml:"listen"`
|
Listen string `json:"listen" yaml:"listen"`
|
||||||
|
|
||||||
SSDPDiscovery bool `yaml:"autodiscoverable"`
|
SSDPDiscovery bool `json:"autodiscoverable" yaml:"autodiscoverable"`
|
||||||
|
|
||||||
// LocalManagerStoragePath is where the Manager stores its files, like task
|
// LocalManagerStoragePath is where the Manager stores its files, like task
|
||||||
// logs, last-rendered images, etc.
|
// logs, last-rendered images, etc.
|
||||||
LocalManagerStoragePath string `yaml:"local_manager_storage_path"`
|
LocalManagerStoragePath string `json:"local_manager_storage_path" yaml:"local_manager_storage_path"`
|
||||||
|
|
||||||
// SharedStoragePath is where files shared between Manager and Workers go,
|
// SharedStoragePath is where files shared between Manager and Workers go,
|
||||||
// like the blend files of a render job.
|
// like the blend files of a render job.
|
||||||
SharedStoragePath string `yaml:"shared_storage_path"`
|
SharedStoragePath string `json:"shared_storage_path" yaml:"shared_storage_path"`
|
||||||
|
|
||||||
Shaman shaman_config.Config `yaml:"shaman"`
|
Shaman shaman_config.Config `json:"shaman" yaml:"shaman"`
|
||||||
|
|
||||||
TaskTimeout duration.Duration `yaml:"task_timeout"`
|
TaskTimeout duration.Duration `json:"task_timeout" yaml:"task_timeout"`
|
||||||
WorkerTimeout duration.Duration `yaml:"worker_timeout"`
|
WorkerTimeout duration.Duration `json:"worker_timeout" yaml:"worker_timeout"`
|
||||||
|
|
||||||
/* This many failures (on a given job+task type combination) will ban a worker
|
/* This many failures (on a given job+task type combination) will ban a worker
|
||||||
* from that task type on that job. */
|
* from that task type on that job. */
|
||||||
BlocklistThreshold int `yaml:"blocklist_threshold"`
|
BlocklistThreshold int `json:"blocklist_threshold" yaml:"blocklist_threshold"`
|
||||||
|
|
||||||
// When this many workers have tried the task and failed, it will be hard-failed
|
// When this many workers have tried the task and failed, it will be hard-failed
|
||||||
// (even when there are workers left that could technically retry the task).
|
// (even when there are workers left that could technically retry the task).
|
||||||
TaskFailAfterSoftFailCount int `yaml:"task_fail_after_softfail_count"`
|
TaskFailAfterSoftFailCount int `json:"task_fail_after_softfail_count" yaml:"task_fail_after_softfail_count"`
|
||||||
|
|
||||||
MQTT MQTTConfig `yaml:"mqtt"`
|
MQTT MQTTConfig `json:"mqtt" yaml:"mqtt"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// MQTTConfig contains the configuration options for MQTT broker (idea for the future) and client.
|
// MQTTConfig contains the configuration options for MQTT broker (idea for the future) and client.
|
||||||
type MQTTConfig struct {
|
type MQTTConfig struct {
|
||||||
Client eventbus.MQTTClientConfig `yaml:"client"`
|
Client eventbus.MQTTClientConfig `json:"client" yaml:"client"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Conf is the latest version of the configuration.
|
// Conf is the latest version of the configuration.
|
||||||
// Currently it is version 3.
|
// Currently it is version 3.
|
||||||
type Conf struct {
|
type Conf struct {
|
||||||
Base `yaml:",inline"`
|
Base `json:",inline" yaml:",inline"`
|
||||||
|
|
||||||
// Store GOOS in a variable so it can be modified by unit tests, making the
|
// Store GOOS in a variable so it can be modified by unit tests, making the
|
||||||
// test independent of the actual platform.
|
// test independent of the actual platform.
|
||||||
currentGOOS VariablePlatform `yaml:"-"`
|
currentGOOS VariablePlatform `json:"-" yaml:"-"`
|
||||||
|
|
||||||
// Variable name → Variable definition
|
// Variable name → Variable definition
|
||||||
Variables map[string]Variable `yaml:"variables"`
|
Variables map[string]Variable `json:"variables" yaml:"variables"`
|
||||||
|
|
||||||
// Implicit variables work as regular variables, but do not get written to the
|
// Implicit variables work as regular variables, but do not get written to the
|
||||||
// configuration file.
|
// configuration file.
|
||||||
implicitVariables map[string]Variable `yaml:"-"`
|
implicitVariables map[string]Variable `json:"-" yaml:"-"`
|
||||||
|
|
||||||
// audience + platform + variable name → variable value.
|
// audience + platform + variable name → variable value.
|
||||||
// Used to look up variables for a given platform and audience.
|
// Used to look up variables for a given platform and audience.
|
||||||
// The 'audience' is never "all" or ""; only concrete audiences are stored here.
|
// The 'audience' is never "all" or ""; only concrete audiences are stored here.
|
||||||
VariablesLookup map[VariableAudience]map[VariablePlatform]map[string]string `yaml:"-"`
|
VariablesLookup map[VariableAudience]map[VariablePlatform]map[string]string `json:"-" yaml:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Variable defines a configuration variable.
|
// Variable defines a configuration variable.
|
||||||
|
@ -26,6 +26,17 @@ func (s *Service) ForceFirstRun() {
|
|||||||
s.forceFirstRun = true
|
s.forceFirstRun = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Service) Replace(config Conf) error {
|
||||||
|
if err := config.Overwrite(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace the in-memory config with the new one
|
||||||
|
s.config = config
|
||||||
|
log.Info().Str("filename", configFilename).Msg("in-memory configuration file replaced")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Load parses the flamenco-manager.yaml file, and returns whether this is
|
// Load parses the flamenco-manager.yaml file, and returns whether this is
|
||||||
// likely to be the first run or not.
|
// likely to be the first run or not.
|
||||||
func (s *Service) Load() (bool, error) {
|
func (s *Service) Load() (bool, error) {
|
||||||
|
@ -44,12 +44,12 @@ var _ Forwarder = (*MQTTForwarder)(nil)
|
|||||||
|
|
||||||
// MQTTClientConfig contains the MQTT client configuration.
|
// MQTTClientConfig contains the MQTT client configuration.
|
||||||
type MQTTClientConfig struct {
|
type MQTTClientConfig struct {
|
||||||
BrokerURL string `yaml:"broker"`
|
BrokerURL string `json:"broker" yaml:"broker"`
|
||||||
ClientID string `yaml:"clientID"`
|
ClientID string `json:"clientID" yaml:"clientID"`
|
||||||
TopicPrefix string `yaml:"topic_prefix"`
|
TopicPrefix string `json:"topic_prefix" yaml:"topic_prefix"`
|
||||||
|
|
||||||
Username string `yaml:"username"`
|
Username string `json:"username" yaml:"username"`
|
||||||
Password string `yaml:"password"`
|
Password string `json:"password" yaml:"password"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type mqttQueuedMessage struct {
|
type mqttQueuedMessage struct {
|
||||||
|
40
internal/worker/mocks/client.gen.go
generated
40
internal/worker/mocks/client.gen.go
generated
@ -1456,6 +1456,46 @@ func (mr *MockFlamencoClientMockRecorder) TaskUpdateWithResponse(arg0, arg1, arg
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TaskUpdateWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).TaskUpdateWithResponse), varargs...)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TaskUpdateWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).TaskUpdateWithResponse), varargs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UpdateConfigurationFileWithBodyWithResponse mocks base method.
|
||||||
|
func (m *MockFlamencoClient) UpdateConfigurationFileWithBodyWithResponse(arg0 context.Context, arg1 string, arg2 io.Reader, arg3 ...api.RequestEditorFn) (*api.UpdateConfigurationFileResponse, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
varargs := []interface{}{arg0, arg1, arg2}
|
||||||
|
for _, a := range arg3 {
|
||||||
|
varargs = append(varargs, a)
|
||||||
|
}
|
||||||
|
ret := m.ctrl.Call(m, "UpdateConfigurationFileWithBodyWithResponse", varargs...)
|
||||||
|
ret0, _ := ret[0].(*api.UpdateConfigurationFileResponse)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateConfigurationFileWithBodyWithResponse indicates an expected call of UpdateConfigurationFileWithBodyWithResponse.
|
||||||
|
func (mr *MockFlamencoClientMockRecorder) UpdateConfigurationFileWithBodyWithResponse(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, "UpdateConfigurationFileWithBodyWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).UpdateConfigurationFileWithBodyWithResponse), varargs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateConfigurationFileWithResponse mocks base method.
|
||||||
|
func (m *MockFlamencoClient) UpdateConfigurationFileWithResponse(arg0 context.Context, arg1 api.UpdateConfigurationFileJSONRequestBody, arg2 ...api.RequestEditorFn) (*api.UpdateConfigurationFileResponse, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
varargs := []interface{}{arg0, arg1}
|
||||||
|
for _, a := range arg2 {
|
||||||
|
varargs = append(varargs, a)
|
||||||
|
}
|
||||||
|
ret := m.ctrl.Call(m, "UpdateConfigurationFileWithResponse", varargs...)
|
||||||
|
ret0, _ := ret[0].(*api.UpdateConfigurationFileResponse)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateConfigurationFileWithResponse indicates an expected call of UpdateConfigurationFileWithResponse.
|
||||||
|
func (mr *MockFlamencoClientMockRecorder) UpdateConfigurationFileWithResponse(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, "UpdateConfigurationFileWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).UpdateConfigurationFileWithResponse), varargs...)
|
||||||
|
}
|
||||||
|
|
||||||
// UpdateWorkerTagWithBodyWithResponse mocks base method.
|
// UpdateWorkerTagWithBodyWithResponse mocks base method.
|
||||||
func (m *MockFlamencoClient) UpdateWorkerTagWithBodyWithResponse(arg0 context.Context, arg1, arg2 string, arg3 io.Reader, arg4 ...api.RequestEditorFn) (*api.UpdateWorkerTagResponse, error) {
|
func (m *MockFlamencoClient) UpdateWorkerTagWithBodyWithResponse(arg0 context.Context, arg1, arg2 string, arg3 io.Reader, arg4 ...api.RequestEditorFn) (*api.UpdateWorkerTagResponse, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
|
@ -141,7 +141,26 @@ paths:
|
|||||||
application/yaml:
|
application/yaml:
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
|
put:
|
||||||
|
summary: Overwrites the configuration file. It does not actively reload the new configuration.
|
||||||
|
tags: [meta]
|
||||||
|
operationId: updateConfigurationFile
|
||||||
|
requestBody:
|
||||||
|
description: The configuration values as a JSON
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
description: Currently there is no validation for the request body. The caller must ensure the configuration is valid.
|
||||||
|
responses:
|
||||||
|
"204":
|
||||||
|
description: The configuration was successfully stored to flamenco-manager.yaml
|
||||||
|
default:
|
||||||
|
description: Unable to save the configuration file
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema: { $ref: "#/components/schemas/Error" }
|
||||||
/api/v3/configuration/variables/{audience}/{platform}:
|
/api/v3/configuration/variables/{audience}/{platform}:
|
||||||
summary: Endpoint for getting the variables from Flamenco Manager's configuration.
|
summary: Endpoint for getting the variables from Flamenco Manager's configuration.
|
||||||
get:
|
get:
|
||||||
|
139
pkg/api/openapi_client.gen.go
generated
139
pkg/api/openapi_client.gen.go
generated
@ -111,6 +111,11 @@ type ClientInterface interface {
|
|||||||
// GetConfigurationFile request
|
// GetConfigurationFile request
|
||||||
GetConfigurationFile(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)
|
GetConfigurationFile(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)
|
||||||
|
|
||||||
|
// UpdateConfigurationFile request with any body
|
||||||
|
UpdateConfigurationFileWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error)
|
||||||
|
|
||||||
|
UpdateConfigurationFile(ctx context.Context, body UpdateConfigurationFileJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error)
|
||||||
|
|
||||||
// SaveSetupAssistantConfig request with any body
|
// SaveSetupAssistantConfig request with any body
|
||||||
SaveSetupAssistantConfigWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error)
|
SaveSetupAssistantConfigWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error)
|
||||||
|
|
||||||
@ -384,6 +389,30 @@ func (c *Client) GetConfigurationFile(ctx context.Context, reqEditors ...Request
|
|||||||
return c.Client.Do(req)
|
return c.Client.Do(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Client) UpdateConfigurationFileWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) {
|
||||||
|
req, err := NewUpdateConfigurationFileRequestWithBody(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) UpdateConfigurationFile(ctx context.Context, body UpdateConfigurationFileJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) {
|
||||||
|
req, err := NewUpdateConfigurationFileRequest(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) SaveSetupAssistantConfigWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) {
|
func (c *Client) SaveSetupAssistantConfigWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) {
|
||||||
req, err := NewSaveSetupAssistantConfigRequestWithBody(c.Server, contentType, body)
|
req, err := NewSaveSetupAssistantConfigRequestWithBody(c.Server, contentType, body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1373,6 +1402,46 @@ func NewGetConfigurationFileRequest(server string) (*http.Request, error) {
|
|||||||
return req, nil
|
return req, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewUpdateConfigurationFileRequest calls the generic UpdateConfigurationFile builder with application/json body
|
||||||
|
func NewUpdateConfigurationFileRequest(server string, body UpdateConfigurationFileJSONRequestBody) (*http.Request, error) {
|
||||||
|
var bodyReader io.Reader
|
||||||
|
buf, err := json.Marshal(body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
bodyReader = bytes.NewReader(buf)
|
||||||
|
return NewUpdateConfigurationFileRequestWithBody(server, "application/json", bodyReader)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewUpdateConfigurationFileRequestWithBody generates requests for UpdateConfigurationFile with any type of body
|
||||||
|
func NewUpdateConfigurationFileRequestWithBody(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/file")
|
||||||
|
if operationPath[0] == '/' {
|
||||||
|
operationPath = "." + operationPath
|
||||||
|
}
|
||||||
|
|
||||||
|
queryURL, err := serverURL.Parse(operationPath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := http.NewRequest("PUT", queryURL.String(), body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
req.Header.Add("Content-Type", contentType)
|
||||||
|
|
||||||
|
return req, nil
|
||||||
|
}
|
||||||
|
|
||||||
// NewSaveSetupAssistantConfigRequest calls the generic SaveSetupAssistantConfig builder with application/json body
|
// NewSaveSetupAssistantConfigRequest calls the generic SaveSetupAssistantConfig builder with application/json body
|
||||||
func NewSaveSetupAssistantConfigRequest(server string, body SaveSetupAssistantConfigJSONRequestBody) (*http.Request, error) {
|
func NewSaveSetupAssistantConfigRequest(server string, body SaveSetupAssistantConfigJSONRequestBody) (*http.Request, error) {
|
||||||
var bodyReader io.Reader
|
var bodyReader io.Reader
|
||||||
@ -3296,6 +3365,11 @@ type ClientWithResponsesInterface interface {
|
|||||||
// GetConfigurationFile request
|
// GetConfigurationFile request
|
||||||
GetConfigurationFileWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetConfigurationFileResponse, error)
|
GetConfigurationFileWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetConfigurationFileResponse, error)
|
||||||
|
|
||||||
|
// UpdateConfigurationFile request with any body
|
||||||
|
UpdateConfigurationFileWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateConfigurationFileResponse, error)
|
||||||
|
|
||||||
|
UpdateConfigurationFileWithResponse(ctx context.Context, body UpdateConfigurationFileJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateConfigurationFileResponse, error)
|
||||||
|
|
||||||
// SaveSetupAssistantConfig request with any body
|
// SaveSetupAssistantConfig request with any body
|
||||||
SaveSetupAssistantConfigWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SaveSetupAssistantConfigResponse, error)
|
SaveSetupAssistantConfigWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SaveSetupAssistantConfigResponse, error)
|
||||||
|
|
||||||
@ -3601,6 +3675,28 @@ func (r GetConfigurationFileResponse) StatusCode() int {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type UpdateConfigurationFileResponse struct {
|
||||||
|
Body []byte
|
||||||
|
HTTPResponse *http.Response
|
||||||
|
JSONDefault *Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status returns HTTPResponse.Status
|
||||||
|
func (r UpdateConfigurationFileResponse) Status() string {
|
||||||
|
if r.HTTPResponse != nil {
|
||||||
|
return r.HTTPResponse.Status
|
||||||
|
}
|
||||||
|
return http.StatusText(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// StatusCode returns HTTPResponse.StatusCode
|
||||||
|
func (r UpdateConfigurationFileResponse) StatusCode() int {
|
||||||
|
if r.HTTPResponse != nil {
|
||||||
|
return r.HTTPResponse.StatusCode
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
type SaveSetupAssistantConfigResponse struct {
|
type SaveSetupAssistantConfigResponse struct {
|
||||||
Body []byte
|
Body []byte
|
||||||
HTTPResponse *http.Response
|
HTTPResponse *http.Response
|
||||||
@ -4788,6 +4884,23 @@ func (c *ClientWithResponses) GetConfigurationFileWithResponse(ctx context.Conte
|
|||||||
return ParseGetConfigurationFileResponse(rsp)
|
return ParseGetConfigurationFileResponse(rsp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UpdateConfigurationFileWithBodyWithResponse request with arbitrary body returning *UpdateConfigurationFileResponse
|
||||||
|
func (c *ClientWithResponses) UpdateConfigurationFileWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateConfigurationFileResponse, error) {
|
||||||
|
rsp, err := c.UpdateConfigurationFileWithBody(ctx, contentType, body, reqEditors...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return ParseUpdateConfigurationFileResponse(rsp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *ClientWithResponses) UpdateConfigurationFileWithResponse(ctx context.Context, body UpdateConfigurationFileJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateConfigurationFileResponse, error) {
|
||||||
|
rsp, err := c.UpdateConfigurationFile(ctx, body, reqEditors...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return ParseUpdateConfigurationFileResponse(rsp)
|
||||||
|
}
|
||||||
|
|
||||||
// SaveSetupAssistantConfigWithBodyWithResponse request with arbitrary body returning *SaveSetupAssistantConfigResponse
|
// SaveSetupAssistantConfigWithBodyWithResponse request with arbitrary body returning *SaveSetupAssistantConfigResponse
|
||||||
func (c *ClientWithResponses) SaveSetupAssistantConfigWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SaveSetupAssistantConfigResponse, error) {
|
func (c *ClientWithResponses) SaveSetupAssistantConfigWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SaveSetupAssistantConfigResponse, error) {
|
||||||
rsp, err := c.SaveSetupAssistantConfigWithBody(ctx, contentType, body, reqEditors...)
|
rsp, err := c.SaveSetupAssistantConfigWithBody(ctx, contentType, body, reqEditors...)
|
||||||
@ -5550,6 +5663,32 @@ func ParseGetConfigurationFileResponse(rsp *http.Response) (*GetConfigurationFil
|
|||||||
return response, nil
|
return response, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ParseUpdateConfigurationFileResponse parses an HTTP response from a UpdateConfigurationFileWithResponse call
|
||||||
|
func ParseUpdateConfigurationFileResponse(rsp *http.Response) (*UpdateConfigurationFileResponse, error) {
|
||||||
|
bodyBytes, err := ioutil.ReadAll(rsp.Body)
|
||||||
|
defer func() { _ = rsp.Body.Close() }()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
response := &UpdateConfigurationFileResponse{
|
||||||
|
Body: bodyBytes,
|
||||||
|
HTTPResponse: rsp,
|
||||||
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
// ParseSaveSetupAssistantConfigResponse parses an HTTP response from a SaveSetupAssistantConfigWithResponse call
|
// ParseSaveSetupAssistantConfigResponse parses an HTTP response from a SaveSetupAssistantConfigWithResponse call
|
||||||
func ParseSaveSetupAssistantConfigResponse(rsp *http.Response) (*SaveSetupAssistantConfigResponse, error) {
|
func ParseSaveSetupAssistantConfigResponse(rsp *http.Response) (*SaveSetupAssistantConfigResponse, error) {
|
||||||
bodyBytes, err := ioutil.ReadAll(rsp.Body)
|
bodyBytes, err := ioutil.ReadAll(rsp.Body)
|
||||||
|
13
pkg/api/openapi_server.gen.go
generated
13
pkg/api/openapi_server.gen.go
generated
@ -28,6 +28,9 @@ type ServerInterface interface {
|
|||||||
// Retrieve the configuration of Flamenco Manager.
|
// Retrieve the configuration of Flamenco Manager.
|
||||||
// (GET /api/v3/configuration/file)
|
// (GET /api/v3/configuration/file)
|
||||||
GetConfigurationFile(ctx echo.Context) error
|
GetConfigurationFile(ctx echo.Context) error
|
||||||
|
// Overwrites the configuration file. It does not actively reload the new configuration.
|
||||||
|
// (PUT /api/v3/configuration/file)
|
||||||
|
UpdateConfigurationFile(ctx echo.Context) error
|
||||||
// Update the Manager's configuration, and restart it in fully functional mode.
|
// Update the Manager's configuration, and restart it in fully functional mode.
|
||||||
// (POST /api/v3/configuration/setup-assistant)
|
// (POST /api/v3/configuration/setup-assistant)
|
||||||
SaveSetupAssistantConfig(ctx echo.Context) error
|
SaveSetupAssistantConfig(ctx echo.Context) error
|
||||||
@ -231,6 +234,15 @@ func (w *ServerInterfaceWrapper) GetConfigurationFile(ctx echo.Context) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UpdateConfigurationFile converts echo context to params.
|
||||||
|
func (w *ServerInterfaceWrapper) UpdateConfigurationFile(ctx echo.Context) error {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
// Invoke the callback with all the unmarshalled arguments
|
||||||
|
err = w.Handler.UpdateConfigurationFile(ctx)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// SaveSetupAssistantConfig converts echo context to params.
|
// SaveSetupAssistantConfig converts echo context to params.
|
||||||
func (w *ServerInterfaceWrapper) SaveSetupAssistantConfig(ctx echo.Context) error {
|
func (w *ServerInterfaceWrapper) SaveSetupAssistantConfig(ctx echo.Context) error {
|
||||||
var err error
|
var err error
|
||||||
@ -1007,6 +1019,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
|
|||||||
router.POST(baseURL+"/api/v3/configuration/check/blender", wrapper.CheckBlenderExePath)
|
router.POST(baseURL+"/api/v3/configuration/check/blender", wrapper.CheckBlenderExePath)
|
||||||
router.POST(baseURL+"/api/v3/configuration/check/shared-storage", wrapper.CheckSharedStoragePath)
|
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/file", wrapper.GetConfigurationFile)
|
||||||
|
router.PUT(baseURL+"/api/v3/configuration/file", wrapper.UpdateConfigurationFile)
|
||||||
router.POST(baseURL+"/api/v3/configuration/setup-assistant", wrapper.SaveSetupAssistantConfig)
|
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/shared-storage/:audience/:platform", wrapper.GetSharedStorage)
|
||||||
router.GET(baseURL+"/api/v3/configuration/variables/:audience/:platform", wrapper.GetVariables)
|
router.GET(baseURL+"/api/v3/configuration/variables/:audience/:platform", wrapper.GetVariables)
|
||||||
|
462
pkg/api/openapi_spec.gen.go
generated
462
pkg/api/openapi_spec.gen.go
generated
@ -18,236 +18,238 @@ import (
|
|||||||
// Base64 encoded, gzipped, json marshaled Swagger object
|
// Base64 encoded, gzipped, json marshaled Swagger object
|
||||||
var swaggerSpec = []string{
|
var swaggerSpec = []string{
|
||||||
|
|
||||||
"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",
|
||||||
"/qj6WxIBAA==",
|
"hGoTq+NmEFSnBZTDFM8OIEmlW7vkJzl1ZlKQ0f5WsZIb9KvbXA5bHTDGjcKdKjLo05PjZi/A0EQm87wS",
|
||||||
|
"KG5CTZT20sdtB25kAosNr/2ayNOT42F/r2Rs6Wu2Ye5KKTO3os5k4HSMVOfB8gN+FuATde0EC0Hfn/CD",
|
||||||
|
"nPoidOEcttzB1a9X/xkAAP//EfYh4QEVAQA=",
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSwagger returns the content of the embedded swagger specification file
|
// GetSwagger returns the content of the embedded swagger specification file
|
||||||
|
6
pkg/api/openapi_types.gen.go
generated
6
pkg/api/openapi_types.gen.go
generated
@ -930,6 +930,9 @@ type CheckBlenderExePathJSONBody PathCheckInput
|
|||||||
// CheckSharedStoragePathJSONBody defines parameters for CheckSharedStoragePath.
|
// CheckSharedStoragePathJSONBody defines parameters for CheckSharedStoragePath.
|
||||||
type CheckSharedStoragePathJSONBody PathCheckInput
|
type CheckSharedStoragePathJSONBody PathCheckInput
|
||||||
|
|
||||||
|
// UpdateConfigurationFileJSONBody defines parameters for UpdateConfigurationFile.
|
||||||
|
type UpdateConfigurationFileJSONBody map[string]interface{}
|
||||||
|
|
||||||
// SaveSetupAssistantConfigJSONBody defines parameters for SaveSetupAssistantConfig.
|
// SaveSetupAssistantConfigJSONBody defines parameters for SaveSetupAssistantConfig.
|
||||||
type SaveSetupAssistantConfigJSONBody SetupAssistantConfig
|
type SaveSetupAssistantConfigJSONBody SetupAssistantConfig
|
||||||
|
|
||||||
@ -1002,6 +1005,9 @@ type CheckBlenderExePathJSONRequestBody CheckBlenderExePathJSONBody
|
|||||||
// CheckSharedStoragePathJSONRequestBody defines body for CheckSharedStoragePath for application/json ContentType.
|
// CheckSharedStoragePathJSONRequestBody defines body for CheckSharedStoragePath for application/json ContentType.
|
||||||
type CheckSharedStoragePathJSONRequestBody CheckSharedStoragePathJSONBody
|
type CheckSharedStoragePathJSONRequestBody CheckSharedStoragePathJSONBody
|
||||||
|
|
||||||
|
// UpdateConfigurationFileJSONRequestBody defines body for UpdateConfigurationFile for application/json ContentType.
|
||||||
|
type UpdateConfigurationFileJSONRequestBody UpdateConfigurationFileJSONBody
|
||||||
|
|
||||||
// SaveSetupAssistantConfigJSONRequestBody defines body for SaveSetupAssistantConfig for application/json ContentType.
|
// SaveSetupAssistantConfigJSONRequestBody defines body for SaveSetupAssistantConfig for application/json ContentType.
|
||||||
type SaveSetupAssistantConfigJSONRequestBody SaveSetupAssistantConfigJSONBody
|
type SaveSetupAssistantConfigJSONRequestBody SaveSetupAssistantConfigJSONBody
|
||||||
|
|
||||||
|
@ -43,11 +43,11 @@ const (
|
|||||||
type Config struct {
|
type Config struct {
|
||||||
// Used only for unit tests, so that they know where the temporary
|
// Used only for unit tests, so that they know where the temporary
|
||||||
// directory created for this test is located.
|
// directory created for this test is located.
|
||||||
TestTempDir string `yaml:"-"`
|
TestTempDir string `json:"-" yaml:"-"`
|
||||||
|
|
||||||
Enabled bool `yaml:"enabled"`
|
Enabled bool `json:"enabled" yaml:"enabled"`
|
||||||
StoragePath string `yaml:"-"` // Needs to be set externally, not saved in config.
|
StoragePath string `json:"-" yaml:"-"` // Needs to be set externally, not saved in config.
|
||||||
GarbageCollect GarbageCollect `yaml:"garbageCollect"`
|
GarbageCollect GarbageCollect `json:"garbageCollect" yaml:"garbageCollect"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GarbageCollect contains the config options for the GC.
|
// GarbageCollect contains the config options for the GC.
|
||||||
@ -59,7 +59,7 @@ type GarbageCollect struct {
|
|||||||
|
|
||||||
// Used by the -gc CLI arg to silently disable the garbage collector
|
// Used by the -gc CLI arg to silently disable the garbage collector
|
||||||
// while we're performing a manual sweep.
|
// while we're performing a manual sweep.
|
||||||
SilentlyDisable bool `yaml:"-"`
|
SilentlyDisable bool `json:"-" yaml:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// FileStorePath returns the sub-directory of the configured storage path,
|
// FileStorePath returns the sub-directory of the configured storage path,
|
||||||
|
45
web/app/src/manager-api/manager/MetaApi.js
generated
45
web/app/src/manager-api/manager/MetaApi.js
generated
@ -478,4 +478,49 @@ export default class MetaApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overwrites the configuration file. It does not actively reload the new configuration.
|
||||||
|
* @param {Object.<String, Object>} body The configuration values as a JSON
|
||||||
|
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response
|
||||||
|
*/
|
||||||
|
updateConfigurationFileWithHttpInfo(body) {
|
||||||
|
let postBody = body;
|
||||||
|
// verify the required parameter 'body' is set
|
||||||
|
if (body === undefined || body === null) {
|
||||||
|
throw new Error("Missing the required parameter 'body' when calling updateConfigurationFile");
|
||||||
|
}
|
||||||
|
|
||||||
|
let pathParams = {
|
||||||
|
};
|
||||||
|
let queryParams = {
|
||||||
|
};
|
||||||
|
let headerParams = {
|
||||||
|
};
|
||||||
|
let formParams = {
|
||||||
|
};
|
||||||
|
|
||||||
|
let authNames = [];
|
||||||
|
let contentTypes = ['application/json'];
|
||||||
|
let accepts = ['application/json'];
|
||||||
|
let returnType = null;
|
||||||
|
return this.apiClient.callApi(
|
||||||
|
'/api/v3/configuration/file', 'PUT',
|
||||||
|
pathParams, queryParams, headerParams, formParams, postBody,
|
||||||
|
authNames, contentTypes, accepts, returnType, null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overwrites the configuration file. It does not actively reload the new configuration.
|
||||||
|
* @param {Object.<String, Object>} body The configuration values as a JSON
|
||||||
|
* @return {Promise} a {@link https://www.promisejs.org/|Promise}
|
||||||
|
*/
|
||||||
|
updateConfigurationFile(body) {
|
||||||
|
return this.updateConfigurationFileWithHttpInfo(body)
|
||||||
|
.then(function(response_and_data) {
|
||||||
|
return response_and_data.data;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user