/// <summary> /// Creates a new class of the LegacyJobOrchestrator. /// </summary> /// <param name="publishedNodesJobConverter">The converter to read the job from the specified file.</param> /// <param name="legacyCliModelProvider">The provider that provides the legacy command line arguments.</param> /// <param name="agentConfigProvider">The provider that provides the agent configuration.</param> /// <param name="jobSerializer">The serializer to (de)serialize job information.</param> /// <param name="logger">Logger to write log messages.</param> /// <param name="identity">Module's identity provider.</param> public LegacyJobOrchestrator(PublishedNodesJobConverter publishedNodesJobConverter, ILegacyCliModelProvider legacyCliModelProvider, IAgentConfigProvider agentConfigProvider, IJobSerializer jobSerializer, ILogger logger, IIdentity identity) { _publishedNodesJobConverter = publishedNodesJobConverter ?? throw new ArgumentNullException(nameof(publishedNodesJobConverter)); _legacyCliModel = legacyCliModelProvider.LegacyCliModel ?? throw new ArgumentNullException(nameof(legacyCliModelProvider)); _agentConfig = agentConfigProvider.Config ?? throw new ArgumentNullException(nameof(agentConfigProvider)); _jobSerializer = jobSerializer ?? throw new ArgumentNullException(nameof(jobSerializer)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _identity = identity ?? throw new ArgumentNullException(nameof(identity)); var directory = Path.GetDirectoryName(_legacyCliModel.PublishedNodesFile); if (string.IsNullOrWhiteSpace(directory)) { directory = Environment.CurrentDirectory; } _availableJobs = new ConcurrentQueue <JobProcessingInstructionModel>(); _assignedJobs = new ConcurrentDictionary <string, JobProcessingInstructionModel>(); var file = Path.GetFileName(_legacyCliModel.PublishedNodesFile); _fileSystemWatcher = new FileSystemWatcher(directory, file); _fileSystemWatcher.Changed += _fileSystemWatcher_Changed; _fileSystemWatcher.EnableRaisingEvents = true; RefreshJobFromFile(); }
/// <summary> /// Create connector /// </summary> /// <param name="config"></param> /// <param name="httpClient"></param> /// <param name="tokenProvider"></param> public JobOrchestratorClient(IHttpClient httpClient, IAgentConfigProvider config, IIdentityTokenProvider tokenProvider) { _tokenProvider = tokenProvider ?? throw new ArgumentNullException(nameof(tokenProvider)); _config = config ?? throw new ArgumentNullException(nameof(config)); _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient)); }
/// <summary> /// Create worker /// </summary> /// <param name="jobManagerConnector"></param> /// <param name="agentConfigProvider"></param> /// <param name="jobConfigurationFactory"></param> /// <param name="workerInstance"></param> /// <param name="lifetimeScope"></param> /// <param name="logger"></param> /// <param name="agentRepository"></param> public Worker(IJobOrchestrator jobManagerConnector, IAgentConfigProvider agentConfigProvider, IJobSerializer jobConfigurationFactory, int workerInstance, ILifetimeScope lifetimeScope, ILogger logger, IWorkerRepository agentRepository = null) { _agentRepository = agentRepository; _jobConfigurationFactory = jobConfigurationFactory ?? throw new ArgumentNullException(nameof(jobConfigurationFactory)); _lifetimeScope = lifetimeScope ?? throw new ArgumentNullException(nameof(lifetimeScope)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _agentConfigProvider = agentConfigProvider ?? throw new ArgumentNullException(nameof(agentConfigProvider)); _jobManagerConnector = jobManagerConnector ?? throw new ArgumentNullException(nameof(jobManagerConnector)); _workerInstance = workerInstance; _heartbeatInterval = _agentConfigProvider.GetHeartbeatInterval(); _jobCheckerInterval = _agentConfigProvider.GetJobCheckInterval(); _agentConfigProvider.OnConfigUpdated += (s, e) => { _heartbeatInterval = _agentConfigProvider.GetHeartbeatInterval(); _jobCheckerInterval = _agentConfigProvider.GetJobCheckInterval(); }; _lock = new SemaphoreSlim(1, 1); _heartbeatTimer = new Timer(HeartbeatTimer_ElapsedAsync); }
/// <summary> /// Create supervisor /// </summary> /// <param name="lifetimeScope"></param> /// <param name="agentConfigProvider"></param> /// <param name="logger"></param> public WorkerSupervisor(ILifetimeScope lifetimeScope, IAgentConfigProvider agentConfigProvider, ILogger logger) { _lifetimeScope = lifetimeScope; _agentConfigProvider = agentConfigProvider; _logger = logger; _ensureWorkerRunningTimer = new Timer(TimeSpan.FromSeconds(10).TotalMilliseconds); _ensureWorkerRunningTimer.Elapsed += EnsureWorkerRunningTimer_ElapsedAsync; }
/// <summary> /// Get heartbeat interval or default /// </summary> /// <param name="agentConfigProvider"></param> /// <returns></returns> public static TimeSpan GetHeartbeatInterval(this IAgentConfigProvider agentConfigProvider) { var interval = agentConfigProvider?.Config?.HeartbeatInterval; var heartbeat = string.IsNullOrEmpty(agentConfigProvider?.Config?.JobOrchestratorUrl) || interval == null || interval.Value <= TimeSpan.Zero ? TimeSpan.FromSeconds(3) : interval.Value; if (heartbeat > TimeSpan.FromMinutes(1)) { heartbeat = TimeSpan.FromMinutes(1); } return(heartbeat); }
/// <summary> /// Create supervisor /// </summary> /// <param name="lifetimeScope"></param> /// <param name="agentConfigProvider"></param> /// <param name="logger"></param> /// <param name="healthCheckManager">The health check manager to report to</param> /// <param name="timerDelayInSeconds">The time the supervisor is waiting before ensure worker</param> public WorkerSupervisor(ILifetimeScope lifetimeScope, IAgentConfigProvider agentConfigProvider, ILogger logger, IHealthCheckManager healthCheckManager, int timerDelayInSeconds = 10) { if (timerDelayInSeconds <= 0) { timerDelayInSeconds = 10; } _lifetimeScope = lifetimeScope; _agentConfigProvider = agentConfigProvider; _logger = logger; _healthCheckManager = healthCheckManager; _ensureWorkerRunningTimer = new Timer(TimeSpan.FromSeconds(timerDelayInSeconds).TotalMilliseconds); _ensureWorkerRunningTimer.Elapsed += EnsureWorkerRunningTimer_ElapsedAsync; }
/// <summary> /// Get job check interval or default /// </summary> /// <param name="agentConfigProvider"></param> /// <returns></returns> public static TimeSpan GetJobCheckInterval(this IAgentConfigProvider agentConfigProvider) { if (string.IsNullOrEmpty(agentConfigProvider?.Config?.JobOrchestratorUrl)) { return(TimeSpan.FromSeconds(5)); } var interval = agentConfigProvider?.Config?.JobCheckInterval; var jobcheck = interval == null || interval.Value <= TimeSpan.Zero ? TimeSpan.FromSeconds(10) : interval.Value; if (jobcheck > TimeSpan.FromMinutes(10)) { jobcheck = TimeSpan.FromMinutes(10); } return(jobcheck); }
/// <summary> /// Create connector /// </summary> /// <param name="config"></param> /// <param name="httpClient"></param> /// <param name="tokenProvider"></param> /// <param name="serializer"></param> /// <param name="logger"></param> public PublisherOrchestratorClient(IHttpClient httpClient, IAgentConfigProvider config, IIdentityTokenProvider tokenProvider, ISerializer serializer, ILogger logger) { _tokenProvider = tokenProvider ?? throw new ArgumentNullException(nameof(tokenProvider)); _serializer = serializer ?? throw new ArgumentNullException(nameof(serializer)); _config = config ?? throw new ArgumentNullException(nameof(config)); _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); ThreadPool.GetMinThreads(out var workerThreads, out var asyncThreads); if (_config.Config?.MaxWorkers > workerThreads || _config.Config?.MaxWorkers > asyncThreads) { var result = ThreadPool.SetMinThreads(_config.Config.MaxWorkers.Value, _config.Config.MaxWorkers.Value); _logger.Information("Thread pool changed to worker {worker}, async {async} threads {success}", _config.Config.MaxWorkers.Value, _config.Config.MaxWorkers.Value, result ? "succeeded" : "failed"); } }