diff --git a/apps/package-manager/packages/generic/src/coreHandler.ts b/apps/package-manager/packages/generic/src/coreHandler.ts index 1d3f10e8..31001ed6 100644 --- a/apps/package-manager/packages/generic/src/coreHandler.ts +++ b/apps/package-manager/packages/generic/src/coreHandler.ts @@ -474,7 +474,7 @@ export class CoreHandler { restartPackageContainer(containerId: PackageContainerId): void { return this._packageManagerHandler?.restartPackageContainer(containerId) } - troubleshoot(): any { + async troubleshoot(): Promise { return this._packageManagerHandler?.getDataSnapshot() } async getExpetationManagerStatus(): Promise { diff --git a/apps/package-manager/packages/generic/src/generateExpectations/nrk/expectations.ts b/apps/package-manager/packages/generic/src/generateExpectations/nrk/expectations.ts index 21a2f147..483c9a65 100644 --- a/apps/package-manager/packages/generic/src/generateExpectations/nrk/expectations.ts +++ b/apps/package-manager/packages/generic/src/generateExpectations/nrk/expectations.ts @@ -57,7 +57,7 @@ export function getExpectations( // A blueprint-like plug-in architecture might be a future idea /** If set, we should first copy media to a temporary storage and use that for side-effects */ - const useTemporaryStorage = packageContainers[TEMPORARY_STORAGE_ID] + const useTemporaryStorage = packageContainers[TEMPORARY_STORAGE_ID] as PackageContainer | undefined // Sort, so that we handle the high-priority first: expectedPackages.sort((a, b) => { diff --git a/apps/package-manager/packages/generic/src/packageManager.ts b/apps/package-manager/packages/generic/src/packageManager.ts index 50106ba7..23bfa609 100644 --- a/apps/package-manager/packages/generic/src/packageManager.ts +++ b/apps/package-manager/packages/generic/src/packageManager.ts @@ -417,7 +417,7 @@ export class PackageManagerHandler { // This method can be called from core this.expectationManager.restartPackageContainer(containerId) } - public getDataSnapshot(): any { + public async getDataSnapshot(): Promise { return { ...this.dataSnapshot, @@ -426,7 +426,7 @@ export class PackageManagerHandler { reportedPackageStatuses: mapToObject(this.callbacksHandler.reportedPackageStatuses), reportedPackageContainerStatuses: mapToObject(this.callbacksHandler.reportedPackageContainerStatuses), }, - expectationManager: this.expectationManager.getTroubleshootData(), + expectationManager: await this.expectationManager.getTroubleshootData(), } } public async getExpetationManagerStatus(): Promise { diff --git a/shared/packages/api/src/methods.ts b/shared/packages/api/src/methods.ts index 4b5c667c..6fd786f7 100644 --- a/shared/packages/api/src/methods.ts +++ b/shared/packages/api/src/methods.ts @@ -8,6 +8,7 @@ import { ReturnTypeDisposePackageContainerMonitors, ReturnTypeDoYouSupportExpectation, ReturnTypeDoYouSupportPackageContainer, + ReturnTypeGetConfiguration, ReturnTypeIsExpectationFulfilled, ReturnTypeIsExpectationReadyToStartWorkingOn, ReturnTypeRemoveExpectation, @@ -101,6 +102,7 @@ export namespace ExpectationManagerWorkerAgent { /** Methods on WorkerAgent, called by ExpectedManager */ export interface WorkerAgent extends MethodsInterfaceBase { id: ExpectationManagerId + getConfiguration: () => Promise doYouSupportExpectation: (exp: Expectation.Any) => Promise getCostForExpectation: (exp: Expectation.Any) => Promise isExpectationReadyToStartWorkingOn: ( diff --git a/shared/packages/api/src/worker.ts b/shared/packages/api/src/worker.ts index c765090c..279195dc 100644 --- a/shared/packages/api/src/worker.ts +++ b/shared/packages/api/src/worker.ts @@ -2,9 +2,12 @@ * This file contains API definitions for the Worker methods */ +import { WorkerConfig } from './config' import { MonitorId } from './ids' import { Reason } from './methods' +export type ReturnTypeGetConfiguration = WorkerConfig + export type ReturnTypeDoYouSupportExpectation = | { support: true diff --git a/shared/packages/expectationManager/src/expectationManager.ts b/shared/packages/expectationManager/src/expectationManager.ts index 94b2b6b6..ba742717 100644 --- a/shared/packages/expectationManager/src/expectationManager.ts +++ b/shared/packages/expectationManager/src/expectationManager.ts @@ -18,6 +18,7 @@ import { WorkerAgentId, mapToObject, URLMap, + stringifyError, } from '@sofie-package-manager/api' import { InternalManager } from './internalManager/internalManager' import { ExpectationTrackerConstants } from './lib/constants' @@ -36,7 +37,7 @@ export class ExpectationManager { serverAccessBaseUrls: URLMap | undefined, workForceConnectionOptions: ClientConnectionOptions, callbacks: ExpectationManagerCallbacks, - options?: ExpectationManagerOptions + private readonly options?: ExpectationManagerOptions ) { this.internalManager = new InternalManager( logger, @@ -46,7 +47,7 @@ export class ExpectationManager { serverAccessBaseUrls, workForceConnectionOptions, callbacks, - options + this.options ) } terminate(): void { @@ -117,7 +118,7 @@ export class ExpectationManager { this.internalManager.tracker.triggerEvaluationNow() } - public getTroubleshootData(): any { + public async getTroubleshootData(): Promise { const trackedExpectations = this.internalManager.tracker.getSortedTrackedExpectations().map((trackedExp) => { return { ...trackedExp, @@ -126,10 +127,25 @@ export class ExpectationManager { queriedWorkers: mapToObject(trackedExp.queriedWorkers), } }) + return { trackedExpectations, - workers: this.internalManager.workerAgents.list(), + workers: await Promise.all( + this.internalManager.workerAgents.list().map(async (worker) => { + let config = undefined + try { + config = await worker.workerAgent.api.getConfiguration() + } catch (err) { + config = `Error getting configuration: ${stringifyError(err)}` + } + return { + ...worker, + config, + } + }) + ), waitingExpectations: this.internalManager.tracker.scaler.getWaitingExpectationIds(), + config: this.options, } } async getStatusReport(): Promise { diff --git a/shared/packages/expectationManager/src/workerAgentApi.ts b/shared/packages/expectationManager/src/workerAgentApi.ts index b149a651..f207f7a7 100644 --- a/shared/packages/expectationManager/src/workerAgentApi.ts +++ b/shared/packages/expectationManager/src/workerAgentApi.ts @@ -10,6 +10,7 @@ import { ReturnTypeRemoveExpectation, AdapterServerOptions, PackageContainerExpectation, + ReturnTypeGetConfiguration, ReturnTypeDoYouSupportPackageContainer, ReturnTypeRunPackageContainerCronJob, ReturnTypeSetupPackageContainerMonitors, @@ -34,6 +35,10 @@ export class WorkerAgentAPI super(methods, options) } + async getConfiguration(): Promise { + // Note: This call is ultimately received in shared/packages/worker/src/workerAgent.ts + return this._sendMessage('getConfiguration') + } async doYouSupportExpectation(exp: Expectation.Any): Promise { // Note: This call is ultimately received in shared/packages/worker/src/workerAgent.ts return this._sendMessage('doYouSupportExpectation', exp) diff --git a/shared/packages/worker/src/workerAgent.ts b/shared/packages/worker/src/workerAgent.ts index fddbe575..94b09b1d 100644 --- a/shared/packages/worker/src/workerAgent.ts +++ b/shared/packages/worker/src/workerAgent.ts @@ -663,6 +663,7 @@ export class WorkerAgent { this.expectationManagers.set(managerId, expectationManager) const methods = literal>({ + getConfiguration: async () => this.config, doYouSupportExpectation: async (exp: Expectation.Any): Promise => { return this.doesWorkerSupportExpectation(exp) }, @@ -847,9 +848,11 @@ export class WorkerAgent { if (!result.success) knownReason = result.knownReason } else if ('ready' in result) { if (!result.ready) knownReason = result.knownReason - } else if ('cost' in result) { - // do nothing - } else if ('wipId' in result) { + } else if ( + 'cost' in result || // ExpectationCost + 'wipId' in result || // WorkInProgressInfo + 'process' in result // ReturnTypeGetConfiguration + ) { // do nothing } else { assertNever(result)