Пример #1
0
        public IObservable <IRxn> OnAppHeartBeat(IAppStatusManager updates, SystemStatusEvent app, object[] meta)
        {
            var heartBeat = new TestArenaWorkerHeadbeat()
            {
                Route        = RouteExtensions.GetRoute(app),
                Name         = app.SystemName,
                IpAddress    = app.IpAddress,
                Host         = ParseValueFromMetaWithId("Id", meta),
                Workers      = ParseValueFromMetaWithId("Free Workers", meta),
                ComputerName = ParseValueFromMetaWithId("ComputerName", meta),
                UserName     = ParseValueFromMetaWithId("UserName", meta),
                Tags         = ParseValueFromMetaWithId(bfgTagWorkflow.WorkerTag, meta)
            };

            //update info / tags
            var workerInfoUpdate = new WorkerInfoUpdated()
            {
                Name = app.SystemName,
                Info = ToInfo(meta)
            };

            BalanceRemoteWorkersWithCluster(heartBeat, app, meta);

            return(new IRxn[] { heartBeat, workerInfoUpdate }.ToObservableSequence());
        }
Пример #2
0
 private WorkerDiscovered <StartUnitTest, UnitTestResult> GenerateWorker(SystemStatusEvent app, object[] meta, string id)
 {
     return(new WorkerDiscovered <StartUnitTest, UnitTestResult>() // 8-|
     {
         Worker = new bfgWorkerRxnManagerBridge(_appCmds, _rxnManager, _appUpdates, ToInfo(meta))
         {
             Route = RouteExtensions.GetRoute(app),
             Name = $"{app.SystemName}_{Guid.NewGuid().ToString().Split('-').FirstOrDefault()}",
             Ip = app.IpAddress,
         }
     });
 }
Пример #3
0
        private void BalanceRemoteWorkersWithCluster(TestArenaWorkerHeadbeat next, SystemStatusEvent app, object[] meta)
        {
            if (app.SystemName.BasicallyContains("TestArena"))
            {
                return; //dont track our node or bad things will happen!
            }
            var theWorkersWeThinkTheNoteHas = _cluster.Workers.Where(c => c.Value.Worker.Route.Equals(Rxns.RouteExtensions.GetRoute(app)))
                                              .Select(r => r.Key)//this could potentially cause GC issues with large worker counts
                                              .ToArray();

            var theCurrentWorkersOnNode     = next.Workers.Split("/").Last().AsInt();
            var workerExpectedVsCurrentDiff = theCurrentWorkersOnNode - theWorkersWeThinkTheNoteHas.Length;

            if (workerExpectedVsCurrentDiff > 0)
            {
                do
                {
                    _workerPool.Process(GenerateWorker(app, meta, workerExpectedVsCurrentDiff.ToString())).WaitR();
                } while (--workerExpectedVsCurrentDiff > 0);
            }

            else if (workerExpectedVsCurrentDiff < 0)
            {
                foreach (var worker in theWorkersWeThinkTheNoteHas)
                {
                    _workerPoolD.Process(new WorkerDisconnected()
                    {
                        Name = worker
                    }).WaitR();

                    if (--workerExpectedVsCurrentDiff >= 0)
                    {
                        break;
                    }
                }
            }
        }
Пример #4
0
 /// <summary>
 /// Updates apps that connect to the
 /// </summary>
 /// <param name="updates"></param>
 /// <param name="app"></param>
 /// <returns></returns>
 public IObservable <IRxn> OnNewAppDiscovered(IAppStatusManager updates, SystemStatusEvent app, object[] meta)
 {
     return(OnAppHeartBeat(updates, app, meta));
 }