From 51f1fb0f30e04ece6a00d2d8b9420b49703a2fde Mon Sep 17 00:00:00 2001 From: Felipe Lalanne Date: Mon, 21 Oct 2024 17:17:21 -0300 Subject: [PATCH] Refactor device-config as part of device-state Move the device-config module to the device-state folder and export only those functions that are needed elsewhere in the codebase This moves us closer to making the device-state module the only way to modify application and configuration. Change-type: patch --- src/api-binder/index.ts | 7 +++--- src/device-api/v2.ts | 3 +-- src/{ => device-state}/device-config.ts | 33 +++++++++++++------------ src/device-state/index.ts | 8 +++++- src/device-state/preload.ts | 6 ++--- src/device-state/target-state.ts | 2 +- test/integration/device-config.spec.ts | 2 +- test/legacy/40-target-state.spec.ts | 2 +- 8 files changed, 34 insertions(+), 29 deletions(-) rename src/{ => device-state}/device-config.ts (96%) diff --git a/src/api-binder/index.ts b/src/api-binder/index.ts index eae0c99a..b6bbefbc 100644 --- a/src/api-binder/index.ts +++ b/src/api-binder/index.ts @@ -5,7 +5,6 @@ import _ from 'lodash'; import type { PinejsClientRequest } from 'pinejs-client-request'; import * as config from '../config'; -import * as deviceConfig from '../device-config'; import * as eventTracker from '../event-tracker'; import { loadBackupFromMigration } from '../lib/migration'; @@ -332,10 +331,10 @@ async function reportInitialEnv( ); } - const defaultConfig = deviceConfig.getDefaults(); + const defaultConfig = deviceState.getDefaultConfig(); - const currentConfig = await deviceConfig.getCurrent(); - const targetConfig = deviceConfig.formatConfigKeys(targetConfigUnformatted); + const currentConfig = await deviceState.getCurrentConfig(); + const targetConfig = deviceState.formatConfigKeys(targetConfigUnformatted); if (!currentConfig) { throw new InternalInconsistencyError( diff --git a/src/device-api/v2.ts b/src/device-api/v2.ts index f9d9cc97..37d29d7f 100644 --- a/src/device-api/v2.ts +++ b/src/device-api/v2.ts @@ -11,7 +11,6 @@ import { Volume } from '../compose/volume'; import * as commitStore from '../compose/commit'; import * as config from '../config'; import * as db from '../db'; -import * as deviceConfig from '../device-config'; import * as logger from '../logging'; import * as images from '../compose/images'; import * as volumeManager from '../compose/volume-manager'; @@ -512,7 +511,7 @@ router.get('/v2/device/tags', async (_req, res) => { }); router.get('/v2/device/vpn', async (_req, res) => { - const conf = await deviceConfig.getCurrent(); + const conf = await deviceState.getCurrentConfig(); // Build VPNInfo const info = { enabled: conf.SUPERVISOR_VPN_CONTROL === 'true', diff --git a/src/device-config.ts b/src/device-state/device-config.ts similarity index 96% rename from src/device-config.ts rename to src/device-state/device-config.ts index 42845801..3ea37cbc 100644 --- a/src/device-config.ts +++ b/src/device-state/device-config.ts @@ -2,21 +2,22 @@ import _ from 'lodash'; import { inspect } from 'util'; import { promises as fs } from 'fs'; -import * as config from './config'; -import * as db from './db'; -import * as logger from './logging'; -import * as dbus from './lib/dbus'; -import type { EnvVarObject } from './types'; -import { UnitNotLoadedError } from './lib/errors'; -import { checkInt, checkTruthy } from './lib/validation'; -import log from './lib/supervisor-console'; -import * as configUtils from './config/utils'; -import type { SchemaTypeKey } from './config/schema-type'; -import { matchesAnyBootConfig } from './config/backends'; -import type { ConfigBackend } from './config/backends/backend'; -import { Odmdata } from './config/backends/odmdata'; -import * as fsUtils from './lib/fs-utils'; -import { pathOnRoot } from './lib/host-utils'; +import * as config from '../config'; +import * as db from '../db'; +import * as logger from '../logging'; +import * as dbus from '../lib/dbus'; +import type { EnvVarObject } from '../types'; +import { UnitNotLoadedError } from '../lib/errors'; +import { checkInt, checkTruthy } from '../lib/validation'; +import log from '../lib/supervisor-console'; +import * as fsUtils from '../lib/fs-utils'; +import { pathOnRoot } from '../lib/host-utils'; + +import * as configUtils from '../config/utils'; +import type { SchemaTypeKey } from '../config/schema-type'; +import { matchesAnyBootConfig } from '../config/backends'; +import type { ConfigBackend } from '../config/backends/backend'; +import { Odmdata } from '../config/backends/odmdata'; const vpnServiceName = 'openvpn'; @@ -210,7 +211,7 @@ const configKeys: Dictionary = { }, }; -export const validKeys = [ +const validKeys = [ 'SUPERVISOR_VPN_CONTROL', 'OVERRIDE_LOCK', ..._.map(configKeys, 'envVarName'), diff --git a/src/device-state/index.ts b/src/device-state/index.ts index 8c25e4c9..e0061a6f 100644 --- a/src/device-state/index.ts +++ b/src/device-state/index.ts @@ -9,7 +9,7 @@ import * as config from '../config'; import * as logger from '../logging'; import * as network from '../network'; -import * as deviceConfig from '../device-config'; +import * as deviceConfig from './device-config'; import * as constants from '../lib/constants'; import * as dbus from '../lib/dbus'; @@ -26,6 +26,12 @@ import type { InstancedDeviceState } from './target-state'; import * as TargetState from './target-state'; export { getTarget, setTarget } from './target-state'; +export { + formatConfigKeys, + getCurrent as getCurrentConfig, + getDefaults as getDefaultConfig, +} from './device-config'; + import type { DeviceLegacyState, DeviceState, DeviceReport } from '../types'; import type { CompositionStepT, diff --git a/src/device-state/preload.ts b/src/device-state/preload.ts index 5a78592c..969f1b15 100644 --- a/src/device-state/preload.ts +++ b/src/device-state/preload.ts @@ -6,9 +6,9 @@ import { imageFromService } from '../compose/images'; import { NumericIdentifier } from '../types'; import { setTarget } from './target-state'; import * as config from '../config'; -import * as deviceConfig from '../device-config'; import * as eventTracker from '../event-tracker'; import * as imageManager from '../compose/images'; +import * as deviceState from '../device-state'; import { AppsJsonParseError, @@ -126,8 +126,8 @@ export async function loadTargetFromFile(appsPath: string): Promise { await imageManager.save(image); } - const deviceConf = await deviceConfig.getCurrent(); - const formattedConf = deviceConfig.formatConfigKeys(preloadState.config); + const deviceConf = await deviceState.getCurrentConfig(); + const formattedConf = deviceState.formatConfigKeys(preloadState.config); const localState = { [uuid]: { name: '', diff --git a/src/device-state/target-state.ts b/src/device-state/target-state.ts index d1102fea..a6c48767 100644 --- a/src/device-state/target-state.ts +++ b/src/device-state/target-state.ts @@ -6,7 +6,7 @@ import * as config from '../config'; import * as db from '../db'; import * as globalEventBus from '../event-bus'; -import * as deviceConfig from '../device-config'; +import * as deviceConfig from './device-config'; import { TargetStateError } from '../lib/errors'; import { takeGlobalLockRO, takeGlobalLockRW } from '../lib/process-lock'; diff --git a/test/integration/device-config.spec.ts b/test/integration/device-config.spec.ts index 78dd89d6..6cdfa852 100644 --- a/test/integration/device-config.spec.ts +++ b/test/integration/device-config.spec.ts @@ -5,7 +5,7 @@ import type { SinonStub, SinonSpy } from 'sinon'; import { stub, spy } from 'sinon'; import { expect } from 'chai'; -import * as deviceConfig from '~/src/device-config'; +import * as deviceConfig from '~/src/device-state/device-config'; import * as fsUtils from '~/lib/fs-utils'; import * as logger from '~/src/logging'; import { Extlinux } from '~/src/config/backends/extlinux'; diff --git a/test/legacy/40-target-state.spec.ts b/test/legacy/40-target-state.spec.ts index 02e928e8..99717f85 100644 --- a/test/legacy/40-target-state.spec.ts +++ b/test/legacy/40-target-state.spec.ts @@ -8,7 +8,7 @@ import { expect } from 'chai'; import * as TargetState from '~/src/api-binder/poll'; import Log from '~/lib/supervisor-console'; import * as request from '~/lib/request'; -import * as deviceConfig from '~/src/device-config'; +import * as deviceConfig from '~/src/device-state/device-config'; import { UpdatesLockedError } from '~/lib/errors'; import { setTimeout } from 'timers/promises';