Refresh apps with task info if exists

This commit is contained in:
Johannes Zellner
2025-01-02 19:04:07 +01:00
parent ce01adc5b7
commit a2d1d83457
2 changed files with 156 additions and 17 deletions

View File

@@ -1,11 +1,89 @@
import { ISTATES } from '../constants.js';
import { APP_TYPES, HSTATES, ISTATES, RSTATES } from '../constants.js';
import { fetcher } from 'pankow';
import { sleep } from 'pankow/utils';
import moment from 'moment';
function installationStateLabel(app) {
if (!app) return '';
const waiting = app.progress === 0 ? ' (Queued)' : '';
switch (app.installationState) {
case ISTATES.PENDING_INSTALL:
return 'Installing' + waiting;
case ISTATES.PENDING_CLONE:
return 'Cloning' + waiting;
case ISTATES.PENDING_LOCATION_CHANGE:
case ISTATES.PENDING_CONFIGURE:
case ISTATES.PENDING_RECREATE_CONTAINER:
case ISTATES.PENDING_SERVICES_CHANGE:
case ISTATES.PENDING_DEBUG:
return 'Configuring' + waiting;
case ISTATES.PENDING_RESIZE:
return 'Resizing' + waiting;
case ISTATES.PENDING_DATA_DIR_MIGRATION:
return 'Migrating data' + waiting;
case ISTATES.PENDING_UNINSTALL: return 'Uninstalling' + waiting;
case ISTATES.PENDING_RESTORE: return 'Restoring' + waiting;
case ISTATES.PENDING_IMPORT: return 'Importing' + waiting;
case ISTATES.PENDING_UPDATE: return 'Updating' + waiting;
case ISTATES.PENDING_BACKUP: return 'Backing up' + waiting;
case ISTATES.PENDING_START: return 'Starting' + waiting;
case ISTATES.PENDING_STOP: return 'Stopping' + waiting;
case ISTATES.PENDING_RESTART: return 'Restarting' + waiting;
case ISTATES.ERROR: {
if (app.error && app.error.message === 'ETRYAGAIN') return 'DNS Error';
return 'Error';
}
case ISTATES.INSTALLED: {
if (app.debugMode) {
return 'Recovery Mode';
} else if (app.runState === RSTATES.RUNNING) {
if (!app.health) return 'Starting...'; // no data yet
if (app.type === APP_TYPES.LINK) return '';
if (app.health === HSTATES.HEALTHY) return 'Running';
return 'Not responding'; // dead/exit/unhealthy
} else if (app.runState === RSTATES.STOPPED) {
return 'Stopped';
} else {
return app.runState;
}
}
default: return app.installationState;
}
}
function installationActive(app) {
if (app.installationState === ISTATES.ERROR) return false;
if (app.installationState === ISTATES.INSTALLED) return false;
return true;
}
function appProgressMessage(app) {
return app.message || (app.error ? app.error.message : '');
}
function create(origin, accessToken, id) {
async function getTask(appId) {
let error, result;
try {
result = await fetcher.get(`${origin}/api/v1/apps/${appId}/task`, { access_token: accessToken });
} catch (e) {
error = e;
}
if (error || result.status !== 200) {
console.error('Failed to get task for app.', error || result.status);
return null;
}
return result.body;
}
export function create(origin, accessToken, id) {
return {
name: 'AppsModel',
getTask,
async list() {
let error, result;
try {
@@ -19,6 +97,30 @@ export function create(origin, accessToken, id) {
return [];
}
for (const app of result.body.apps) {
app.ssoAuth = app.sso && (app.manifest.addons['ldap'] || app.manifest.addons['oidc'] || app.manifest.addons['proxyAuth']); // checking app.sso first ensures app.manifest.addons is not null
if (app.accessLevel !== 'operator' && app.accessLevel !== 'admin') { // only fetch if we have permissions
app.progress = 0;
app.message = '';
app.taskMinutesActive = 0;
continue;
}
if (!app.taskId) continue;
const task = await getTask(app.id);
if (task) {
app.progress = task.percent;
app.message = task.message;
app.taskMinutesActive = moment.duration(moment.utc().diff(moment.utc(task.creationTime))).asMinutes();
} else {
app.progress = 0;
app.message = '';
app.taskMinutesActive = 0;
}
}
return result.body.apps;
},
async get() {
@@ -67,5 +169,8 @@ export function create(origin, accessToken, id) {
}
export default {
create
create,
installationStateLabel,
installationActive,
appProgressMessage,
};