Example #1
0
    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)
Example #2
0
    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
Example #3
0
    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'))
Example #4
0
 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)
Example #5
0
    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")
Example #6
0
 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")
Example #7
0
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")
Example #8
0
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")
Example #9
0
    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'))