Merge pull request #2012 from balena-os/supervisor-filter

Fix filtering of the supervisor app on the target state
This commit is contained in:
bulldozer-balena[bot] 2022-09-13 20:05:04 +00:00 committed by GitHub
commit b27f6e7dda
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 28 deletions

View File

@ -24,7 +24,7 @@ import { checkTruthy, checkString } from '../lib/validation';
import { ServiceComposeConfig, DeviceMetadata } from './types/service'; import { ServiceComposeConfig, DeviceMetadata } from './types/service';
import { ImageInspectInfo } from 'dockerode'; import { ImageInspectInfo } from 'dockerode';
import { pathExistsOnHost } from '../lib/fs-utils'; import { pathExistsOnHost } from '../lib/fs-utils';
import { getSupervisorMetadata } from '../lib/supervisor-metadata'; import { isSupervisor } from '../lib/supervisor-metadata';
export interface AppConstructOpts { export interface AppConstructOpts {
appId: number; appId: number;
@ -778,8 +778,6 @@ export class App {
...opts, ...opts,
}; };
const supervisorMeta = await getSupervisorMetadata();
const isService = (svc: ServiceComposeConfig) => const isService = (svc: ServiceComposeConfig) =>
svc.labels?.['io.balena.image.class'] == null || svc.labels?.['io.balena.image.class'] == null ||
svc.labels['io.balena.image.class'] === 'service'; svc.labels['io.balena.image.class'] === 'service';
@ -788,12 +786,6 @@ export class App {
svc.labels?.['io.balena.image.store'] == null || svc.labels?.['io.balena.image.store'] == null ||
svc.labels['io.balena.image.store'] === 'data'; svc.labels['io.balena.image.store'] === 'data';
const isSupervisor = (svc: ServiceComposeConfig) =>
app.uuid === supervisorMeta.uuid &&
(svc.serviceName === supervisorMeta.serviceName ||
// keep compatibility with older supervisor releases
svc.serviceName === 'main');
// In the db, the services are an array, but here we switch them to an // In the db, the services are an array, but here we switch them to an
// object so that they are consistent // object so that they are consistent
const services: Service[] = await Promise.all( const services: Service[] = await Promise.all(
@ -808,7 +800,10 @@ export class App {
) )
// Ignore the supervisor service itself from the target state for now // Ignore the supervisor service itself from the target state for now
// until the supervisor can update itself // until the supervisor can update itself
.filter((svc: ServiceComposeConfig) => !isSupervisor(svc)) .filter(
(svc: ServiceComposeConfig) =>
!isSupervisor(app.uuid, svc.serviceName),
)
.map(async (svc: ServiceComposeConfig) => { .map(async (svc: ServiceComposeConfig) => {
// Try to fill the image id if the image is downloaded // Try to fill the image id if the image is downloaded
let imageInfo: ImageInspectInfo | undefined; let imageInfo: ImageInspectInfo | undefined;

View File

@ -1,7 +1,3 @@
import * as memoizee from 'memoizee';
import * as config from '../config';
import { InternalInconsistencyError } from './errors';
export type SupervisorMetadata = { export type SupervisorMetadata = {
uuid: string; uuid: string;
serviceName: string; serviceName: string;
@ -41,24 +37,21 @@ const SUPERVISOR_APPS: { [arch: string]: SupervisorMetadata } = {
}; };
/** /**
* Get the metadata from the supervisor container * Check if the supervisor in the target state belongs to the known
* supervisors
* *
* This is needed for the supervisor to identify itself on the target * This is needed for the supervisor to identify itself on the target
* state and on getStatus() in device-state.ts * state and on getStatus() in device-state.ts
* *
* TODO: remove this once the supervisor knows how to update itself * TODO: remove this once the supervisor knows how to update itself
*/ */
export const getSupervisorMetadata = memoizee(
async () => {
const deviceArch = await config.get('deviceArch');
const meta: SupervisorMetadata = SUPERVISOR_APPS[deviceArch];
if (meta == null) {
throw new InternalInconsistencyError(
`Unknown device architecture ${deviceArch}. Could not find matching supervisor metadata.`,
);
}
return meta; export const isSupervisor = (appUuid: string, svcName: string) => {
}, return (
{ promise: true }, Object.values(SUPERVISOR_APPS).filter(
); ({ uuid, serviceName }) =>
// Compare with `main` as well for compatibility with older supervisors
appUuid === uuid && (svcName === serviceName || svcName === 'main'),
).length > 0
);
};