diff --git a/addon/flamenco/manager/__init__.py b/addon/flamenco/manager/__init__.py index 0a2f927e..135bfb3e 100644 --- a/addon/flamenco/manager/__init__.py +++ b/addon/flamenco/manager/__init__.py @@ -10,7 +10,7 @@ """ -__version__ = "3582b199" +__version__ = "41b0ee15" # import ApiClient from flamenco.manager.api_client import ApiClient diff --git a/addon/flamenco/manager/api/worker_api.py b/addon/flamenco/manager/api/worker_api.py index 3fcaed1d..29720fca 100644 --- a/addon/flamenco/manager/api/worker_api.py +++ b/addon/flamenco/manager/api/worker_api.py @@ -285,6 +285,65 @@ class WorkerApi(object): }, api_client=api_client ) + self.task_output_produced_endpoint = _Endpoint( + settings={ + 'response_type': None, + 'auth': [ + 'worker_auth' + ], + 'endpoint_path': '/api/worker/task/{task_id}/output-produced', + 'operation_id': 'task_output_produced', + 'http_method': 'POST', + 'servers': None, + }, + params_map={ + 'all': [ + 'task_id', + 'body', + ], + 'required': [ + 'task_id', + 'body', + ], + 'nullable': [ + ], + 'enum': [ + ], + 'validation': [ + ] + }, + root_map={ + 'validations': { + }, + 'allowed_values': { + }, + 'openapi_types': { + 'task_id': + (str,), + 'body': + (file_type,), + }, + 'attribute_map': { + 'task_id': 'task_id', + }, + 'location_map': { + 'task_id': 'path', + 'body': 'body', + }, + 'collection_format_map': { + } + }, + headers_map={ + 'accept': [ + 'application/json' + ], + 'content_type': [ + 'image/jpeg', + 'image/png' + ] + }, + api_client=api_client + ) self.task_update_endpoint = _Endpoint( settings={ 'response_type': None, @@ -815,6 +874,87 @@ class WorkerApi(object): worker_sign_on return self.sign_on_endpoint.call_with_http_info(**kwargs) + def task_output_produced( + self, + task_id, + body, + **kwargs + ): + """Store the most recently rendered frame here. Note that it is up to the Worker to ensure this is in a format that's digestable by the Manager. Currently only PNG and JPEG support is planned. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + + >>> thread = api.task_output_produced(task_id, body, async_req=True) + >>> result = thread.get() + + Args: + task_id (str): + body (file_type): Contents of the file + + 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['task_id'] = \ + task_id + kwargs['body'] = \ + body + return self.task_output_produced_endpoint.call_with_http_info(**kwargs) + def task_update( self, task_id, diff --git a/addon/flamenco/manager/api_client.py b/addon/flamenco/manager/api_client.py index de4c0aba..c4832e14 100644 --- a/addon/flamenco/manager/api_client.py +++ b/addon/flamenco/manager/api_client.py @@ -76,7 +76,7 @@ class ApiClient(object): self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = 'Flamenco/3582b199 (Blender add-on)' + self.user_agent = 'Flamenco/41b0ee15 (Blender add-on)' def __enter__(self): return self diff --git a/addon/flamenco/manager/configuration.py b/addon/flamenco/manager/configuration.py index 0ffeab02..f90f6817 100644 --- a/addon/flamenco/manager/configuration.py +++ b/addon/flamenco/manager/configuration.py @@ -404,7 +404,7 @@ conf = flamenco.manager.Configuration( "OS: {env}\n"\ "Python Version: {pyversion}\n"\ "Version of the API: 1.0.0\n"\ - "SDK Package Version: 3582b199".\ + "SDK Package Version: 41b0ee15".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self): diff --git a/addon/flamenco/manager/docs/WorkerApi.md b/addon/flamenco/manager/docs/WorkerApi.md index bbe3731e..8702c0e3 100644 --- a/addon/flamenco/manager/docs/WorkerApi.md +++ b/addon/flamenco/manager/docs/WorkerApi.md @@ -9,6 +9,7 @@ Method | HTTP request | Description [**schedule_task**](WorkerApi.md#schedule_task) | **POST** /api/worker/task | Obtain a new task to execute [**sign_off**](WorkerApi.md#sign_off) | **POST** /api/worker/sign-off | Mark the worker as offline [**sign_on**](WorkerApi.md#sign_on) | **POST** /api/worker/sign-on | Authenticate & sign in the worker. +[**task_output_produced**](WorkerApi.md#task_output_produced) | **POST** /api/worker/task/{task_id}/output-produced | Store the most recently rendered frame here. Note that it is up to the Worker to ensure this is in a format that's digestable by the Manager. Currently only PNG and JPEG support is planned. [**task_update**](WorkerApi.md#task_update) | **POST** /api/worker/task/{task_id} | Update the task, typically to indicate progress, completion, or failure. [**worker_state**](WorkerApi.md#worker_state) | **GET** /api/worker/state | [**worker_state_changed**](WorkerApi.md#worker_state_changed) | **POST** /api/worker/state-changed | Worker changed state. This could be as acknowledgement of a Manager-requested state change, or in response to worker-local signals. @@ -402,6 +403,88 @@ Name | Type | Description | Notes [[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) +# **task_output_produced** +> task_output_produced(task_id, body) + +Store the most recently rendered frame here. Note that it is up to the Worker to ensure this is in a format that's digestable by the Manager. Currently only PNG and JPEG support is planned. + +### Example + +* Basic Authentication (worker_auth): + +```python +import time +import flamenco.manager +from flamenco.manager.api import worker_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" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +# Configure HTTP basic authorization: worker_auth +configuration = flamenco.manager.Configuration( + username = 'YOUR_USERNAME', + password = 'YOUR_PASSWORD' +) + +# Enter a context with an instance of the API client +with flamenco.manager.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = worker_api.WorkerApi(api_client) + task_id = "task_id_example" # str | + body = open('/path/to/file', 'rb') # file_type | Contents of the file + + # example passing only required values which don't have defaults set + try: + # Store the most recently rendered frame here. Note that it is up to the Worker to ensure this is in a format that's digestable by the Manager. Currently only PNG and JPEG support is planned. + api_instance.task_output_produced(task_id, body) + except flamenco.manager.ApiException as e: + print("Exception when calling WorkerApi->task_output_produced: %s\n" % e) +``` + + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **task_id** | **str**| | + **body** | **file_type**| Contents of the file | + +### Return type + +void (empty response body) + +### Authorization + +[worker_auth](../README.md#worker_auth) + +### HTTP request headers + + - **Content-Type**: image/jpeg, image/png + - **Accept**: application/json + + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**202** | The file was accepted for processing. | - | +**411** | Length required; the client did not send a Content-Length header. | - | +**413** | Payload too large. | - | +**415** | Unsupported Media Type, the image format cannot be processed by the Manager. | - | +**429** | The client is sending too many frames, and should throttle itself. | - | +**0** | unexpected error | - | + +[[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) + # **task_update** > task_update(task_id, task_update) diff --git a/addon/flamenco/manager_README.md b/addon/flamenco/manager_README.md index 0feb90cf..4f845de7 100644 --- a/addon/flamenco/manager_README.md +++ b/addon/flamenco/manager_README.md @@ -4,7 +4,7 @@ Render Farm manager API The `flamenco.manager` package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0.0 -- Package version: 3582b199 +- Package version: 41b0ee15 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://flamenco.io/](https://flamenco.io/) @@ -92,6 +92,7 @@ Class | Method | HTTP request | Description *WorkerApi* | [**schedule_task**](flamenco/manager/docs/WorkerApi.md#schedule_task) | **POST** /api/worker/task | Obtain a new task to execute *WorkerApi* | [**sign_off**](flamenco/manager/docs/WorkerApi.md#sign_off) | **POST** /api/worker/sign-off | Mark the worker as offline *WorkerApi* | [**sign_on**](flamenco/manager/docs/WorkerApi.md#sign_on) | **POST** /api/worker/sign-on | Authenticate & sign in the worker. +*WorkerApi* | [**task_output_produced**](flamenco/manager/docs/WorkerApi.md#task_output_produced) | **POST** /api/worker/task/{task_id}/output-produced | Store the most recently rendered frame here. Note that it is up to the Worker to ensure this is in a format that's digestable by the Manager. Currently only PNG and JPEG support is planned. *WorkerApi* | [**task_update**](flamenco/manager/docs/WorkerApi.md#task_update) | **POST** /api/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/worker/state | *WorkerApi* | [**worker_state_changed**](flamenco/manager/docs/WorkerApi.md#worker_state_changed) | **POST** /api/worker/state-changed | Worker changed state. This could be as acknowledgement of a Manager-requested state change, or in response to worker-local signals. diff --git a/internal/worker/mocks/client.gen.go b/internal/worker/mocks/client.gen.go index 0529138d..bd359ecf 100644 --- a/internal/worker/mocks/client.gen.go +++ b/internal/worker/mocks/client.gen.go @@ -696,6 +696,26 @@ func (mr *MockFlamencoClientMockRecorder) SubmitJobWithResponse(arg0, arg1 inter return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubmitJobWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).SubmitJobWithResponse), varargs...) } +// TaskOutputProducedWithBodyWithResponse mocks base method. +func (m *MockFlamencoClient) TaskOutputProducedWithBodyWithResponse(arg0 context.Context, arg1, arg2 string, arg3 io.Reader, arg4 ...api.RequestEditorFn) (*api.TaskOutputProducedResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1, arg2, arg3} + for _, a := range arg4 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "TaskOutputProducedWithBodyWithResponse", varargs...) + ret0, _ := ret[0].(*api.TaskOutputProducedResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// TaskOutputProducedWithBodyWithResponse indicates an expected call of TaskOutputProducedWithBodyWithResponse. +func (mr *MockFlamencoClientMockRecorder) TaskOutputProducedWithBodyWithResponse(arg0, arg1, arg2, arg3 interface{}, arg4 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1, arg2, arg3}, arg4...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TaskOutputProducedWithBodyWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).TaskOutputProducedWithBodyWithResponse), varargs...) +} + // TaskUpdateWithBodyWithResponse mocks base method. func (m *MockFlamencoClient) TaskUpdateWithBodyWithResponse(arg0 context.Context, arg1, arg2 string, arg3 io.Reader, arg4 ...api.RequestEditorFn) (*api.TaskUpdateResponse, error) { m.ctrl.T.Helper() diff --git a/pkg/api/openapi_client.gen.go b/pkg/api/openapi_client.gen.go index 58d0942f..fa1d4459 100644 --- a/pkg/api/openapi_client.gen.go +++ b/pkg/api/openapi_client.gen.go @@ -177,6 +177,9 @@ type ClientInterface interface { // MayWorkerRun request MayWorkerRun(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // TaskOutputProduced request with any body + TaskOutputProducedWithBody(ctx context.Context, taskId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + // ShamanCheckout request with any body ShamanCheckoutWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -578,6 +581,18 @@ func (c *Client) MayWorkerRun(ctx context.Context, taskId string, reqEditors ... return c.Client.Do(req) } +func (c *Client) TaskOutputProducedWithBody(ctx context.Context, taskId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewTaskOutputProducedRequestWithBody(c.Server, taskId, 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) ShamanCheckoutWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewShamanCheckoutRequestWithBody(c.Server, contentType, body) if err != nil { @@ -1465,6 +1480,42 @@ func NewMayWorkerRunRequest(server string, taskId string) (*http.Request, error) return req, nil } +// NewTaskOutputProducedRequestWithBody generates requests for TaskOutputProduced with any type of body +func NewTaskOutputProducedRequestWithBody(server string, taskId string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "task_id", runtime.ParamLocationPath, taskId) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/worker/task/%s/output-produced", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + // NewShamanCheckoutRequest calls the generic ShamanCheckout builder with application/json body func NewShamanCheckoutRequest(server string, body ShamanCheckoutJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader @@ -1781,6 +1832,9 @@ type ClientWithResponsesInterface interface { // MayWorkerRun request MayWorkerRunWithResponse(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*MayWorkerRunResponse, error) + // TaskOutputProduced request with any body + TaskOutputProducedWithBodyWithResponse(ctx context.Context, taskId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*TaskOutputProducedResponse, error) + // ShamanCheckout request with any body ShamanCheckoutWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ShamanCheckoutResponse, error) @@ -2314,6 +2368,32 @@ func (r MayWorkerRunResponse) StatusCode() int { return 0 } +type TaskOutputProducedResponse struct { + Body []byte + HTTPResponse *http.Response + JSON411 *Error + JSON413 *Error + JSON415 *Error + JSON429 *Error + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r TaskOutputProducedResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r TaskOutputProducedResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type ShamanCheckoutResponse struct { Body []byte HTTPResponse *http.Response @@ -2686,6 +2766,15 @@ func (c *ClientWithResponses) MayWorkerRunWithResponse(ctx context.Context, task return ParseMayWorkerRunResponse(rsp) } +// TaskOutputProducedWithBodyWithResponse request with arbitrary body returning *TaskOutputProducedResponse +func (c *ClientWithResponses) TaskOutputProducedWithBodyWithResponse(ctx context.Context, taskId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*TaskOutputProducedResponse, error) { + rsp, err := c.TaskOutputProducedWithBody(ctx, taskId, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseTaskOutputProducedResponse(rsp) +} + // ShamanCheckoutWithBodyWithResponse request with arbitrary body returning *ShamanCheckoutResponse func (c *ClientWithResponses) ShamanCheckoutWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*ShamanCheckoutResponse, error) { rsp, err := c.ShamanCheckoutWithBody(ctx, contentType, body, reqEditors...) @@ -3406,6 +3495,60 @@ func ParseMayWorkerRunResponse(rsp *http.Response) (*MayWorkerRunResponse, error return response, nil } +// ParseTaskOutputProducedResponse parses an HTTP response from a TaskOutputProducedWithResponse call +func ParseTaskOutputProducedResponse(rsp *http.Response) (*TaskOutputProducedResponse, error) { + bodyBytes, err := ioutil.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &TaskOutputProducedResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 411: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON411 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 413: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON413 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 415: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON415 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 429: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON429 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + // ParseShamanCheckoutResponse parses an HTTP response from a ShamanCheckoutWithResponse call func ParseShamanCheckoutResponse(rsp *http.Response) (*ShamanCheckoutResponse, error) { bodyBytes, err := ioutil.ReadAll(rsp.Body) diff --git a/pkg/api/openapi_server.gen.go b/pkg/api/openapi_server.gen.go index f0bd5102..e2031a1c 100644 --- a/pkg/api/openapi_server.gen.go +++ b/pkg/api/openapi_server.gen.go @@ -82,6 +82,9 @@ type ServerInterface interface { // The response indicates whether the worker is allowed to run / keep running the task. Optionally contains a queued worker status change. // (GET /api/worker/task/{task_id}/may-i-run) MayWorkerRun(ctx echo.Context, taskId string) error + // Store the most recently rendered frame here. Note that it is up to the Worker to ensure this is in a format that's digestable by the Manager. Currently only PNG and JPEG support is planned. + // (POST /api/worker/task/{task_id}/output-produced) + TaskOutputProduced(ctx echo.Context, taskId string) error // Create a directory, and symlink the required files into it. The files must all have been uploaded to Shaman before calling this endpoint. // (POST /shaman/checkout/create) ShamanCheckout(ctx echo.Context) error @@ -400,6 +403,24 @@ func (w *ServerInterfaceWrapper) MayWorkerRun(ctx echo.Context) error { return err } +// TaskOutputProduced converts echo context to params. +func (w *ServerInterfaceWrapper) TaskOutputProduced(ctx echo.Context) error { + var err error + // ------------- Path parameter "task_id" ------------- + var taskId string + + err = runtime.BindStyledParameterWithLocation("simple", false, "task_id", runtime.ParamLocationPath, ctx.Param("task_id"), &taskId) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter task_id: %s", err)) + } + + ctx.Set(Worker_authScopes, []string{""}) + + // Invoke the callback with all the unmarshalled arguments + err = w.Handler.TaskOutputProduced(ctx, taskId) + return err +} + // ShamanCheckout converts echo context to params. func (w *ServerInterfaceWrapper) ShamanCheckout(ctx echo.Context) error { var err error @@ -552,6 +573,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.POST(baseURL+"/api/worker/task", wrapper.ScheduleTask) router.POST(baseURL+"/api/worker/task/:task_id", wrapper.TaskUpdate) router.GET(baseURL+"/api/worker/task/:task_id/may-i-run", wrapper.MayWorkerRun) + router.POST(baseURL+"/api/worker/task/:task_id/output-produced", wrapper.TaskOutputProduced) router.POST(baseURL+"/shaman/checkout/create", wrapper.ShamanCheckout) router.POST(baseURL+"/shaman/checkout/requirements", wrapper.ShamanCheckoutRequirements) router.GET(baseURL+"/shaman/files/:checksum/:filesize", wrapper.ShamanFileStoreCheck) diff --git a/pkg/api/openapi_spec.gen.go b/pkg/api/openapi_spec.gen.go index 6ead4ba8..1649ae8d 100644 --- a/pkg/api/openapi_spec.gen.go +++ b/pkg/api/openapi_spec.gen.go @@ -18,139 +18,144 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/web/app/src/manager-api/ApiClient.js b/web/app/src/manager-api/ApiClient.js index 2ec6c298..482fc957 100644 --- a/web/app/src/manager-api/ApiClient.js +++ b/web/app/src/manager-api/ApiClient.js @@ -55,7 +55,7 @@ class ApiClient { * @default {} */ this.defaultHeaders = { - 'User-Agent': 'Flamenco/3582b199 / webbrowser' + 'User-Agent': 'Flamenco/41b0ee15 / webbrowser' }; /** diff --git a/web/app/src/manager-api/manager/WorkerApi.js b/web/app/src/manager-api/manager/WorkerApi.js index e603d16c..2f68a1af 100644 --- a/web/app/src/manager-api/manager/WorkerApi.js +++ b/web/app/src/manager-api/manager/WorkerApi.js @@ -258,6 +258,58 @@ export default class WorkerApi { } + /** + * Store the most recently rendered frame here. Note that it is up to the Worker to ensure this is in a format that's digestable by the Manager. Currently only PNG and JPEG support is planned. + * @param {String} taskId + * @param {File} body Contents of the file + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response + */ + taskOutputProducedWithHttpInfo(taskId, body) { + let postBody = body; + // verify the required parameter 'taskId' is set + if (taskId === undefined || taskId === null) { + throw new Error("Missing the required parameter 'taskId' when calling taskOutputProduced"); + } + // verify the required parameter 'body' is set + if (body === undefined || body === null) { + throw new Error("Missing the required parameter 'body' when calling taskOutputProduced"); + } + + let pathParams = { + 'task_id': taskId + }; + let queryParams = { + }; + let headerParams = { + }; + let formParams = { + }; + + let authNames = ['worker_auth']; + let contentTypes = ['image/jpeg', 'image/png']; + let accepts = ['application/json']; + let returnType = null; + return this.apiClient.callApi( + '/api/worker/task/{task_id}/output-produced', 'POST', + pathParams, queryParams, headerParams, formParams, postBody, + authNames, contentTypes, accepts, returnType, null + ); + } + + /** + * Store the most recently rendered frame here. Note that it is up to the Worker to ensure this is in a format that's digestable by the Manager. Currently only PNG and JPEG support is planned. + * @param {String} taskId + * @param {File} body Contents of the file + * @return {Promise} a {@link https://www.promisejs.org/|Promise} + */ + taskOutputProduced(taskId, body) { + return this.taskOutputProducedWithHttpInfo(taskId, body) + .then(function(response_and_data) { + return response_and_data.data; + }); + } + + /** * Update the task, typically to indicate progress, completion, or failure. * @param {String} taskId