portainer/app/nomad/logs/logsController.js

86 lines
2.7 KiB
JavaScript

import axios from '@/portainer/services/axios';
/* @ngInject */
export default function LogsController($scope, $async, $state, Notifications) {
let controller = new AbortController();
$scope.stderrLog = [];
$scope.stdoutLog = [];
$scope.changeLogCollection = function (logCollectionStatus) {
if (!logCollectionStatus) {
controller.abort();
controller = new AbortController();
} else {
loadLogs('stderr', $scope.jobID, $scope.taskName, $scope.namespace, $scope.endpointId, controller);
loadLogs('stdout', $scope.jobID, $scope.taskName, $scope.namespace, $scope.endpointId, controller);
}
};
function stripEscapeCodes(logs) {
return logs.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '');
}
function formatLogs(logs, splitter = '\\n') {
if (!logs) {
return [];
}
const formattedLogs = [];
const logInLines = logs.trim().split(splitter);
for (const logInLine of logInLines) {
const line = stripEscapeCodes(logInLine).replace('\n', '').replace(/[""]+/g, '');
formattedLogs.push({ line, spans: [{ foregroundColor: null, backgroundColor: null, text: line }] });
}
return formattedLogs;
}
async function loadLogs(logType, jobID, taskName, namespace, endpointId, controller, refresh = true, offset = 50000) {
axios
.get(`/nomad/endpoints/${endpointId}/allocation/${$scope.allocationID}/logs`, {
params: {
jobID,
taskName,
namespace,
refresh,
logType,
offset,
},
signal: controller.signal,
onDownloadProgress: (progressEvent) => {
$scope[`${logType}Log`] = formatLogs(progressEvent.currentTarget.response);
$scope.$apply();
},
})
.then((response) => {
$scope[`${logType}Log`] = formatLogs(response.data, '\n');
$scope.$apply();
})
.catch((err) => {
if (err.message !== 'canceled') Notifications.error('Failure', err, 'Unable to retrieve task logs');
});
}
async function initView() {
return $async(async () => {
$scope.jobID = $state.params.jobID;
$scope.taskName = $state.params.taskName;
$scope.allocationID = $state.params.allocationID;
$scope.namespace = $state.params.namespace;
$scope.endpointId = $state.params.endpointId;
loadLogs('stderr', $scope.jobID, $scope.taskName, $scope.namespace, $scope.endpointId, controller);
loadLogs('stdout', $scope.jobID, $scope.taskName, $scope.namespace, $scope.endpointId, controller);
});
}
$scope.$on('$destroy', function () {
if (controller) {
controller.abort();
}
});
initView();
}