Emcee
53 строки · 1.9 Кб
1import Dispatch
2import DistWorkerModels
3import Foundation
4import EmceeLogging
5import QueueModels
6import RESTInterfaces
7import RESTMethods
8import RESTServer
9import WorkerAlivenessProvider
10
11public final class KickstartWorkerEndpoint: RESTEndpoint {
12private let onDemandWorkerStarter: OnDemandWorkerStarter
13private let workerAlivenessProvider: WorkerAlivenessProvider
14private let workerConfigurations: WorkerConfigurations
15public let path: RESTPath = KickstartWorkerRESTMethod()
16public let requestIndicatesActivity = false
17
18public init(
19onDemandWorkerStarter: OnDemandWorkerStarter,
20workerAlivenessProvider: WorkerAlivenessProvider,
21workerConfigurations: WorkerConfigurations
22) {
23self.onDemandWorkerStarter = onDemandWorkerStarter
24self.workerAlivenessProvider = workerAlivenessProvider
25self.workerConfigurations = workerConfigurations
26}
27
28public enum KickstartError: Error, CustomStringConvertible {
29case isAlive(WorkerId)
30
31public var description: String {
32switch self {
33case .isAlive(let workerId):
34return "Can't kickstart \(workerId) because it is alive"
35}
36}
37}
38
39public func handle(payload: KickstartWorkerPayload) throws -> KickstartWorkerResponse {
40guard workerConfigurations.workerConfiguration(workerId: payload.workerId) != nil else {
41throw WorkerConfigurationError.missingWorkerConfiguration(workerId: payload.workerId)
42}
43
44let workerAliveness = workerAlivenessProvider.alivenessForWorker(workerId: payload.workerId)
45guard !workerAliveness.registered || workerAliveness.silent else {
46throw KickstartError.isAlive(payload.workerId)
47}
48
49try onDemandWorkerStarter.start(workerId: payload.workerId)
50
51return KickstartWorkerResponse(workerId: payload.workerId)
52}
53}
54