// @TODO: Does this really belong in here? public Task <ArgosResult> GetState(string id) { ArgosResult rs = _state.ContainsKey(id) ? _state[id] : null; return(Task.FromResult(rs)); }
/// <summary> /// Compare two ArgosResults /// </summary> /// <param name="lhs"></param> /// <param name="rhs"></param> /// <returns>true if lhs and rhs are equal</returns> public static bool IsEqual(ArgosResult lhs, ArgosResult rhs) { if (lhs == null || rhs == null) { return(false); } return(lhs.ArgosId == rhs.ArgosId && IsEqual(lhs.Items, rhs.Items)); }
public Task <ArgosResult> RunAsync() { try { // Clean up finished items _items.RemoveAll(x => x.Output.IntValue("stage") == 5); // Update all items foreach (var item in State) { Update(item); } // Generate new itemsjj if (!_items.Any() /* || _rnd.NextDouble() < 0.3*/) { CreateNewbie(_definition); } } catch (Exception ex) { } finally { _lastRunUtc = DateTime.UtcNow; } var result = new ArgosResult(); result.ArgosId = Id; // Return a copy not our actual items... //result.Items = State.Select(i => i.Copy()).ToList(); result.Items = State.ToList(); return(Task.FromResult(result)); }
/// <summary> /// Return results of Argos instances have been updated /// </summary> /// <returns></returns> public async Task <IEnumerable <ArgosResult> > RunAsync() { var items = new List <ArgosResult>(); foreach (var instance in Instances.Where(a => a.IsDue)) { try { //Log.Debug("Running {type} - {name}", instance.GetType().Name, instance.Id); // Run instance var result = await instance.RunAsync(); await _stateProcessor.ProcessAsync(instance.Definition, result.Items); await _ruleProcessor.ProcessAsync(instance.Definition, result.Items); // Check if state has changed since last time ArgosResult previous = null; if (_state.ContainsKey(instance.Id)) { previous = _state[instance.Id]; } if (!Compare.IsEqual(result, previous)) { items.Add(result); // #hack: dump result Log.Debug(result.ToString()); } _state[instance.Id] = result.Copy(); } catch (Exception ex) { Log.Error(ex, ex.Message); } } #region original //// Get any argos definitions who's heartbeat is due //foreach (var definition in GetDue()) // { // try // { // ArgosResult lastRun; // if (_state.ContainsKey(definition.Id)) // { // lastRun = _state[definition.Id]; // } // else // { // lastRun = new ArgosResult(); // _state.Add(definition.Id, lastRun); // } // var argos = _argos.Single(t => t.GetType().Name == definition.Type); // //Validate(testdefinition, test.Meta); // Log.Debug("Running {type} - {name}", argos.GetType().Name, definition.Id); // var rs = await argos.RunAsync(definition); // foreach(var item in rs.Items) // { // await _stateProcessor.ProcessAsync(definition, item); // await _ruleProcessor.ProcessAsync(definition, item); // } // if (!Compare.ArgosResultsAreEqual(rs, lastRun)) // { // //Log.Information("{argos} '{id}' Has changed: " + rs, // // argos.GetType().Name, // // definition.Id); // items.Add(rs); // } // _state[definition.Id] = rs; // } // catch (Exception ex) // { // Log.Error(ex, ex.Message); // } // } #endregion return(items); }