mirror of
https://github.com/balena-os/balena-supervisor.git
synced 2025-06-22 17:18:50 +00:00
Update host-config, route, and action tests for host config endpoints
Change-type: minor Signed-off-by: Christina Ying Wang <christina@balena.io>
This commit is contained in:
@ -1,166 +1,21 @@
|
||||
import { expect } from 'chai';
|
||||
import * as sinon from 'sinon';
|
||||
import * as Docker from 'dockerode';
|
||||
import App from '~/src/compose/app';
|
||||
import * as applicationManager from '~/src/compose/application-manager';
|
||||
import * as imageManager from '~/src/compose/images';
|
||||
import * as serviceManager from '~/src/compose/service-manager';
|
||||
import { Image } from '~/src/compose/images';
|
||||
import Network from '~/src/compose/network';
|
||||
import * as networkManager from '~/src/compose/network-manager';
|
||||
import Service from '~/src/compose/service';
|
||||
import { ServiceComposeConfig } from '~/src/compose/types/service';
|
||||
import Volume from '~/src/compose/volume';
|
||||
import { InstancedAppState } from '~/src/types/state';
|
||||
import * as config from '~/src/config';
|
||||
import { createDockerImage } from '~/test-lib/docker-helper';
|
||||
|
||||
const DEFAULT_NETWORK = Network.fromComposeObject('default', 1, 'appuuid', {});
|
||||
|
||||
async function createService(
|
||||
{
|
||||
appId = 1,
|
||||
appUuid = 'appuuid',
|
||||
serviceName = 'main',
|
||||
commit = 'main-commit',
|
||||
...conf
|
||||
} = {} as Partial<ServiceComposeConfig>,
|
||||
{ state = {} as Partial<Service>, options = {} as any } = {},
|
||||
) {
|
||||
const svc = await Service.fromComposeObject(
|
||||
{
|
||||
appId,
|
||||
appUuid,
|
||||
serviceName,
|
||||
commit,
|
||||
// db ids should not be used for target state calculation, but images
|
||||
// are compared using _.isEqual so leaving this here to have image comparisons
|
||||
// match
|
||||
serviceId: 1,
|
||||
imageId: 1,
|
||||
releaseId: 1,
|
||||
...conf,
|
||||
},
|
||||
options,
|
||||
);
|
||||
|
||||
// Add additonal configuration
|
||||
for (const k of Object.keys(state)) {
|
||||
(svc as any)[k] = (state as any)[k];
|
||||
}
|
||||
return svc;
|
||||
}
|
||||
|
||||
function createImage(
|
||||
{
|
||||
appId = 1,
|
||||
appUuid = 'appuuid',
|
||||
name = 'test-image',
|
||||
serviceName = 'main',
|
||||
commit = 'main-commit',
|
||||
...extra
|
||||
} = {} as Partial<Image>,
|
||||
) {
|
||||
return {
|
||||
appId,
|
||||
appUuid,
|
||||
name,
|
||||
serviceName,
|
||||
commit,
|
||||
// db ids should not be used for target state calculation, but images
|
||||
// are compared using _.isEqual so leaving this here to have image comparisons
|
||||
// match
|
||||
imageId: 1,
|
||||
releaseId: 1,
|
||||
serviceId: 1,
|
||||
dependent: 0,
|
||||
...extra,
|
||||
} as Image;
|
||||
}
|
||||
|
||||
function createApps(
|
||||
{
|
||||
services = [] as Service[],
|
||||
networks = [] as Network[],
|
||||
volumes = [] as Volume[],
|
||||
},
|
||||
target = false,
|
||||
) {
|
||||
const servicesByAppId = services.reduce(
|
||||
(svcs, s) => ({ ...svcs, [s.appId]: [s].concat(svcs[s.appId] || []) }),
|
||||
{} as Dictionary<Service[]>,
|
||||
);
|
||||
const volumesByAppId = volumes.reduce(
|
||||
(vols, v) => ({ ...vols, [v.appId]: [v].concat(vols[v.appId] || []) }),
|
||||
{} as Dictionary<Volume[]>,
|
||||
);
|
||||
const networksByAppId = networks.reduce(
|
||||
(nets, n) => ({ ...nets, [n.appId]: [n].concat(nets[n.appId] || []) }),
|
||||
{} as Dictionary<Network[]>,
|
||||
);
|
||||
|
||||
const allAppIds = [
|
||||
...new Set([
|
||||
...Object.keys(servicesByAppId),
|
||||
...Object.keys(networksByAppId),
|
||||
...Object.keys(volumesByAppId),
|
||||
]),
|
||||
].map((i) => parseInt(i, 10));
|
||||
|
||||
const apps: InstancedAppState = {};
|
||||
for (const appId of allAppIds) {
|
||||
apps[appId] = new App(
|
||||
{
|
||||
appId,
|
||||
services: servicesByAppId[appId] ?? [],
|
||||
networks: (networksByAppId[appId] ?? []).reduce(
|
||||
(nets, n) => ({ ...nets, [n.name]: n }),
|
||||
{},
|
||||
),
|
||||
volumes: (volumesByAppId[appId] ?? []).reduce(
|
||||
(vols, v) => ({ ...vols, [v.name]: v }),
|
||||
{},
|
||||
),
|
||||
},
|
||||
target,
|
||||
);
|
||||
}
|
||||
|
||||
return apps;
|
||||
}
|
||||
|
||||
function createCurrentState({
|
||||
services = [] as Service[],
|
||||
networks = [] as Network[],
|
||||
volumes = [] as Volume[],
|
||||
images = services.map((s) => ({
|
||||
// Infer images from services by default
|
||||
dockerImageId: s.dockerImageId,
|
||||
...imageManager.imageFromService(s),
|
||||
})) as Image[],
|
||||
downloading = [] as string[],
|
||||
}) {
|
||||
const currentApps = createApps({ services, networks, volumes });
|
||||
|
||||
const containerIdsByAppId = services.reduce(
|
||||
(ids, s) => ({
|
||||
...ids,
|
||||
[s.appId]: {
|
||||
...ids[s.appId],
|
||||
...(s.serviceName &&
|
||||
s.containerId && { [s.serviceName]: s.containerId }),
|
||||
},
|
||||
}),
|
||||
{} as { [appId: number]: Dictionary<string> },
|
||||
);
|
||||
|
||||
return {
|
||||
currentApps,
|
||||
availableImages: images,
|
||||
downloading,
|
||||
containerIdsByAppId,
|
||||
};
|
||||
}
|
||||
import {
|
||||
createService,
|
||||
createImage,
|
||||
createApps,
|
||||
createCurrentState,
|
||||
DEFAULT_NETWORK,
|
||||
} from '~/test-lib/state-helper';
|
||||
|
||||
// TODO: application manager inferNextSteps still queries some stuff from
|
||||
// the engine instead of receiving that information as parameter. Refactoring
|
||||
|
Reference in New Issue
Block a user