/// <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();
        }
示例#2
0
 /// <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));
 }
示例#3
0
        /// <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");
            }
        }