X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/ea54fb82c3a59ca8a959643f8bec4776635433e0..HEAD:/src/services/log-service/log-service.ts diff --git a/src/services/log-service/log-service.ts b/src/services/log-service/log-service.ts index 3a049a60..f36044f4 100644 --- a/src/services/log-service/log-service.ts +++ b/src/services/log-service/log-service.ts @@ -3,12 +3,59 @@ // SPDX-License-Identifier: AGPL-3.0 import { AxiosInstance } from "axios"; -import { LogResource } from '~/models/log'; -import { CommonResourceService } from "~/services/common-service/common-resource-service"; -import { ApiActions } from "~/services/api/api-actions"; +import { LogEventType, LogResource } from 'models/log'; +import { CommonResourceService } from "services/common-service/common-resource-service"; +import { ApiActions } from "services/api/api-actions"; +import { WebDAV } from "common/webdav"; +import { extractFilesData } from "services/collection-service/collection-service-files-response"; +import { CollectionFile } from "models/collection-file"; +import { ContainerRequestResource } from "models/container-request"; + +export type LogFragment = { + logType: LogEventType; + contents: string[]; +} export class LogService extends CommonResourceService { - constructor(serverApi: AxiosInstance, actions: ApiActions) { + constructor(serverApi: AxiosInstance, private apiWebdavClient: WebDAV, actions: ApiActions) { super(serverApi, "logs", actions); } + + async listLogFiles(containerRequest: Pick) { + const request = await this.apiWebdavClient.propfind(`container_requests/${containerRequest.uuid}/log/${containerRequest.containerUuid}`); + if (request?.responseXML != null) { + return extractFilesData(request.responseXML) + .filter((file) => ( + file.path === `/arvados/v1/container_requests/${containerRequest.uuid}/log/${containerRequest.containerUuid}` + )); + } + return Promise.reject(); + } + + /** + * Fetches the specified log file contents from the given container request's container live logs endpoint + * @param containerRequest Container request to fetch logs for + * @param fileRecord Log file to fetch + * @param startByte First byte index of the log file to fetch + * @param endByte Last byte index to include in the response + * @returns A promise that resolves to the LogEventType and a string array of the log file contents + */ + async getLogFileContents(containerRequest: Pick, fileRecord: Pick, startByte: number, endByte: number): Promise { + const request = await this.apiWebdavClient.get( + `container_requests/${containerRequest.uuid}/log/${containerRequest.containerUuid}/${fileRecord.name}`, + {headers: {Range: `bytes=${startByte}-${endByte}`}} + ); + const logFileType = logFileToLogType(fileRecord); + + if (request?.responseText && logFileType) { + return { + logType: logFileType, + contents: request.responseText.split(/\r?\n/), + }; + } else { + return Promise.reject(); + } + } } + +export const logFileToLogType = (file: Pick) => (file.name.replace(/\.(txt|json)$/, '') as LogEventType);