From bb7ac8319f8affb1c396c434185d46dd9cd83b9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Fri, 20 May 2022 16:30:42 +0200 Subject: [PATCH] OAPI: regenerate code --- addon/flamenco/manager/__init__.py | 2 +- addon/flamenco/manager/api/jobs_api.py | 127 +++++++++++ addon/flamenco/manager/api_client.py | 2 +- addon/flamenco/manager/configuration.py | 2 +- addon/flamenco/manager/docs/JobsApi.md | 67 ++++++ addon/flamenco/manager_README.md | 3 +- internal/worker/mocks/client.gen.go | 20 ++ pkg/api/openapi_client.gen.go | 109 +++++++++ pkg/api/openapi_server.gen.go | 20 ++ pkg/api/openapi_spec.gen.go | 249 +++++++++++---------- web/app/src/manager-api/ApiClient.js | 2 +- web/app/src/manager-api/manager/JobsApi.js | 46 ++++ 12 files changed, 520 insertions(+), 129 deletions(-) diff --git a/addon/flamenco/manager/__init__.py b/addon/flamenco/manager/__init__.py index d5dc34b4..4783f4b6 100644 --- a/addon/flamenco/manager/__init__.py +++ b/addon/flamenco/manager/__init__.py @@ -10,7 +10,7 @@ """ -__version__ = "a32261e1" +__version__ = "fc741957" # 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 d27435ae..a0284a15 100644 --- a/addon/flamenco/manager/api/jobs_api.py +++ b/addon/flamenco/manager/api/jobs_api.py @@ -192,6 +192,56 @@ class JobsApi(object): }, api_client=api_client ) + self.fetch_task_log_tail_endpoint = _Endpoint( + settings={ + 'response_type': ([str],), + 'auth': [], + 'endpoint_path': '/api/tasks/{task_id}/logtail', + 'operation_id': 'fetch_task_log_tail', + '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.get_job_type_endpoint = _Endpoint( settings={ 'response_type': (AvailableJobType,), @@ -727,6 +777,83 @@ class JobsApi(object): task_id return self.fetch_task_endpoint.call_with_http_info(**kwargs) + def fetch_task_log_tail( + self, + task_id, + **kwargs + ): + """Fetch the last few lines of the task's 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_tail(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_tail_endpoint.call_with_http_info(**kwargs) + def get_job_type( self, type_name, diff --git a/addon/flamenco/manager/api_client.py b/addon/flamenco/manager/api_client.py index 0d4a2df8..f0959e36 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/a32261e1 (Blender add-on)' + self.user_agent = 'Flamenco/fc741957 (Blender add-on)' def __enter__(self): return self diff --git a/addon/flamenco/manager/configuration.py b/addon/flamenco/manager/configuration.py index 08520d2c..143ff34a 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: a32261e1".\ + "SDK Package Version: fc741957".\ 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 a8f37b56..67000882 100644 --- a/addon/flamenco/manager/docs/JobsApi.md +++ b/addon/flamenco/manager/docs/JobsApi.md @@ -7,6 +7,7 @@ Method | HTTP request | Description [**fetch_job**](JobsApi.md#fetch_job) | **GET** /api/jobs/{job_id} | Fetch info about the job. [**fetch_job_tasks**](JobsApi.md#fetch_job_tasks) | **GET** /api/jobs/{job_id}/tasks | Fetch a summary of all tasks of the given job. [**fetch_task**](JobsApi.md#fetch_task) | **GET** /api/tasks/{task_id} | Fetch a single task. +[**fetch_task_log_tail**](JobsApi.md#fetch_task_log_tail) | **GET** /api/tasks/{task_id}/logtail | Fetch the last few lines of the task's log. [**get_job_type**](JobsApi.md#get_job_type) | **GET** /api/jobs/type/{typeName} | Get single job type and its parameters. [**get_job_types**](JobsApi.md#get_job_types) | **GET** /api/jobs/types | Get list of job types and their parameters. [**query_jobs**](JobsApi.md#query_jobs) | **POST** /api/jobs/query | Fetch list of jobs. @@ -214,6 +215,72 @@ 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_tail** +> [str] fetch_task_log_tail(task_id) + +Fetch the last few lines of the task's 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 last few lines of the task's log. + api_response = api_instance.fetch_task_log_tail(task_id) + pprint(api_response) + except flamenco.manager.ApiException as e: + print("Exception when calling JobsApi->fetch_task_log_tail: %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. | - | +**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) + # **get_job_type** > AvailableJobType get_job_type(type_name) diff --git a/addon/flamenco/manager_README.md b/addon/flamenco/manager_README.md index 882d38f5..99db25c3 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: a32261e1 +- Package version: fc741957 - Build package: org.openapitools.codegen.languages.PythonClientCodegen For more information, please visit [https://flamenco.io/](https://flamenco.io/) @@ -74,6 +74,7 @@ Class | Method | HTTP request | Description *JobsApi* | [**fetch_job**](flamenco/manager/docs/JobsApi.md#fetch_job) | **GET** /api/jobs/{job_id} | Fetch info about the job. *JobsApi* | [**fetch_job_tasks**](flamenco/manager/docs/JobsApi.md#fetch_job_tasks) | **GET** /api/jobs/{job_id}/tasks | Fetch a summary of all tasks of the given job. *JobsApi* | [**fetch_task**](flamenco/manager/docs/JobsApi.md#fetch_task) | **GET** /api/tasks/{task_id} | Fetch a single task. +*JobsApi* | [**fetch_task_log_tail**](flamenco/manager/docs/JobsApi.md#fetch_task_log_tail) | **GET** /api/tasks/{task_id}/logtail | Fetch the last few lines of the task's log. *JobsApi* | [**get_job_type**](flamenco/manager/docs/JobsApi.md#get_job_type) | **GET** /api/jobs/type/{typeName} | Get single job type and its parameters. *JobsApi* | [**get_job_types**](flamenco/manager/docs/JobsApi.md#get_job_types) | **GET** /api/jobs/types | Get list of job types and their parameters. *JobsApi* | [**query_jobs**](flamenco/manager/docs/JobsApi.md#query_jobs) | **POST** /api/jobs/query | Fetch list of jobs. diff --git a/internal/worker/mocks/client.gen.go b/internal/worker/mocks/client.gen.go index 222e2e9d..75ab6a0a 100644 --- a/internal/worker/mocks/client.gen.go +++ b/internal/worker/mocks/client.gen.go @@ -76,6 +76,26 @@ func (mr *MockFlamencoClientMockRecorder) FetchJobWithResponse(arg0, arg1 interf return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchJobWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).FetchJobWithResponse), varargs...) } +// FetchTaskLogTailWithResponse mocks base method. +func (m *MockFlamencoClient) FetchTaskLogTailWithResponse(arg0 context.Context, arg1 string, arg2 ...api.RequestEditorFn) (*api.FetchTaskLogTailResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "FetchTaskLogTailWithResponse", varargs...) + ret0, _ := ret[0].(*api.FetchTaskLogTailResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FetchTaskLogTailWithResponse indicates an expected call of FetchTaskLogTailWithResponse. +func (mr *MockFlamencoClientMockRecorder) FetchTaskLogTailWithResponse(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, "FetchTaskLogTailWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).FetchTaskLogTailWithResponse), 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 6633e6af..58343e88 100644 --- a/pkg/api/openapi_client.gen.go +++ b/pkg/api/openapi_client.gen.go @@ -123,6 +123,9 @@ type ClientInterface interface { // FetchTask request FetchTask(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // FetchTaskLogTail request + FetchTaskLogTail(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // SetTaskStatus request with any body SetTaskStatusWithBody(ctx context.Context, taskId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -324,6 +327,18 @@ func (c *Client) FetchTask(ctx context.Context, taskId string, reqEditors ...Req 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 { + 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) SetTaskStatusWithBody(ctx context.Context, taskId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewSetTaskStatusRequestWithBody(c.Server, taskId, contentType, body) if err != nil { @@ -893,6 +908,40 @@ func NewFetchTaskRequest(server string, taskId string) (*http.Request, error) { return req, nil } +// NewFetchTaskLogTailRequest generates requests for FetchTaskLogTail +func NewFetchTaskLogTailRequest(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/tasks/%s/logtail", 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 +} + // NewSetTaskStatusRequest calls the generic SetTaskStatus builder with application/json body func NewSetTaskStatusRequest(server string, taskId string, body SetTaskStatusJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader @@ -1511,6 +1560,9 @@ type ClientWithResponsesInterface interface { // FetchTask request FetchTaskWithResponse(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*FetchTaskResponse, error) + // FetchTaskLogTail request + FetchTaskLogTailWithResponse(ctx context.Context, taskId string, reqEditors ...RequestEditorFn) (*FetchTaskLogTailResponse, error) + // SetTaskStatus request with any body SetTaskStatusWithBodyWithResponse(ctx context.Context, taskId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SetTaskStatusResponse, error) @@ -1770,6 +1822,28 @@ func (r FetchTaskResponse) StatusCode() int { return 0 } +type FetchTaskLogTailResponse struct { + Body []byte + HTTPResponse *http.Response + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r FetchTaskLogTailResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r FetchTaskLogTailResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type SetTaskStatusResponse struct { Body []byte HTTPResponse *http.Response @@ -2194,6 +2268,15 @@ func (c *ClientWithResponses) FetchTaskWithResponse(ctx context.Context, taskId return ParseFetchTaskResponse(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...) + if err != nil { + return nil, err + } + return ParseFetchTaskLogTailResponse(rsp) +} + // SetTaskStatusWithBodyWithResponse request with arbitrary body returning *SetTaskStatusResponse func (c *ClientWithResponses) SetTaskStatusWithBodyWithResponse(ctx context.Context, taskId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SetTaskStatusResponse, error) { rsp, err := c.SetTaskStatusWithBody(ctx, taskId, contentType, body, reqEditors...) @@ -2638,6 +2721,32 @@ func ParseFetchTaskResponse(rsp *http.Response) (*FetchTaskResponse, error) { 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) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &FetchTaskLogTailResponse{ + 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 +} + // ParseSetTaskStatusResponse parses an HTTP response from a SetTaskStatusWithResponse call func ParseSetTaskStatusResponse(rsp *http.Response) (*SetTaskStatusResponse, error) { bodyBytes, err := ioutil.ReadAll(rsp.Body) diff --git a/pkg/api/openapi_server.gen.go b/pkg/api/openapi_server.gen.go index 38807bcb..c6cf962b 100644 --- a/pkg/api/openapi_server.gen.go +++ b/pkg/api/openapi_server.gen.go @@ -40,6 +40,9 @@ type ServerInterface interface { // Fetch a single task. // (GET /api/tasks/{task_id}) FetchTask(ctx echo.Context, taskId string) error + // Fetch the last few lines of the task's log. + // (GET /api/tasks/{task_id}/logtail) + FetchTaskLogTail(ctx echo.Context, taskId string) error // (POST /api/tasks/{task_id}/setstatus) SetTaskStatus(ctx echo.Context, taskId string) error @@ -206,6 +209,22 @@ func (w *ServerInterfaceWrapper) FetchTask(ctx echo.Context) error { return err } +// FetchTaskLogTail converts echo context to params. +func (w *ServerInterfaceWrapper) FetchTaskLogTail(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.FetchTaskLogTail(ctx, taskId) + return err +} + // SetTaskStatus converts echo context to params. func (w *ServerInterfaceWrapper) SetTaskStatus(ctx echo.Context) error { var err error @@ -469,6 +488,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.POST(baseURL+"/api/jobs/:job_id/setstatus", wrapper.SetJobStatus) router.GET(baseURL+"/api/jobs/:job_id/tasks", wrapper.FetchJobTasks) router.GET(baseURL+"/api/tasks/:task_id", wrapper.FetchTask) + router.GET(baseURL+"/api/tasks/:task_id/logtail", wrapper.FetchTaskLogTail) router.POST(baseURL+"/api/tasks/:task_id/setstatus", wrapper.SetTaskStatus) router.GET(baseURL+"/api/version", wrapper.GetVersion) router.POST(baseURL+"/api/worker/register-worker", wrapper.RegisterWorker) diff --git a/pkg/api/openapi_spec.gen.go b/pkg/api/openapi_spec.gen.go index 81ad9f83..4b3ce228 100644 --- a/pkg/api/openapi_spec.gen.go +++ b/pkg/api/openapi_spec.gen.go @@ -18,130 +18,131 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "+98AAAD//7kw6+xfhwAA", + "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", + "vN6/fv+fAQAA//9yw0W9jIkAAA==", } // 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 4f27f1cb..3e7f7acf 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/a32261e1 / webbrowser' + 'User-Agent': 'Flamenco/fc741957 / webbrowser' }; /** diff --git a/web/app/src/manager-api/manager/JobsApi.js b/web/app/src/manager-api/manager/JobsApi.js index 273e00ea..87308d3b 100644 --- a/web/app/src/manager-api/manager/JobsApi.js +++ b/web/app/src/manager-api/manager/JobsApi.js @@ -183,6 +183,52 @@ export default class JobsApi { } + /** + * Fetch the last few lines of the task's log. + * @param {String} taskId + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link Array.} and HTTP response + */ + fetchTaskLogTailWithHttpInfo(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 fetchTaskLogTail"); + } + + 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/tasks/{task_id}/logtail', 'GET', + pathParams, queryParams, headerParams, formParams, postBody, + authNames, contentTypes, accepts, returnType, null + ); + } + + /** + * Fetch the last few lines of the task's log. + * @param {String} taskId + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link Array.} + */ + fetchTaskLogTail(taskId) { + return this.fetchTaskLogTailWithHttpInfo(taskId) + .then(function(response_and_data) { + return response_and_data.data; + }); + } + + /** * Get single job type and its parameters. * @param {String} typeName