public IActionResult CreateStub([FromBody] ExperimentCreateDto requestData) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } if (requestData.Parameters.Select(p => p.Name).Distinct().Count() != requestData.Parameters.Count) { return(BadRequest("Parameter names are not unique.")); } // Create the experiment. var experiment = new Experiment { Created = DateTime.UtcNow, Script = requestData.Script, ScriptInstall = requestData.ScriptInstall, Parameters = new List <Parameter>(), RequiredCapabilities = requestData.RequiredCapabilities, Language = requestData.Language, PermutationFilter = requestData.PermutationFilter, Repetitions = requestData.Repetitions, RunName = requestData.RunName, FileName = requestData.FileName, Timeout = 60 // in minutes }; // Create parameters and parameter values. foreach (var parameterDto in requestData.Parameters) { var experimentParam = new Parameter { Name = parameterDto.Name, Type = parameterDto.Type, Purpose = parameterDto.Purpose, Unit = parameterDto.Unit, Experiment = experiment, Values = new List <ParameterValue>() }; experiment.Parameters.Add(experimentParam); } // Add everything to the database. _context.Add(experiment); _context.SaveChanges(); /* Create folder and copy relevant files (persistent snapshot) * after storing in database (storing generates the experimentId) */ CreatePersistentSnapshotFolder(experiment); return(new ObjectResult(new { ExperimentId = experiment.Id })); }
public IActionResult Create([FromBody] ExperimentCreateDto requestData) { /* Performance statistics */ Stopwatch sw = new Stopwatch(); sw.Start(); if (!ModelState.IsValid) { return(BadRequest(ModelState)); } if (requestData.Parameters.Select(p => p.Name).Distinct().Count() != requestData.Parameters.Count) { return(BadRequest("Parameter names are not unique.")); } if (!requestData.Parameters.All(p => p.Values.All(v => ParameterValidator.IsValid(p.Type, v)))) { return(BadRequest("Parameter values are not valid.")); } string errMsg = ""; string msg = ""; if (!ExecuteLocalMACIScript(requestData.FileName, ref msg, ref errMsg)) { return(new ObjectResult(new { Failed = true, Message = msg, ErrorMessage = errMsg })); } // Create the experiment. var experiment = new Experiment { Created = DateTime.UtcNow, Script = requestData.Script, ScriptInstall = requestData.ScriptInstall, Parameters = new List <Parameter>(), RequiredCapabilities = requestData.RequiredCapabilities, Language = requestData.Language, PermutationFilter = requestData.PermutationFilter, Repetitions = requestData.Repetitions, RunName = requestData.RunName, FileName = requestData.FileName, Timeout = 60 // in minutes }; // Create parameters and parameter values. foreach (var parameterDto in requestData.Parameters) { var experimentParam = new Parameter { Name = parameterDto.Name, Type = parameterDto.Type, Purpose = parameterDto.Purpose, Unit = parameterDto.Unit, Experiment = experiment, Values = new List <ParameterValue>() }; experiment.Parameters.Add(experimentParam); foreach (var value in parameterDto.Values) { experimentParam.Values.Add(new ParameterValue { Parameter = experimentParam, Value = value }); } } AddSeedParameter(experiment, requestData.Seeds); // Create one ExperimentInstance for each unique combination of parameters. var instances = FindAllInstancePermutations(experiment.Parameters); TimeSpan ts = sw.Elapsed; Console.WriteLine("Generated " + instances.Count() + " experiment instances in " + String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds)); try { instances = FilterPermutations(instances, experiment.PermutationFilter); } catch (Exception e) { return(BadRequest(e.Message)); } ts = sw.Elapsed; Console.WriteLine("Filtered to " + instances.Count() + " experiment instances in " + String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds)); instances = DuplicateExperimentInstances(instances, requestData.Repetitions); if (!instances.Any()) { return(BadRequest("No experiment instances generated after filtering and duplicating.")); } if (requestData.TestRun) { instances = instances.Take(1).ToList(); instances.ForEach(i => i.Priority = 100); experiment.RunName = "TEST: " + experiment.RunName; } experiment.ExperimentInstances = instances; // Add everything to the database. _context.Add(experiment); _context.SaveChanges(); /* Event logging */ TimeSpan totalTime = sw.Elapsed; _context.Add(new GlobalEventLogMessage { Message = String.Format("Created Experiment {0:0} with {1:0} instances in {2:00}:{3:00}:{4:00}", experiment.Id, experiment.ExperimentInstances.Count(), totalTime.Hours, totalTime.Minutes, totalTime.Seconds), ExperimentId = experiment.Id, Time = DateTime.Now, Type = GlobalEventLogMessageType.Info, ExperimentInstanceId = -1 }); _context.SaveChanges(); /* Create folder and copy relevant files (persistent snapshot) * after storing in database (storing generates the experimentId) */ CreatePersistentSnapshotFolder(experiment); _scalingService.Scale(experiment); return(new ObjectResult(new { ExperimentId = experiment.Id, ExperimentInstanceId = experiment.ExperimentInstances.First().Id })); }