def test_double_submit(self, subprocess_func): subprocess_func.return_value = MockPopen() user = User.objects.create(username="******") scenario = Scenario.objects.create(xml="123", user=user) simulation = submit(scenario) scenario.refresh_from_db() self.assertEqual(scenario.new_simulation, simulation) self.assertEqual(scenario.new_simulation.pid, "1234") self.assertEqual(scenario.new_simulation.status, Simulation.QUEUED) self.assertEqual(scenario.new_simulation.input_file.read(), "123") self.assertEqual(scenario.new_simulation.last_error_message, "") simulation = submit(scenario) self.assertEqual(simulation, None)
def handle(self, *args, **options): scenario_id = options["scenario_id"] scenario = Scenario.objects.filter(pk=scenario_id).first() if not scenario: print "Scenario %s doesn't exists" return if scenario.new_simulation: print("WARNING: scenario has been submitted already") simulation = submit(scenario) if not simulation: print "Can't submit scenario" return print "Simulation successfully submitted, status: %s" % simulation.status if options["wait"]: print("Waiting for simulation completion") seconds = 0 while simulation.status not in (Simulation.COMPLETE, Simulation.FAILED): time.sleep(1) seconds += 1 if seconds % 30 == 0: print "Waiting %s seconds, status %s" % (seconds, simulation.status) # reload model from the database simulation.refresh_from_db() print "Simulation result: %s" % simulation.status
def post(self, *args, **kwargs): scenario_id = self.kwargs["scenario_id"] scenario = ScenarioModel.objects.get(id=scenario_id) if self.request.user != scenario.user: raise PermissionDenied scenario.name = self.request.POST.get('name', scenario.name) scenario.description = self.request.POST.get('desc', scenario.description) if not self.request.is_ajax() or "save" in self.request.POST and json.loads(self.request.POST["save"]): scenario.save() if self.request.is_ajax(): return JsonResponse({"success": True, "xml": scenario.xml}) if 'submit_type' in self.request.POST and self.request.POST["submit_type"] == "run": # Clicked "Save and Run" button # Will submit a scenario to Simulation Manager here simulation = submit.submit(self.request.user, scenario.xml) if simulation is None: set_notification(self.request, "Can't submit simulation", "alert-danger") else: scenario.simulation = simulation scenario.save() set_notification(self.request, "Successfully started simulation", "alert-success") raise HttpRedirectException(reverse('ts_om.list'))
def test_runtime_error(self, subprocess_func): subprocess_func.side_effect = RuntimeError() user = User.objects.create(username="******") scenario = Scenario.objects.create(xml="123", user=user) simulation = submit(scenario) scenario.refresh_from_db() self.assertEqual(scenario.new_simulation, None) self.assertEqual(simulation, None)
def post(self, request): simulation = submit.submit(request.user, request.read()) sim_id = -1 if simulation: sim_id = simulation.id data = {'sim_id': sim_id} return HttpResponse(json.dumps(data), mimetype="application/json")
def test_ioerror(self, subprocess_func): subprocess_func.side_effect = IOError("IO Error") user = User.objects.create(username="******") scenario = Scenario.objects.create(xml="123", user=user) simulation = submit(scenario) scenario.refresh_from_db() self.assertEqual(scenario.new_simulation, simulation) self.assertEqual(scenario.new_simulation.pid, "") self.assertEqual(scenario.new_simulation.status, Simulation.FAILED) self.assertEqual(scenario.new_simulation.input_file.read(), "123") self.assertEqual(scenario.new_simulation.last_error_message, "Subprocess failed: IO Error")
def submit_scenarios(request): scenarios_data = {"ok": False, "scenarios": []} if not request.user.is_authenticated or not "scenario_ids" in request.POST: return HttpResponse(json.dumps(scenarios_data), content_type="application/json") scenario_ids = json.loads(request.POST["scenario_ids"]) if scenario_ids is None or len(scenario_ids) <= 0: return HttpResponse(json.dumps(scenarios_data), content_type="application/json") for scenario_id in scenario_ids: scenarios_data["scenarios"].append({"id": scenario_id, "ok": False}) scenario = Scenario.objects.get(user=request.user, id=int(scenario_id)) if not scenario or scenario.new_simulation is not None: continue json_str = rest_validate(scenario.xml) validation_result = json.loads(json_str) valid = True if (validation_result['result'] == 0) else False if not valid: continue simulation = submit(scenario) if simulation: # scenario.simulation = simulation # scenario.save() scenarios_data["ok"] = True # scenarios_data["ok"] = True return HttpResponse(json.dumps(scenarios_data), content_type="application/json")
def submit_scenarios(request): scenarios_data = {"ok": False, "scenarios": []} if not request.user.is_authenticated() or not "scenario_ids" in request.POST: return HttpResponse(json.dumps(scenarios_data), content_type="application/json") scenario_ids = json.loads(request.POST["scenario_ids"]) if scenario_ids is None or len(scenario_ids) <= 0: return HttpResponse(json.dumps(scenarios_data), content_type="application/json") for scenario_id in scenario_ids: scenarios_data["scenarios"].append({"id": scenario_id, "ok": False}) scenario = Scenario.objects.get(user=request.user, id=int(scenario_id)) if not scenario or scenario.simulation is not None: continue json_str = rest_validate(scenario.xml) validation_result = json.loads(json_str) valid = True if (validation_result['result'] == 0) else False if not valid: continue simulation = submit(request.user.username, scenario.xml) if simulation: scenario.simulation = simulation scenario.save() scenarios_data["scenarios"][-1]["ok"] = True scenarios_data["ok"] = True return HttpResponse(json.dumps(scenarios_data), content_type="application/json")
def post(self, *args, **kwargs): scenario_id = self.kwargs["scenario_id"] scenario = ScenarioModel.objects.get(id=scenario_id) scenario.name = self.request.POST.get('name', scenario.name) scenario.description = self.request.POST.get('desc', scenario.description) xml = self.request.POST.get('xml', scenario.xml) result = get_xml_validation_errors(xml, skip_openmalaria_validation=True) if result is not None: set_notification(self.request, "Invalid XML: %s. Changes not recorded" % result, DANGER) return HttpResponseRedirect(reverse("ts_om.summary", kwargs={"scenario_id": scenario_id})) scenario.xml = xml scenario.save() if 'submit_run' in self.request.POST: # Clicked "Save and Run" button # Will submit a scenario to backend here simulation = submit.submit(scenario) if simulation is None: set_notification(self.request, "Can't submit simulation", "alert-danger") else: set_notification(self.request, "Successfully started simulation", "alert-success") set_notification(self.request, "Successfully saved scenario", "alert-success") return HttpResponseRedirect(reverse('ts_om.list'))