public void KeepAlive() { //IConsumerContext ctx = AppUtility.GetConsumerContext(); //Guid consumerId = ctx.Id; Debug.WriteLine(String.Format("KeepAlive Consumer {0}", run.ConsumerId), this.GetType().Name); using (ProducerContext db = new ProducerContext()) { var consumer = db.Consumers.Single <JobConsumer>(s => s.Id == run.ConsumerId); if (consumer.status.Equals("up")) { consumer.keepalive = DateTime.UtcNow; try { db.SaveChanges(); } catch (System.Data.Entity.Validation.DbEntityValidationException e) { foreach (var eve in e.EntityValidationErrors) { Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", eve.Entry.Entity.GetType().Name, eve.Entry.State); foreach (var ve in eve.ValidationErrors) { Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage); } } throw; } } } }
public Guid CreateGenerator(Guid sessionid) { Guid generator = Guid.NewGuid(); using (var db = new ProducerContext()) { Debug.WriteLine("Looking for session: " + sessionid.ToString(), "ProducerSessionContract.CreateGenerator"); //var jobs = db.Jobs.Where<Job>(j => j.SessionId == sessionid); Session session = db.Sessions.Single <Session>(s => s.Id == sessionid); Debug.WriteLine("Result for session: " + sessionid.ToString(), "ProducerSessionContract.CreateGenerator"); if (session != null) { Debug.WriteLine("Found the session", "ProducerSessionContract.CreateGenerator"); db.Generators.Add(new Generator() { Id = generator, SessionId = sessionid, Page = 0, Create = DateTime.UtcNow }); } else { Debug.WriteLine(String.Format("InputError: This Session Id doesn't exist"), this.GetType()); return(Guid.Empty); } db.SaveChanges(); } return(generator); }
/// <summary> /// Delete moves all jobs to cancel or terminate, then safely deletes them. /// </summary> /// <param name="session"></param> /// <returns></returns> public int Delete(Guid session) { int num = 0; int count = 0; num += Cancel(session); num += Terminate(session); using (var db = new ProducerContext()) { Session obj = db.Sessions.Single <Session>(s => s.Id == session); foreach (Job j in obj.Jobs) { db.Processes.Remove(j.Process); db.Messages.RemoveRange(j.Messages); db.StagedInputFiles.RemoveRange(j.StagedInputFiles); db.StagedOutputFiles.RemoveRange(j.StagedOutputFiles); db.GeneratorJobs.RemoveRange(db.GeneratorJobs.Where(g => g.JobId == j.Id)); } db.Generators.RemoveRange(db.Generators.Where(g => g.SessionId == obj.Id)); db.Jobs.RemoveRange(obj.Jobs); db.Sessions.Remove(obj); db.SaveChanges(); } return(count); }
void SetOutput(string data) { using (ProducerContext db = new ProducerContext()) { var entity = db.Processes.Single(s => s.Id == id); entity.Output = data; try { db.SaveChanges(); } catch (System.Data.Entity.Validation.DbEntityValidationException e) { foreach (var eve in e.EntityValidationErrors) { Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", eve.Entry.Entity.GetType().Name, eve.Entry.State); foreach (var ve in eve.ValidationErrors) { Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage); } } throw; } } }
/// <summary> /// Assume that state of jobs cannot be changed during this call. Therefore /// if one of them has the behavior is undefined. /// </summary> /// <param name="session"></param> /// <returns></returns> public int Unpause(Guid session) { int num = 0; using (ProducerContext db = new ProducerContext()) { Session obj = db.Sessions.Single <Session>(s => s.Id == session); foreach (var job in obj.Jobs.Where(s => s.State == "pause")) { try { job.State = "submit"; job.Submit = DateTime.UtcNow; num += 1; } catch (Exception ex) { Debug.WriteLine(String.Format("Failed to unpause session {0} job {1} ", session, job.Id), this.GetType()); } } db.SaveChanges(); } return(num); }
public void TestProcess_Empty() { Guid jobId = Guid.NewGuid(); using (var db = new ProducerContext()) { var item = db.Sessions.Single(s => s.Id == sessionId); var user = db.Users.Single(u => u.Name == userName); var simulation = db.Simulations.Single(s => s.Name == simulationName); var job = new Turbine.Data.Entities.Job { Id = jobId, Session = item, Create = DateTime.UtcNow, State = "create", User = user, Simulation = simulation }; db.Jobs.Add(job); db.SaveChanges(); } using (var db = new ProducerContext()) { var item = db.Jobs.Single(s => s.Id == jobId); item.Process = new Turbine.Data.Entities.Process { }; db.SaveChanges(); } }
internal static int StopConsumer(Guid consumerID) { // 0 Failed to stop the consumer // -1 Consumer is already down // 1 Succeeded to stop the consumer Debug.WriteLine("Stopping consumer", "DataMarshall.StopConsumer"); int stopped = 0; using (var db = new ProducerContext()) { var entity = db.Consumers.Single(c => c.Id == consumerID); if (entity != null) { if (entity.status != "down") { Debug.WriteLine("Changing status to down", "DataMarshall.StopConsumer"); entity.status = "down"; stopped = 1; } else { Debug.WriteLine("Consumer is already down", "DataMarshall.StopConsumer"); stopped = -1; } } db.SaveChanges(); } return(stopped); }
internal static bool DeleteGenerator(Guid generatorid) { bool deleted = false; using (var db = new ProducerContext()) { db.GeneratorJobs.RemoveRange(db.GeneratorJobs.Where(g => g.GeneratorId == generatorid)); db.Generators.RemoveRange(db.Generators.Where(g => g.Id == generatorid)); Debug.WriteLine("Delete Generators: " + db.Generators.Any(g => g.Id == generatorid).ToString() + ", Delete GeneratorJobs: " + db.GeneratorJobs.Any(g => g.GeneratorId == generatorid).ToString(), "DataMarshall.DeleteGenerator"); deleted = !(db.Generators.Any(g => g.Id == generatorid) || db.GeneratorJobs.Any(g => g.GeneratorId == generatorid)); db.SaveChanges(); } using (var db = new ProducerContext()) { Debug.WriteLine("Delete Generators: " + db.Generators.Any(g => g.Id == generatorid).ToString() + ", Delete GeneratorJobs: " + db.GeneratorJobs.Any(g => g.GeneratorId == generatorid).ToString(), "DataMarshall.DeleteGenerator"); deleted = !(db.Generators.Any(g => g.Id == generatorid) || db.GeneratorJobs.Any(g => g.GeneratorId == generatorid)); } return(deleted); }
public IJobQueue Register(IConsumerRun run) { this.run = run; IConsumerContext ctx = Turbine.Consumer.AppUtility.GetConsumerContext(); //Guid consumerId = ctx.Id; //Guid consumerId = Guid.NewGuid(); String hostname = ctx.Hostname; String appName = run.SupportedApplications.ElementAtOrDefault(0); Debug.WriteLine(String.Format("Register({0}) as {1}, {2}", appName, run.ConsumerId, hostname), this.GetType().Name); using (ProducerContext db = new ProducerContext()) { // TODO: Registering as a single application is dubious. // IF support multiple apps in single consumer need to expose that via the database ( update SCHEMA!! ) var app = db.Applications.Single(a => a.Name == appName); var consumer = new Turbine.Data.Entities.JobConsumer { Application = app, Id = run.ConsumerId, hostname = hostname, processId = System.Diagnostics.Process.GetCurrentProcess().Id, keepalive = DateTime.UtcNow, status = "up" }; db.Consumers.Add(consumer); db.SaveChanges(); } queue = AppUtility.GetJobQueue(run); //((DBJobQueue)queue).consumerId = consumerId; return(queue); }
/* * public void AddStderr(string data) * { * using (TurbineCompactDatabase container = new TurbineCompactDatabase()) * { * SinterProcess entity = container.SinterProcesses.Single<SinterProcess>(s => s.Id == id); * byte[] stdout = entity.Stderr; * if (stdout == null) * entity.Stderr = System.Text.Encoding.ASCII.GetBytes(data); * else * { * List<byte> list = new List<byte>(entity.Stderr); * list.AddRange(System.Text.Encoding.ASCII.GetBytes(data)); * entity.Stderr = list.ToArray<byte>(); * } * container.SaveChanges(); * } * } */ private void SetInput(string data) { using (ProducerContext db = new ProducerContext()) { var entity = db.Processes.Single(s => s.Id == id); entity.Input = data; db.SaveChanges(); } }
public void SetStatus(int status) { using (ProducerContext db = new ProducerContext()) { var entity = db.Processes.Single(s => s.Id == id); entity.Status = status; db.SaveChanges(); } }
/// <summary> /// If state is "up" move to "down", else leave alone. /// </summary> public void UnRegister() { //IConsumerContext ctx = AppUtility.GetConsumerContext(); //Guid consumerId = ctx.Id; Debug.WriteLine(String.Format("UnRegister Consumer {0}", run.ConsumerId), this.GetType().Name); using (ProducerContext db = new ProducerContext()) { var consumer = db.Consumers.Single <JobConsumer>(s => s.Id == run.ConsumerId); if (consumer.status.Equals("up")) { consumer.status = "down"; try { db.SaveChanges(); } catch (System.Data.Entity.Validation.DbEntityValidationException e) { foreach (var eve in e.EntityValidationErrors) { Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", eve.Entry.Entity.GetType().Name, eve.Entry.State); foreach (var ve in eve.ValidationErrors) { Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage); } } throw; } } foreach (var job in consumer.Jobs.Where(j => j.State == "locked" || j.State == "setup" || j.State == "running")) { Debug.WriteLine(String.Format("Moving job {0},{1} to state submit", job.Count, job.State)); job.Messages.Add(new Message { Create = DateTime.UtcNow, Id = Guid.NewGuid(), Value = String.Format("Resubmit (Id={0},State={1}): UnRegister Consumer {2}", job.Id, job.State, consumer.Id) }); job.State = "submit"; //job.Consumer = null; db.SaveChanges(); } } }
public Turbine.Data.Contract.Behaviors.IProcess Setup() { string baseDir = AppUtility.GetAppContext().BaseWorkingDirectory; Guid pid = Guid.Empty; using (ProducerContext db = new ProducerContext()) { var job = db.Jobs.Single(j => j.Count == id); var consumer = job.Consumer; if (consumer == null) { throw new IllegalAccessException("Setup failed, Consumer is not registered"); } if (consumer.status != "up") { throw new IllegalAccessException(String.Format( "Setup failed, Consumer status {0} != up", consumer.status)); } if (job.ConsumerId != ConsumerId) { throw new IllegalAccessException(String.Format( "job({0}) consumer access denied {1} != {2}", job.Id, job.ConsumerId, ConsumerId) ); } Debug.WriteLine(String.Format("Setup consumer GUID {0}", consumer.Id), this.GetType().Name); if (job.State != "locked") { throw new InvalidStateChangeException("Violation of state machine"); } if (job.Process == null) { throw new InvalidStateChangeException("Process configuration missing"); } processId = job.Process.Id; job.State = "setup"; job.Setup = DateTime.UtcNow; job.Process.WorkingDir = System.IO.Path.Combine(baseDir, id.ToString()); job.Consumer = (JobConsumer)consumer; job.Messages.Add(new Turbine.Data.Entities.Message { Id = Guid.NewGuid(), Create = DateTime.UtcNow, Value = String.Format("event=setup,consumer={0}", consumer.Id) }); pid = job.Process.Id; simulationName = job.Simulation.Name; db.SaveChanges(); } state = States.SETUP; return(Turbine.DataEF6.Contract.ProcessContract.Get(pid)); }
static bool AddUser(string username, string token) { using (ProducerContext container = new ProducerContext()) { Turbine.Data.Entities.User entity = new Turbine.Data.Entities.User(); entity.Name = username; entity.Token = token; container.Users.Add(entity); container.SaveChanges(); } return(true); }
public static void ClassInit(TestContext context) { BaseDatabaseTest.CleanUpDatabase(); using (var db = new ProducerContext()) { var app = new Turbine.Data.Entities.Application { Name = "ACM", Version = "7.3" }; db.Applications.Add(app); var user = new Turbine.Data.Entities.User { Name = username }; db.Users.Add(user); db.SaveChanges(); } using (var db = new ProducerContext()) { var item = db.Applications.Single(s => s.Name == "ACM"); item.InputFileTypes.Add(new Turbine.Data.Entities.InputFileType { Id = Guid.NewGuid(), Name = "configuration", Required = true, Type = "plain/text" }); item.InputFileTypes.Add(new Turbine.Data.Entities.InputFileType { Id = Guid.NewGuid(), Name = "aspenfile", Required = true, Type = "plain/text" }); db.SaveChanges(); } using (var db = new ProducerContext()) { var app = db.Applications.Single(s => s.Name == "ACM"); var user = db.Users.Single(u => u.Name == username); var sim = new Turbine.Data.Entities.Simulation { Id = Guid.NewGuid(), Application = app, Create = DateTime.UtcNow, Name = "Test", Update = DateTime.UtcNow, User = user }; db.Simulations.Add(sim); db.SaveChanges(); } }
public void TestSession_No_Create() { // Session using (var db = new ProducerContext()) { var item = new Turbine.Data.Entities.Session { Id = Guid.NewGuid(), Description = "testing simulation" }; db.Sessions.Add(item); db.SaveChanges(); } }
static bool UpdateUser(string username, string token) { using (ProducerContext container = new ProducerContext()) { Turbine.Data.Entities.User user = container.Users.SingleOrDefault <Turbine.Data.Entities.User>(s => s.Name == username); if (user == null) { return(false); } user.Token = token; container.SaveChanges(); } return(true); }
public void Message(string msg) { Message w = new Message() { Id = Guid.NewGuid(), Value = msg, Create = DateTime.UtcNow }; using (ProducerContext db = new ProducerContext()) { Job obj = db.Jobs.Single <Job>(s => s.Count == id); obj.Messages.Add(w); db.SaveChanges(); } }
public void Error() { //IConsumerContext ctx = AppUtility.GetConsumerContext(); //Guid consumerId = ctx.Id; Debug.WriteLine(String.Format("Error as {0}, {1}", run.ConsumerId), this.GetType().Name); using (ProducerContext db = new ProducerContext()) { var consumer = db.Consumers.Single <JobConsumer>(s => s.Id == run.ConsumerId); if (!consumer.status.Equals("error")) { consumer.status = "error"; db.SaveChanges(); } } }
/// <summary> /// /// </summary> /// <returns></returns> public Guid Create() { Guid session = Guid.NewGuid(); string owner = Container.GetAppContext().UserName; using (var db = new ProducerContext()) { User user = db.Users.Single <User>(s => s.Name == owner); db.Sessions.Add(new Session() { Id = session, User = user, Create = DateTime.UtcNow }); db.SaveChanges(); } return(session); }
public void TestJob_NoUser() { using (var db = new ProducerContext()) { var item = db.Sessions.Single(s => s.Id == sessionId); var app = db.Applications.Single(a => a.Name == "ACM"); var consumer = new Turbine.Data.Entities.JobConsumer { Id = Guid.NewGuid(), keepalive = DateTime.UtcNow, status = "up", Application = app }; var user = db.Users.Single(u => u.Name == userName); var simulation = db.Simulations.Single(s => s.Name == simulationName); var job = new Turbine.Data.Entities.Job { Id = Guid.NewGuid(), Session = item, Create = DateTime.UtcNow, State = "create", //User = user, Consumer = consumer, Simulation = simulation }; db.Jobs.Add(job); try { db.SaveChanges(); } catch (System.Data.Entity.Validation.DbEntityValidationException e) { foreach (var eve in e.EntityValidationErrors) { Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", eve.Entry.Entity.GetType().Name, eve.Entry.State); foreach (var ve in eve.ValidationErrors) { Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage); } } throw; } } }
public static IProcess New(int jobid) { Guid id = Guid.Empty; using (ProducerContext db = new ProducerContext()) { var entity = new Turbine.Data.Entities.Process() { }; entity.Job = db.Jobs.Single <Turbine.Data.Entities.Job>(s => s.Count == jobid); db.Processes.Add(entity); id = entity.Id; db.SaveChanges(); } return(new ProcessContract() { id = id }); }
public void AddStdout(string data) { using (ProducerContext db = new ProducerContext()) { Turbine.Data.Entities.Process entity = db.Processes.Single(s => s.Id == id); if (entity.Stdout == null) { entity.Stdout = data; } else { StringBuilder sb = new StringBuilder(); sb.Append(entity.Stdout); sb.Append(data); entity.Stdout = sb.ToString(); } db.SaveChanges(); } }
public int Submit(Guid session) { string user = Container.GetAppContext().UserName; int num = 0; using (ProducerContext db = new ProducerContext()) { Session obj = db.Sessions.Single <Session>(s => s.Id == session); Debug.WriteLine(String.Format("start session {0}, jobs {1}", session, obj.Jobs.Count()), this.GetType().Name); foreach (var job in obj.Jobs.Where(s => s.State == "create" & s.User.Name == user)) { num += 1; job.State = "submit"; job.Submit = DateTime.UtcNow; } db.SaveChanges(); } return(num); }
public void Running() { using (ProducerContext db = new ProducerContext()) { Job obj = db.Jobs.Single <Job>(s => s.Count == id); if (obj.ConsumerId != ConsumerId) { throw new IllegalAccessException(String.Format( "job({0}) consumer access denied {1} != {2}", obj.Id, obj.ConsumerId, ConsumerId) ); } Debug.WriteLine("obj.State : " + obj.State, "ConsumerJobContract.Running"); if (obj.State != "setup") { throw new InvalidStateChangeException("Violation of state machine"); } if (obj.Process == null) { throw new InvalidStateChangeException("Process configuration missing"); } if (obj.Process.WorkingDir == null) { throw new InvalidStateChangeException("Process configuration missing working directory"); } if (obj.Process.Input == null) { throw new InvalidStateChangeException("Process configuration missing Input BLOB"); } obj.State = "running"; obj.Running = DateTime.UtcNow; obj.Messages.Add(new Turbine.Data.Entities.Message { Id = Guid.NewGuid(), Create = DateTime.UtcNow, Value = String.Format("event=running,consumer={0}", obj.ConsumerId) }); db.SaveChanges(); } state = States.RUNNING; }
public void Kill() { using (var db = new ProducerContext()) { var entity = db.Jobs.Single <Turbine.Data.Entities.Job>(j => j.Count == Id); if (new List <string>() { "create", "submit", "locked", "setup", "running", "terminate" }.Contains <string>(entity.State)) { entity.State = "down"; entity.Finished = DateTime.UtcNow; db.SaveChanges(); } else { throw new InvalidStateChangeException(String.Format("Cannot kill a job in state {0}", entity.State)); } } }
/// <summary> /// Ignore concurrency exception /// </summary> /// <param name="session"></param> /// <returns></returns> public int Cancel(Guid session) { int num = 0; using (ProducerContext db = new ProducerContext()) { Session obj = db.Sessions.First <Session>(s => s.Id == session); /* * foreach (var job in obj.Jobs.Where(s => s.State == "create" || s.State == "submit")) * { * IJobProducerContract contract = new ProducerAspenJobContract(job.Id); * try * { * contract.Cancel(); * num += 1; * } * catch (AuthorizationError ex) * { * Debug.WriteLine(String.Format("AuthorizationError({0}): Failed to cancel session {1} job {2} ", ex.Message, session, job.Id), * this.GetType()); * throw; * } * catch (Exception ex) * { * Debug.WriteLine(String.Format("Failed to cancel session {0} job {1} ", session, job.Id), * this.GetType()); * } * } */ foreach (Job job in obj.Jobs.OrderByDescending(s => s.Submit).Where(s => s.State == "create" || s.State == "submit")) { job.State = "cancel"; job.Finished = DateTime.UtcNow; } db.SaveChanges(); } return(num); }
public void TestProcess_Full() { Guid jobId = Guid.NewGuid(); using (var db = new ProducerContext()) { var item = db.Sessions.Single(s => s.Id == sessionId); var user = db.Users.Single(u => u.Name == userName); var simulation = db.Simulations.Single(s => s.Name == simulationName); var job = new Turbine.Data.Entities.Job { Id = jobId, Session = item, Create = DateTime.UtcNow, State = "create", User = user, Simulation = simulation }; db.Jobs.Add(job); db.SaveChanges(); } using (var db = new ProducerContext()) { var item = db.Jobs.Single(s => s.Id == jobId); item.Process = new Turbine.Data.Entities.Process { Input = "Input string", Output = "Output string", WorkingDir = "MYDIR", Status = -1, Stdin = "", Stderr = "", Stdout = "" }; db.SaveChanges(); } }
public void Error(string msg) { using (ProducerContext db = new ProducerContext()) { Job obj = db.Jobs.Single <Job>(s => s.Count == id); if (obj.ConsumerId != ConsumerId) { throw new IllegalAccessException(String.Format( "job({0}) consumer access denied {1} != {2}", obj.Id, obj.ConsumerId, ConsumerId) ); } //Debug.WriteLine("Error: " + msg, "ConsumerJobContract.Error"); if (!obj.State.Equals("running") && !obj.State.Equals("setup") && !obj.State.Equals("error")) { throw new InvalidStateChangeException(String.Format("Violation of state machine: job id={0},state={1} cannot be moved to error", obj.Id, obj.State)); } if (!obj.State.Equals("error")) { obj.State = "error"; state = States.ERROR; obj.Finished = DateTime.UtcNow; } if (msg.Length > 3800) { msg = msg.Substring(0, 3800); } obj.Messages.Add(new Turbine.Data.Entities.Message { Id = Guid.NewGuid(), Create = DateTime.UtcNow, Value = String.Format("event=error,consumer={0},msg=\"{1}\"", obj.ConsumerId, msg) }); db.SaveChanges(); } }
public bool Delete() { Debug.WriteLine(String.Format( "Deleting Simulation '{0}' Id '{1}'", name, simId.ToString()), "ProducerSimulationContract.Delete()"); using (var db = new ProducerContext()) { foreach (var entity in db.Simulations.Where <Simulation>(s => s.Id == simId)) { foreach (var jobEntity in db.Jobs.Where(s => s.SimulationId == entity.Id)) { db.Processes.Remove(jobEntity.Process); db.Messages.RemoveRange(jobEntity.Messages); db.StagedInputFiles.RemoveRange(jobEntity.StagedInputFiles); db.StagedOutputFiles.RemoveRange(jobEntity.StagedOutputFiles); db.GeneratorJobs.RemoveRange(db.GeneratorJobs.Where(g => g.JobId == jobEntity.Id)); db.Generators.RemoveRange(db.Generators.Where(g => g.SessionId == jobEntity.SessionId)); Session session = db.Sessions.Single <Session>(s => s.Id == jobEntity.SessionId); db.Jobs.Remove(jobEntity); if (session.Jobs.Count == 0) { db.Sessions.Remove(session); } } Debug.WriteLine(String.Format( "Simulation '{0}' Id '{1}' removed", name, simId.ToString()), "ProducerSimulationContract.Delete()"); db.Simulations.Remove(entity); } db.SaveChanges(); } return(true); }