示例#1
0
        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
            }));
        }
示例#2
0
        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
            }));
        }