1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { AxiosInstance } from "axios";
6 import { LogEventType, LogResource } from 'models/log';
7 import { CommonResourceService } from "services/common-service/common-resource-service";
8 import { ApiActions } from "services/api/api-actions";
9 import { WebDAV } from "common/webdav";
10 import { extractFilesData } from "services/collection-service/collection-service-files-response";
11 import { CollectionFile } from "models/collection-file";
12 import { ContainerRequestResource } from "models/container-request";
14 export type LogFragment = {
15 logType: LogEventType;
19 export class LogService extends CommonResourceService<LogResource> {
20 constructor(serverApi: AxiosInstance, private apiWebdavClient: WebDAV, actions: ApiActions) {
21 super(serverApi, "logs", actions);
24 async listLogFiles(containerRequest: ContainerRequestResource) {
25 const request = await this.apiWebdavClient.propfind(`container_requests/${containerRequest.uuid}/log/${containerRequest.containerUuid}`);
26 if (request.responseXML != null) {
27 return extractFilesData(request.responseXML)
29 file.path === `/arvados/v1/container_requests/${containerRequest.uuid}/log/${containerRequest.containerUuid}`
32 return Promise.reject();
35 async getLogFileContents(containerRequest: ContainerRequestResource, fileRecord: CollectionFile, startByte: number, endByte: number): Promise<LogFragment> {
36 const request = await this.apiWebdavClient.get(
37 `container_requests/${containerRequest.uuid}/log/${containerRequest.containerUuid}/${fileRecord.name}`,
38 {headers: {Range: `bytes=${startByte}-${endByte}`}}
40 const logFileType = logFileToLogType(fileRecord);
42 if (request.responseText && logFileType) {
45 contents: request.responseText.split(/\r?\n/),
48 return Promise.reject();
53 export const logFileToLogType = (file: CollectionFile) => (file.name.replace(/\.(txt|json)$/, '') as LogEventType);