portainer/app/edge/views/edge-jobs/edgeJob/edgeJobController.js

181 lines
5.7 KiB
JavaScript

import _ from 'lodash-es';
import { getEnvironments } from '@/react/portainer/environments/environment.service';
import { confirmWebEditorDiscard } from '@@/modals/confirm';
export class EdgeJobController {
/* @ngInject */
constructor($async, $q, $state, $window, EdgeJobService, FileSaver, GroupService, HostBrowserService, Notifications, TagService) {
this.state = {
actionInProgress: false,
showEditorTab: false,
isEditorDirty: false,
};
this.$async = $async;
this.$q = $q;
this.$state = $state;
this.$window = $window;
this.EdgeJobService = EdgeJobService;
this.FileSaver = FileSaver;
this.GroupService = GroupService;
this.HostBrowserService = HostBrowserService;
this.Notifications = Notifications;
this.TagService = TagService;
this.update = this.update.bind(this);
this.updateAsync = this.updateAsync.bind(this);
this.downloadLogs = this.downloadLogs.bind(this);
this.downloadLogsAsync = this.downloadLogsAsync.bind(this);
this.collectLogs = this.collectLogs.bind(this);
this.collectLogsAsync = this.collectLogsAsync.bind(this);
this.clearLogs = this.clearLogs.bind(this);
this.clearLogsAsync = this.clearLogsAsync.bind(this);
this.refresh = this.refresh.bind(this);
this.refreshAsync = this.refreshAsync.bind(this);
this.showEditor = this.showEditor.bind(this);
}
update() {
return this.$async(this.updateAsync);
}
async updateAsync() {
const model = this.edgeJob;
this.state.actionInProgress = true;
try {
await this.EdgeJobService.updateEdgeJob(model);
this.Notifications.success('Success', 'Edge job successfully updated');
this.state.isEditorDirty = false;
this.$state.go('edge.jobs', {}, { reload: true });
} catch (err) {
this.Notifications.error('Failure', err, 'Unable to update Edge job');
}
this.state.actionInProgress = false;
}
downloadLogs(endpointId) {
return this.$async(this.downloadLogsAsync, endpointId);
}
async downloadLogsAsync(endpointId) {
try {
const data = await this.EdgeJobService.logFile(this.edgeJob.Id, endpointId);
const downloadData = new Blob([data.FileContent], {
type: 'text/plain;charset=utf-8',
});
const logFileName = `job_${this.edgeJob.Id}_task_${endpointId}.log`;
this.FileSaver.saveAs(downloadData, logFileName);
} catch (err) {
this.Notifications.error('Failure', err, 'Unable to download file');
}
}
associateEndpointsToResults(results, endpoints) {
return _.map(results, (result) => {
const endpoint = _.find(endpoints, (endpoint) => endpoint.Id === result.EndpointId);
result.Endpoint = endpoint;
return result;
});
}
collectLogs(endpointId) {
return this.$async(this.collectLogsAsync, endpointId);
}
async collectLogsAsync(endpointId) {
try {
await this.EdgeJobService.collectLogs(this.edgeJob.Id, endpointId);
const result = _.find(this.results, (result) => result.EndpointId === endpointId);
result.LogsStatus = 2;
} catch (err) {
this.Notifications.error('Failure', err, 'Unable to collect logs');
}
}
clearLogs(endpointId) {
return this.$async(this.clearLogsAsync, endpointId);
}
async clearLogsAsync(endpointId) {
try {
await this.EdgeJobService.clearLogs(this.edgeJob.Id, endpointId);
const result = _.find(this.results, (result) => result.EndpointId === endpointId);
result.LogsStatus = 1;
} catch (err) {
this.Notifications.error('Failure', err, 'Unable to clear logs');
}
}
refresh() {
return this.$async(this.refreshAsync);
}
async refreshAsync() {
const { id } = this.$state.params;
const results = await this.EdgeJobService.jobResults(id);
if (results.length > 0) {
const endpointIds = _.map(results, (result) => result.EndpointId);
const endpoints = await getEnvironments({ query: { endpointIds } });
this.results = this.associateEndpointsToResults(results, endpoints.value);
} else {
this.results = results;
}
}
showEditor() {
this.state.showEditorTab = true;
}
async uiCanExit() {
if (this.edgeJob && this.edgeJob.FileContent !== this.oldFileContent && this.state.isEditorDirty) {
return confirmWebEditorDiscard();
}
}
async $onInit() {
const { id, tab } = this.$state.params;
this.state.activeTab = tab;
if (!tab || tab === 0) {
this.state.showEditorTab = true;
}
try {
const [edgeJob, file, results, groups, tags] = await Promise.all([
this.EdgeJobService.edgeJob(id),
this.EdgeJobService.getScriptFile(id),
this.EdgeJobService.jobResults(id),
this.GroupService.groups(),
this.TagService.tags(),
]);
edgeJob.FileContent = file.FileContent;
this.oldFileContent = edgeJob.FileContent;
this.edgeJob = edgeJob;
this.groups = groups;
this.tags = tags;
this.edgeJob.EdgeGroups = this.edgeJob.EdgeGroups ? this.edgeJob.EdgeGroups : [];
this.edgeJob.Endpoints = this.edgeJob.Endpoints ? this.edgeJob.Endpoints : [];
if (results.length > 0) {
const endpointIds = _.map(results, (result) => result.EndpointId);
const endpoints = await getEnvironments({ query: { endpointIds } });
this.results = this.associateEndpointsToResults(results, endpoints.value);
} else {
this.results = results;
}
} catch (err) {
this.Notifications.error('Failure', err, 'Unable to retrieve environment list');
}
this.$window.onbeforeunload = () => {
if (this.edgeJob && this.edgeJob.FileContent !== this.oldFileContent && this.state.isEditorDirty) {
return '';
}
};
}
$onDestroy() {
this.state.isEditorDirty = false;
}
}