From 458c33573e989c206d0059a141f8786a49bc1ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Thu, 11 Aug 2022 16:57:51 -0700 Subject: [PATCH] OAPI: regenerate code --- addon/flamenco/manager/api/worker_mgt_api.py | 126 +++++++++++ .../manager/docs/SocketIOWorkerUpdate.md | 1 + addon/flamenco/manager/docs/WorkerMgtApi.md | 66 ++++++ .../manager/model/socket_io_worker_update.py | 4 + 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 | 210 +++++++++--------- pkg/api/openapi_types.gen.go | 3 + .../src/manager-api/manager/WorkerMgtApi.js | 46 ++++ .../manager-api/model/SocketIOWorkerUpdate.js | 9 + 11 files changed, 510 insertions(+), 104 deletions(-) diff --git a/addon/flamenco/manager/api/worker_mgt_api.py b/addon/flamenco/manager/api/worker_mgt_api.py index ffe9f4d5..48b39a6a 100644 --- a/addon/flamenco/manager/api/worker_mgt_api.py +++ b/addon/flamenco/manager/api/worker_mgt_api.py @@ -39,6 +39,55 @@ class WorkerMgtApi(object): if api_client is None: api_client = ApiClient() self.api_client = api_client + self.delete_worker_endpoint = _Endpoint( + settings={ + 'response_type': None, + 'auth': [], + 'endpoint_path': '/api/v3/worker-mgt/workers/{worker_id}', + 'operation_id': 'delete_worker', + 'http_method': 'DELETE', + 'servers': None, + }, + params_map={ + 'all': [ + 'worker_id', + ], + 'required': [ + 'worker_id', + ], + 'nullable': [ + ], + 'enum': [ + ], + 'validation': [ + ] + }, + root_map={ + 'validations': { + }, + 'allowed_values': { + }, + 'openapi_types': { + 'worker_id': + (str,), + }, + 'attribute_map': { + 'worker_id': 'worker_id', + }, + 'location_map': { + 'worker_id': 'path', + }, + 'collection_format_map': { + } + }, + headers_map={ + 'accept': [ + 'application/json' + ], + 'content_type': [], + }, + api_client=api_client + ) self.fetch_worker_endpoint = _Endpoint( settings={ 'response_type': (Worker,), @@ -292,6 +341,83 @@ class WorkerMgtApi(object): api_client=api_client ) + def delete_worker( + self, + worker_id, + **kwargs + ): + """Remove the given worker. It is recommended to only call this function when the worker is in `offline` state. If the worker is still running, stop it first. Any task still assigned to the worker will be requeued. # noqa: E501 + + This method makes a synchronous HTTP request by default. To make an + asynchronous HTTP request, please pass async_req=True + + >>> thread = api.delete_worker(worker_id, async_req=True) + >>> result = thread.get() + + Args: + worker_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: + 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['worker_id'] = \ + worker_id + return self.delete_worker_endpoint.call_with_http_info(**kwargs) + def fetch_worker( self, worker_id, diff --git a/addon/flamenco/manager/docs/SocketIOWorkerUpdate.md b/addon/flamenco/manager/docs/SocketIOWorkerUpdate.md index 3b4bb397..7e81ad9f 100644 --- a/addon/flamenco/manager/docs/SocketIOWorkerUpdate.md +++ b/addon/flamenco/manager/docs/SocketIOWorkerUpdate.md @@ -13,6 +13,7 @@ Name | Type | Description | Notes **last_seen** | **datetime** | Last time this worker was seen by the Manager. | [optional] **previous_status** | [**WorkerStatus**](WorkerStatus.md) | | [optional] **status_change** | [**WorkerStatusChangeRequest**](WorkerStatusChangeRequest.md) | | [optional] +**deleted_at** | **datetime** | This is only set when the worker was deleted. | [optional] **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/addon/flamenco/manager/docs/WorkerMgtApi.md b/addon/flamenco/manager/docs/WorkerMgtApi.md index 421943b1..a2c8e630 100644 --- a/addon/flamenco/manager/docs/WorkerMgtApi.md +++ b/addon/flamenco/manager/docs/WorkerMgtApi.md @@ -4,6 +4,7 @@ All URIs are relative to *http://localhost* Method | HTTP request | Description ------------- | ------------- | ------------- +[**delete_worker**](WorkerMgtApi.md#delete_worker) | **DELETE** /api/v3/worker-mgt/workers/{worker_id} | Remove the given worker. It is recommended to only call this function when the worker is in `offline` state. If the worker is still running, stop it first. Any task still assigned to the worker will be requeued. [**fetch_worker**](WorkerMgtApi.md#fetch_worker) | **GET** /api/v3/worker-mgt/workers/{worker_id} | Fetch info about the worker. [**fetch_worker_sleep_schedule**](WorkerMgtApi.md#fetch_worker_sleep_schedule) | **GET** /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule | [**fetch_workers**](WorkerMgtApi.md#fetch_workers) | **GET** /api/v3/worker-mgt/workers | Get list of workers. @@ -11,6 +12,71 @@ Method | HTTP request | Description [**set_worker_sleep_schedule**](WorkerMgtApi.md#set_worker_sleep_schedule) | **POST** /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule | +# **delete_worker** +> delete_worker(worker_id) + +Remove the given worker. It is recommended to only call this function when the worker is in `offline` state. If the worker is still running, stop it first. Any task still assigned to the worker will be requeued. + +### Example + + +```python +import time +import flamenco.manager +from flamenco.manager.api import worker_mgt_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 = worker_mgt_api.WorkerMgtApi(api_client) + worker_id = "worker_id_example" # str | + + # example passing only required values which don't have defaults set + try: + # Remove the given worker. It is recommended to only call this function when the worker is in `offline` state. If the worker is still running, stop it first. Any task still assigned to the worker will be requeued. + api_instance.delete_worker(worker_id) + except flamenco.manager.ApiException as e: + print("Exception when calling WorkerMgtApi->delete_worker: %s\n" % e) +``` + + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **worker_id** | **str**| | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**204** | Normal response, worker has been deleted | - | +**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_worker** > Worker fetch_worker(worker_id) diff --git a/addon/flamenco/manager/model/socket_io_worker_update.py b/addon/flamenco/manager/model/socket_io_worker_update.py index c6ed1fd4..51cf07dc 100644 --- a/addon/flamenco/manager/model/socket_io_worker_update.py +++ b/addon/flamenco/manager/model/socket_io_worker_update.py @@ -97,6 +97,7 @@ class SocketIOWorkerUpdate(ModelNormal): 'last_seen': (datetime,), # noqa: E501 'previous_status': (WorkerStatus,), # noqa: E501 'status_change': (WorkerStatusChangeRequest,), # noqa: E501 + 'deleted_at': (datetime,), # noqa: E501 } @cached_property @@ -113,6 +114,7 @@ class SocketIOWorkerUpdate(ModelNormal): 'last_seen': 'last_seen', # noqa: E501 'previous_status': 'previous_status', # noqa: E501 'status_change': 'status_change', # noqa: E501 + 'deleted_at': 'deleted_at', # noqa: E501 } read_only_vars = { @@ -166,6 +168,7 @@ class SocketIOWorkerUpdate(ModelNormal): last_seen (datetime): Last time this worker was seen by the Manager.. [optional] # noqa: E501 previous_status (WorkerStatus): [optional] # noqa: E501 status_change (WorkerStatusChangeRequest): [optional] # noqa: E501 + deleted_at (datetime): This is only set when the worker was deleted.. [optional] # noqa: E501 """ _check_type = kwargs.pop('_check_type', True) @@ -262,6 +265,7 @@ class SocketIOWorkerUpdate(ModelNormal): last_seen (datetime): Last time this worker was seen by the Manager.. [optional] # noqa: E501 previous_status (WorkerStatus): [optional] # noqa: E501 status_change (WorkerStatusChangeRequest): [optional] # noqa: E501 + deleted_at (datetime): This is only set when the worker was deleted.. [optional] # noqa: E501 """ _check_type = kwargs.pop('_check_type', True) diff --git a/internal/worker/mocks/client.gen.go b/internal/worker/mocks/client.gen.go index e4600538..92c04214 100644 --- a/internal/worker/mocks/client.gen.go +++ b/internal/worker/mocks/client.gen.go @@ -116,6 +116,26 @@ func (mr *MockFlamencoClientMockRecorder) CheckSharedStoragePathWithResponse(arg return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckSharedStoragePathWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).CheckSharedStoragePathWithResponse), varargs...) } +// DeleteWorkerWithResponse mocks base method. +func (m *MockFlamencoClient) DeleteWorkerWithResponse(arg0 context.Context, arg1 string, arg2 ...api.RequestEditorFn) (*api.DeleteWorkerResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DeleteWorkerWithResponse", varargs...) + ret0, _ := ret[0].(*api.DeleteWorkerResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteWorkerWithResponse indicates an expected call of DeleteWorkerWithResponse. +func (mr *MockFlamencoClientMockRecorder) DeleteWorkerWithResponse(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, "DeleteWorkerWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).DeleteWorkerWithResponse), varargs...) +} + // FetchGlobalLastRenderedInfoWithResponse mocks base method. func (m *MockFlamencoClient) FetchGlobalLastRenderedInfoWithResponse(arg0 context.Context, arg1 ...api.RequestEditorFn) (*api.FetchGlobalLastRenderedInfoResponse, error) { m.ctrl.T.Helper() diff --git a/pkg/api/openapi_client.gen.go b/pkg/api/openapi_client.gen.go index 02b43607..7954a1d6 100644 --- a/pkg/api/openapi_client.gen.go +++ b/pkg/api/openapi_client.gen.go @@ -196,6 +196,9 @@ type ClientInterface interface { // FetchWorkers request FetchWorkers(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + // DeleteWorker request + DeleteWorker(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // FetchWorker request FetchWorker(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -704,6 +707,18 @@ func (c *Client) FetchWorkers(ctx context.Context, reqEditors ...RequestEditorFn return c.Client.Do(req) } +func (c *Client) DeleteWorker(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteWorkerRequest(c.Server, workerId) + 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) FetchWorker(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewFetchWorkerRequest(c.Server, workerId) if err != nil { @@ -1961,6 +1976,40 @@ func NewFetchWorkersRequest(server string) (*http.Request, error) { return req, nil } +// NewDeleteWorkerRequest generates requests for DeleteWorker +func NewDeleteWorkerRequest(server string, workerId string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "worker_id", runtime.ParamLocationPath, workerId) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/v3/worker-mgt/workers/%s", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("DELETE", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + // NewFetchWorkerRequest generates requests for FetchWorker func NewFetchWorkerRequest(server string, workerId string) (*http.Request, error) { var err error @@ -2588,6 +2637,9 @@ type ClientWithResponsesInterface interface { // FetchWorkers request FetchWorkersWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*FetchWorkersResponse, error) + // DeleteWorker request + DeleteWorkerWithResponse(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*DeleteWorkerResponse, error) + // FetchWorker request FetchWorkerWithResponse(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*FetchWorkerResponse, error) @@ -3274,6 +3326,28 @@ func (r FetchWorkersResponse) StatusCode() int { return 0 } +type DeleteWorkerResponse struct { + Body []byte + HTTPResponse *http.Response + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r DeleteWorkerResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r DeleteWorkerResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type FetchWorkerResponse struct { Body []byte HTTPResponse *http.Response @@ -3903,6 +3977,15 @@ func (c *ClientWithResponses) FetchWorkersWithResponse(ctx context.Context, reqE return ParseFetchWorkersResponse(rsp) } +// DeleteWorkerWithResponse request returning *DeleteWorkerResponse +func (c *ClientWithResponses) DeleteWorkerWithResponse(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*DeleteWorkerResponse, error) { + rsp, err := c.DeleteWorker(ctx, workerId, reqEditors...) + if err != nil { + return nil, err + } + return ParseDeleteWorkerResponse(rsp) +} + // FetchWorkerWithResponse request returning *FetchWorkerResponse func (c *ClientWithResponses) FetchWorkerWithResponse(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*FetchWorkerResponse, error) { rsp, err := c.FetchWorker(ctx, workerId, reqEditors...) @@ -4910,6 +4993,32 @@ func ParseFetchWorkersResponse(rsp *http.Response) (*FetchWorkersResponse, error return response, nil } +// ParseDeleteWorkerResponse parses an HTTP response from a DeleteWorkerWithResponse call +func ParseDeleteWorkerResponse(rsp *http.Response) (*DeleteWorkerResponse, error) { + bodyBytes, err := ioutil.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &DeleteWorkerResponse{ + 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 +} + // ParseFetchWorkerResponse parses an HTTP response from a FetchWorkerWithResponse call func ParseFetchWorkerResponse(rsp *http.Response) (*FetchWorkerResponse, error) { bodyBytes, err := ioutil.ReadAll(rsp.Body) diff --git a/pkg/api/openapi_server.gen.go b/pkg/api/openapi_server.gen.go index 4dc1b114..27bafe6b 100644 --- a/pkg/api/openapi_server.gen.go +++ b/pkg/api/openapi_server.gen.go @@ -98,6 +98,9 @@ type ServerInterface interface { // Get list of workers. // (GET /api/v3/worker-mgt/workers) FetchWorkers(ctx echo.Context) error + // Remove the given worker. It is recommended to only call this function when the worker is in `offline` state. If the worker is still running, stop it first. Any task still assigned to the worker will be requeued. + // (DELETE /api/v3/worker-mgt/workers/{worker_id}) + DeleteWorker(ctx echo.Context, workerId string) error // Fetch info about the worker. // (GET /api/v3/worker-mgt/workers/{worker_id}) FetchWorker(ctx echo.Context, workerId string) error @@ -553,6 +556,22 @@ func (w *ServerInterfaceWrapper) FetchWorkers(ctx echo.Context) error { return err } +// DeleteWorker converts echo context to params. +func (w *ServerInterfaceWrapper) DeleteWorker(ctx echo.Context) error { + var err error + // ------------- Path parameter "worker_id" ------------- + var workerId string + + err = runtime.BindStyledParameterWithLocation("simple", false, "worker_id", runtime.ParamLocationPath, ctx.Param("worker_id"), &workerId) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter worker_id: %s", err)) + } + + // Invoke the callback with all the unmarshalled arguments + err = w.Handler.DeleteWorker(ctx, workerId) + return err +} + // FetchWorker converts echo context to params. func (w *ServerInterfaceWrapper) FetchWorker(ctx echo.Context) error { var err error @@ -791,6 +810,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.POST(baseURL+"/api/v3/tasks/:task_id/setstatus", wrapper.SetTaskStatus) router.GET(baseURL+"/api/v3/version", wrapper.GetVersion) router.GET(baseURL+"/api/v3/worker-mgt/workers", wrapper.FetchWorkers) + router.DELETE(baseURL+"/api/v3/worker-mgt/workers/:worker_id", wrapper.DeleteWorker) router.GET(baseURL+"/api/v3/worker-mgt/workers/:worker_id", wrapper.FetchWorker) router.POST(baseURL+"/api/v3/worker-mgt/workers/:worker_id/setstatus", wrapper.RequestWorkerStatusChange) router.GET(baseURL+"/api/v3/worker-mgt/workers/:worker_id/sleep-schedule", wrapper.FetchWorkerSleepSchedule) diff --git a/pkg/api/openapi_spec.gen.go b/pkg/api/openapi_spec.gen.go index 36feb86e..7d73b436 100644 --- a/pkg/api/openapi_spec.gen.go +++ b/pkg/api/openapi_spec.gen.go @@ -97,110 +97,112 @@ var swaggerSpec = []string{ "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", - "XP9+/f8DAAD//xuFDkmA1wAA", + "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", + "7+Q0lH6I53B5Tde/X///AAAA//8EFYW6StoAAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/pkg/api/openapi_types.gen.go b/pkg/api/openapi_types.gen.go index 5cd3e67a..baf8f978 100644 --- a/pkg/api/openapi_types.gen.go +++ b/pkg/api/openapi_types.gen.go @@ -560,6 +560,9 @@ type SocketIOTaskUpdate struct { // Subset of a Worker, sent over SocketIO when a worker changes. type SocketIOWorkerUpdate struct { + // This is only set when the worker was deleted. + DeletedAt *time.Time `json:"deleted_at,omitempty"` + // UUID of the Worker Id string `json:"id"` diff --git a/web/app/src/manager-api/manager/WorkerMgtApi.js b/web/app/src/manager-api/manager/WorkerMgtApi.js index 97089b65..2f52e9d1 100644 --- a/web/app/src/manager-api/manager/WorkerMgtApi.js +++ b/web/app/src/manager-api/manager/WorkerMgtApi.js @@ -39,6 +39,52 @@ export default class WorkerMgtApi { + /** + * Remove the given worker. It is recommended to only call this function when the worker is in `offline` state. If the worker is still running, stop it first. Any task still assigned to the worker will be requeued. + * @param {String} workerId + * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response + */ + deleteWorkerWithHttpInfo(workerId) { + let postBody = null; + // verify the required parameter 'workerId' is set + if (workerId === undefined || workerId === null) { + throw new Error("Missing the required parameter 'workerId' when calling deleteWorker"); + } + + let pathParams = { + 'worker_id': workerId + }; + let queryParams = { + }; + let headerParams = { + }; + let formParams = { + }; + + let authNames = []; + let contentTypes = []; + let accepts = ['application/json']; + let returnType = null; + return this.apiClient.callApi( + '/api/v3/worker-mgt/workers/{worker_id}', 'DELETE', + pathParams, queryParams, headerParams, formParams, postBody, + authNames, contentTypes, accepts, returnType, null + ); + } + + /** + * Remove the given worker. It is recommended to only call this function when the worker is in `offline` state. If the worker is still running, stop it first. Any task still assigned to the worker will be requeued. + * @param {String} workerId + * @return {Promise} a {@link https://www.promisejs.org/|Promise} + */ + deleteWorker(workerId) { + return this.deleteWorkerWithHttpInfo(workerId) + .then(function(response_and_data) { + return response_and_data.data; + }); + } + + /** * Fetch info about the worker. * @param {String} workerId diff --git a/web/app/src/manager-api/model/SocketIOWorkerUpdate.js b/web/app/src/manager-api/model/SocketIOWorkerUpdate.js index 4bab6920..91798f89 100644 --- a/web/app/src/manager-api/model/SocketIOWorkerUpdate.js +++ b/web/app/src/manager-api/model/SocketIOWorkerUpdate.js @@ -84,6 +84,9 @@ class SocketIOWorkerUpdate { if (data.hasOwnProperty('version')) { obj['version'] = ApiClient.convertToType(data['version'], 'String'); } + if (data.hasOwnProperty('deleted_at')) { + obj['deleted_at'] = ApiClient.convertToType(data['deleted_at'], 'Date'); + } } return obj; } @@ -135,6 +138,12 @@ SocketIOWorkerUpdate.prototype['status_change'] = undefined; */ SocketIOWorkerUpdate.prototype['version'] = undefined; +/** + * This is only set when the worker was deleted. + * @member {Date} deleted_at + */ +SocketIOWorkerUpdate.prototype['deleted_at'] = undefined; +