diff --git a/addon/flamenco/manager/__init__.py b/addon/flamenco/manager/__init__.py index f717af80..f2d41019 100644 --- a/addon/flamenco/manager/__init__.py +++ b/addon/flamenco/manager/__init__.py @@ -10,7 +10,7 @@ """ -__version__ = "f2438a89" +__version__ = "7521bff1" # import ApiClient from flamenco.manager.api_client import ApiClient diff --git a/addon/flamenco/manager/api/jobs_api.py b/addon/flamenco/manager/api/jobs_api.py index b46b645e..b89ade53 100644 --- a/addon/flamenco/manager/api/jobs_api.py +++ b/addon/flamenco/manager/api/jobs_api.py @@ -334,6 +334,56 @@ class JobsApi(object): }, api_client=api_client ) + self.fetch_task_log_endpoint = _Endpoint( + settings={ + 'response_type': (str,), + 'auth': [], + 'endpoint_path': '/api/v3/tasks/{task_id}/log', + 'operation_id': 'fetch_task_log', + 'http_method': 'GET', + 'servers': None, + }, + params_map={ + 'all': [ + 'task_id', + ], + 'required': [ + 'task_id', + ], + 'nullable': [ + ], + 'enum': [ + ], + 'validation': [ + ] + }, + root_map={ + 'validations': { + }, + 'allowed_values': { + }, + 'openapi_types': { + 'task_id': + (str,), + }, + 'attribute_map': { + 'task_id': 'task_id', + }, + 'location_map': { + 'task_id': 'path', + }, + 'collection_format_map': { + } + }, + headers_map={ + 'accept': [ + 'text/plain', + 'application/json' + ], + 'content_type': [], + }, + api_client=api_client + ) self.fetch_task_log_tail_endpoint = _Endpoint( settings={ 'response_type': (str,), @@ -1200,6 +1250,83 @@ class JobsApi(object): task_id return self.fetch_task_endpoint.call_with_http_info(**kwargs) + def fetch_task_log( + self, + task_id, + **kwargs + ): + """Fetch the entire task log. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + + >>> thread = api.fetch_task_log(task_id, async_req=True) + >>> result = thread.get() + + Args: + task_id (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: + str + 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 + return self.fetch_task_log_endpoint.call_with_http_info(**kwargs) + def fetch_task_log_tail( self, task_id, diff --git a/addon/flamenco/manager/api_client.py b/addon/flamenco/manager/api_client.py index af3f2136..d056cb9d 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/f2438a89 (Blender add-on)' + self.user_agent = 'Flamenco/7521bff1 (Blender add-on)' def __enter__(self): return self diff --git a/addon/flamenco/manager/configuration.py b/addon/flamenco/manager/configuration.py index 543d4a7f..be5ddc62 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: f2438a89".\ + "SDK Package Version: 7521bff1".\ format(env=sys.platform, pyversion=sys.version) def get_host_settings(self): diff --git a/addon/flamenco/manager/docs/JobsApi.md b/addon/flamenco/manager/docs/JobsApi.md index 0498dde8..8706cb39 100644 --- a/addon/flamenco/manager/docs/JobsApi.md +++ b/addon/flamenco/manager/docs/JobsApi.md @@ -10,6 +10,7 @@ Method | HTTP request | Description [**fetch_job_last_rendered_info**](JobsApi.md#fetch_job_last_rendered_info) | **GET** /api/v3/jobs/{job_id}/last-rendered | Get the URL that serves the last-rendered images of this job. [**fetch_job_tasks**](JobsApi.md#fetch_job_tasks) | **GET** /api/v3/jobs/{job_id}/tasks | Fetch a summary of all tasks of the given job. [**fetch_task**](JobsApi.md#fetch_task) | **GET** /api/v3/tasks/{task_id} | Fetch a single task. +[**fetch_task_log**](JobsApi.md#fetch_task_log) | **GET** /api/v3/tasks/{task_id}/log | Fetch the entire task log. [**fetch_task_log_tail**](JobsApi.md#fetch_task_log_tail) | **GET** /api/v3/tasks/{task_id}/logtail | Fetch the last few lines of the task's log. [**get_job_type**](JobsApi.md#get_job_type) | **GET** /api/v3/jobs/type/{typeName} | Get single job type and its parameters. [**get_job_types**](JobsApi.md#get_job_types) | **GET** /api/v3/jobs/types | Get list of job types and their parameters. @@ -414,6 +415,73 @@ 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) +# **fetch_task_log** +> str fetch_task_log(task_id) + +Fetch the entire task log. + +### Example + + +```python +import time +import flamenco.manager +from flamenco.manager.api import jobs_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 = jobs_api.JobsApi(api_client) + task_id = "task_id_example" # str | + + # example passing only required values which don't have defaults set + try: + # Fetch the entire task log. + api_response = api_instance.fetch_task_log(task_id) + pprint(api_response) + except flamenco.manager.ApiException as e: + print("Exception when calling JobsApi->fetch_task_log: %s\n" % e) +``` + + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **task_id** | **str**| | + +### Return type + +**str** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: text/plain, application/json + + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | The task log. | - | +**204** | Returned when the task has no log yet. | - | +**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) + # **fetch_task_log_tail** > str fetch_task_log_tail(task_id) diff --git a/addon/flamenco/manager_README.md b/addon/flamenco/manager_README.md index 266a8ba4..dc2373de 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: f2438a89 +- Package version: 7521bff1 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://flamenco.io/](https://flamenco.io/) diff --git a/internal/worker/mocks/client.gen.go b/internal/worker/mocks/client.gen.go index c7db040c..70070b07 100644 --- a/internal/worker/mocks/client.gen.go +++ b/internal/worker/mocks/client.gen.go @@ -236,6 +236,26 @@ func (mr *MockFlamencoClientMockRecorder) FetchTaskLogTailWithResponse(arg0, arg return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchTaskLogTailWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).FetchTaskLogTailWithResponse), varargs...) } +// FetchTaskLogWithResponse mocks base method. +func (m *MockFlamencoClient) FetchTaskLogWithResponse(arg0 context.Context, arg1 string, arg2 ...api.RequestEditorFn) (*api.FetchTaskLogResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "FetchTaskLogWithResponse", varargs...) + ret0, _ := ret[0].(*api.FetchTaskLogResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchTaskLogWithResponse indicates an expected call of FetchTaskLogWithResponse. +func (mr *MockFlamencoClientMockRecorder) FetchTaskLogWithResponse(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, "FetchTaskLogWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).FetchTaskLogWithResponse), varargs...) +} + // FetchTaskWithResponse mocks base method. func (m *MockFlamencoClient) FetchTaskWithResponse(arg0 context.Context, arg1 string, arg2 ...api.RequestEditorFn) (*api.FetchTaskResponse, error) { m.ctrl.T.Helper() diff --git a/pkg/api/openapi_client.gen.go b/pkg/api/openapi_client.gen.go index 1fb73926..2cb925d2 100644 --- a/pkg/api/openapi_client.gen.go +++ b/pkg/api/openapi_client.gen.go @@ -179,6 +179,9 @@ type ClientInterface interface { // FetchTask request FetchTask(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // FetchTaskLog request + FetchTaskLog(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // FetchTaskLogTail request FetchTaskLogTail(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -621,6 +624,18 @@ func (c *Client) FetchTask(ctx context.Context, taskId string, reqEditors ...Req return c.Client.Do(req) } +func (c *Client) FetchTaskLog(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewFetchTaskLogRequest(c.Server, taskId) + 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) FetchTaskLogTail(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewFetchTaskLogTailRequest(c.Server, taskId) if err != nil { @@ -1733,6 +1748,40 @@ func NewFetchTaskRequest(server string, taskId string) (*http.Request, error) { return req, nil } +// NewFetchTaskLogRequest generates requests for FetchTaskLog +func NewFetchTaskLogRequest(server string, taskId string) (*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/v3/tasks/%s/log", pathParam0) + 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 +} + // NewFetchTaskLogTailRequest generates requests for FetchTaskLogTail func NewFetchTaskLogTailRequest(server string, taskId string) (*http.Request, error) { var err error @@ -2397,6 +2446,9 @@ type ClientWithResponsesInterface interface { // FetchTask request FetchTaskWithResponse(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*FetchTaskResponse, error) + // FetchTaskLog request + FetchTaskLogWithResponse(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*FetchTaskLogResponse, error) + // FetchTaskLogTail request FetchTaskLogTailWithResponse(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*FetchTaskLogTailResponse, error) @@ -2977,6 +3029,28 @@ func (r FetchTaskResponse) StatusCode() int { return 0 } +type FetchTaskLogResponse struct { + Body []byte + HTTPResponse *http.Response + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r FetchTaskLogResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r FetchTaskLogResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type FetchTaskLogTailResponse struct { Body []byte HTTPResponse *http.Response @@ -3596,6 +3670,15 @@ func (c *ClientWithResponses) FetchTaskWithResponse(ctx context.Context, taskId return ParseFetchTaskResponse(rsp) } +// FetchTaskLogWithResponse request returning *FetchTaskLogResponse +func (c *ClientWithResponses) FetchTaskLogWithResponse(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*FetchTaskLogResponse, error) { + rsp, err := c.FetchTaskLog(ctx, taskId, reqEditors...) + if err != nil { + return nil, err + } + return ParseFetchTaskLogResponse(rsp) +} + // FetchTaskLogTailWithResponse request returning *FetchTaskLogTailResponse func (c *ClientWithResponses) FetchTaskLogTailWithResponse(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*FetchTaskLogTailResponse, error) { rsp, err := c.FetchTaskLogTail(ctx, taskId, reqEditors...) @@ -4477,6 +4560,32 @@ func ParseFetchTaskResponse(rsp *http.Response) (*FetchTaskResponse, error) { return response, nil } +// ParseFetchTaskLogResponse parses an HTTP response from a FetchTaskLogWithResponse call +func ParseFetchTaskLogResponse(rsp *http.Response) (*FetchTaskLogResponse, error) { + bodyBytes, err := ioutil.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &FetchTaskLogResponse{ + 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 +} + // ParseFetchTaskLogTailResponse parses an HTTP response from a FetchTaskLogTailWithResponse call func ParseFetchTaskLogTailResponse(rsp *http.Response) (*FetchTaskLogTailResponse, error) { bodyBytes, err := ioutil.ReadAll(rsp.Body) diff --git a/pkg/api/openapi_server.gen.go b/pkg/api/openapi_server.gen.go index f5752b95..e59de15a 100644 --- a/pkg/api/openapi_server.gen.go +++ b/pkg/api/openapi_server.gen.go @@ -83,6 +83,9 @@ type ServerInterface interface { // Fetch a single task. // (GET /api/v3/tasks/{task_id}) FetchTask(ctx echo.Context, taskId string) error + // Fetch the entire task log. + // (GET /api/v3/tasks/{task_id}/log) + FetchTaskLog(ctx echo.Context, taskId string) error // Fetch the last few lines of the task's log. // (GET /api/v3/tasks/{task_id}/logtail) FetchTaskLogTail(ctx echo.Context, taskId string) error @@ -478,6 +481,22 @@ func (w *ServerInterfaceWrapper) FetchTask(ctx echo.Context) error { return err } +// FetchTaskLog converts echo context to params. +func (w *ServerInterfaceWrapper) FetchTaskLog(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)) + } + + // Invoke the callback with all the unmarshalled arguments + err = w.Handler.FetchTaskLog(ctx, taskId) + return err +} + // FetchTaskLogTail converts echo context to params. func (w *ServerInterfaceWrapper) FetchTaskLogTail(ctx echo.Context) error { var err error @@ -729,6 +748,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.GET(baseURL+"/api/v3/shaman/files/:checksum/:filesize", wrapper.ShamanFileStoreCheck) router.POST(baseURL+"/api/v3/shaman/files/:checksum/:filesize", wrapper.ShamanFileStore) router.GET(baseURL+"/api/v3/tasks/:task_id", wrapper.FetchTask) + router.GET(baseURL+"/api/v3/tasks/:task_id/log", wrapper.FetchTaskLog) router.GET(baseURL+"/api/v3/tasks/:task_id/logtail", wrapper.FetchTaskLogTail) router.POST(baseURL+"/api/v3/tasks/:task_id/setstatus", wrapper.SetTaskStatus) router.GET(baseURL+"/api/v3/version", wrapper.GetVersion) diff --git a/pkg/api/openapi_spec.gen.go b/pkg/api/openapi_spec.gen.go index 43d2cfce..5abea619 100644 --- a/pkg/api/openapi_spec.gen.go +++ b/pkg/api/openapi_spec.gen.go @@ -18,171 +18,172 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "AP//EjDx7WTGAAA=", } // 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 b7628e8c..97027e55 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/f2438a89 / webbrowser' + 'User-Agent': 'Flamenco/7521bff1 / webbrowser' }; /** diff --git a/web/app/src/manager-api/manager/JobsApi.js b/web/app/src/manager-api/manager/JobsApi.js index 858afcfd..3ddead91 100644 --- a/web/app/src/manager-api/manager/JobsApi.js +++ b/web/app/src/manager-api/manager/JobsApi.js @@ -316,6 +316,52 @@ export default class JobsApi { } + /** + * Fetch the entire task log. + * @param {String} taskId + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link String} and HTTP response + */ + fetchTaskLogWithHttpInfo(taskId) { + let postBody = null; + // verify the required parameter 'taskId' is set + if (taskId === undefined || taskId === null) { + throw new Error("Missing the required parameter 'taskId' when calling fetchTaskLog"); + } + + let pathParams = { + 'task_id': taskId + }; + let queryParams = { + }; + let headerParams = { + }; + let formParams = { + }; + + let authNames = []; + let contentTypes = []; + let accepts = ['text/plain', 'application/json']; + let returnType = 'String'; + return this.apiClient.callApi( + '/api/v3/tasks/{task_id}/log', 'GET', + pathParams, queryParams, headerParams, formParams, postBody, + authNames, contentTypes, accepts, returnType, null + ); + } + + /** + * Fetch the entire task log. + * @param {String} taskId + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link String} + */ + fetchTaskLog(taskId) { + return this.fetchTaskLogWithHttpInfo(taskId) + .then(function(response_and_data) { + return response_and_data.data; + }); + } + + /** * Fetch the last few lines of the task's log. * @param {String} taskId