Beispiel #1
0
def route_create_ensemble_workflow(ensemble):
    dao = Ensembles(g.session)
    e = dao.get_ensemble(g.user.username, ensemble)

    name = request.form.get("name", None)
    if name is None:
        raise EMError("Specify ensemble workflow 'name'")

    priority = request.form.get("priority", 0)

    basedir = request.form.get("basedir")
    if basedir is None:
        raise EMError(
            "Specify 'basedir' where plan command should be executed")

    plan_command = request.form.get("plan_command")
    if plan_command is None:
        raise EMError(
            "Specify 'plan_command' that should be executed to plan workflow")

    dao.create_ensemble_workflow(e.id, name, basedir, priority, plan_command)

    g.session.commit()

    return api.json_created(
        url_for("route_get_ensemble_workflow",
                ensemble=ensemble,
                workflow=name))
Beispiel #2
0
def route_analyze_ensemble_workflow(ensemble, workflow):
    dao = Ensembles(g.session)
    e = dao.get_ensemble(g.user.username, ensemble)
    w = dao.get_ensemble_workflow(e.id, workflow)
    report = "".join(analyze(w))
    resp = make_response(report, 200)
    resp.headers["Content-Type"] = "text/plain"
    return resp
Beispiel #3
0
def route_update_ensemble_workflow(ensemble, workflow):
    dao = Ensembles(g.session)

    e = dao.get_ensemble(g.user.username, ensemble)
    w = dao.get_ensemble_workflow(e.id, workflow)

    priority = request.form.get("priority", None)
    if priority is not None:
        w.set_priority(priority)

    state = request.form.get("state", None)
    if state is not None:
        w.change_state(state)

    w.set_updated()

    g.session.commit()

    return api.json_response(w.get_detail_object())
Beispiel #4
0
def route_delete_trigger(ensemble, trigger):
    # verify that ensemble exists for user
    e_dao = Ensembles(g.session)

    # raises EMError code 404 if does not exist
    ensemble_id = e_dao.get_ensemble(g.user.username, ensemble).id

    # update trigger state to be STOPPED so that the TriggerManager can
    # handle it appropriately
    t_dao = Triggers(g.session)

    # make sure get_trigger raises 404 if nothing found
    trigger_id = t_dao.get_trigger(ensemble_id, trigger).id
    t_dao.update_state(ensemble_id, trigger_id)

    # TODO: what to return here
    # return HTTP code that represents that it was successful and that nothing
    # is to returned
    # status code 204, nothing else to return
    return "hello world from delete_trigger!"
Beispiel #5
0
def route_create_trigger(ensemble, trigger):
    # verify that ensemble exists for user
    e_dao = Ensembles(g.session)

    # raises EMError code 404 if does not exist
    ensemble_id = e_dao.get_ensemble(g.user.username, ensemble).id

    # create trigger entry in db
    t_dao = Triggers(g.session)

    trigger_type = request.form.get("type")
    kwargs = {
        "ensemble_id": ensemble_id,
        "trigger": trigger,
        "trigger_type": trigger_type,
        "workflow_script": request.form.get("workflow_script"),
        "workflow_args": json.loads(request.form.get("workflow_args")),
    }

    if trigger_type == TriggerType.CRON.value:
        # add cron trigger specific parameters
        kwargs["interval"] = request.form.get("interval")
        kwargs["timeout"] = request.form.get("timeout")
    elif trigger_type == TriggerType.FILE_PATTERN.value:
        # add file pattern specific parameters
        kwargs["interval"] = request.form.get("interval")
        kwargs["timeout"] = request.form.get("timeout")
        kwargs["file_patterns"] = json.loads(request.form.get("file_patterns"))
    else:
        raise NotImplementedError(
            "encountered unsupported trigger type: {}".format(trigger_type))

    t_dao.insert_trigger(**kwargs)

    # TODO: what to return here
    # return ID that was created, in this case trigger name is sufficient
    # probably code 201
    # use Flask response object and a json object representing an id of the entity
    return "hello world from create_trigger!"
Beispiel #6
0
def route_update_ensemble(name):
    dao = Ensembles(g.session)
    e = dao.get_ensemble(g.user.username, name)

    max_running = request.form.get("max_running", None)
    if max_running is not None:
        e.set_max_running(max_running)

    max_planning = request.form.get("max_planning", None)
    if max_planning is not None:
        e.set_max_planning(max_planning)

    state = request.form.get("state", None)
    if state is not None:
        if state != e.state:
            # TODO Do the necessary state transition
            e.set_state(state)

    e.set_updated()

    g.session.commit()

    return api.json_response(e.get_object())
Beispiel #7
0
def route_get_ensemble(name):
    dao = Ensembles(g.session)
    e = dao.get_ensemble(g.user.username, name)
    result = e.get_object()
    return api.json_response(result)
Beispiel #8
0
def route_get_ensemble_workflow(ensemble, workflow):
    dao = Ensembles(g.session)
    e = dao.get_ensemble(g.user.username, ensemble)
    w = dao.get_ensemble_workflow(e.id, workflow)
    result = w.get_detail_object()
    return api.json_response(result)
Beispiel #9
0
def route_list_ensemble_workflows(name):
    dao = Ensembles(g.session)
    e = dao.get_ensemble(g.user.username, name)
    result = [w.get_object() for w in dao.list_ensemble_workflows(e.id)]
    return api.json_response(result)