summaryrefslogtreecommitdiff
path: root/opendc/api/v1/simulations/simulationId/experiments/endpoint.py
blob: 86fadb2440b274725883bddafb0817c78a4cee5a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
from opendc.models.experiment import Experiment
from opendc.models.simulation import Simulation
from opendc.util import exceptions
from opendc.util.rest import Response


def GET(request):
    """Get this Simulation's Experiments."""

    # Make sure required parameters are there

    try:
        request.check_required_parameters(
            path={
                'simulationId': 'int'
            }
        )

    except exceptions.ParameterError as e:
        return Response(400, e.message)

    # Instantiate a Simulation from the database

    simulation = Simulation.from_primary_key((request.params_path['simulationId'],))

    # Make sure this Simulation exists

    if not simulation.exists():
        return Response(404, '{} not found.'.format(simulation))

    # Make sure this user is authorized to view this Simulation's Experiments

    if not simulation.google_id_has_at_least(request.google_id, 'VIEW'):
        return Reponse(403, 'Forbidden from viewing Experiments for {}.'.format(simulation))

    # Get and return the Experiments

    experiments = Experiment.query('simulation_id', request.params_path['simulationId'])

    return Response(
        200,
        'Successfully retrieved Experiments for {}.'.format(simulation),
        [x.to_JSON() for x in experiments]
    )


def POST(request):
    """Add a new Experiment for this Simulation."""

    # Make sure required parameters are there

    try:
        request.check_required_parameters(
            path={
                'simulationId': 'int'
            },
            body={
                'experiment': {
                    'simulationId': 'int',
                    'pathId': 'int',
                    'traceId': 'int',
                    'schedulerName': 'string',
                    'name': 'string'
                }
            }
        )

    except exceptions.ParameterError as e:
        return Response(400, e.message)

    # Make sure the passed object's simulation id matches the path simulation id

    if request.params_path['simulationId'] != request.params_body['experiment']['simulationId']:
        return Response(403, 'ID mismatch.')

    # Instantiate a Simulation from the database

    simulation = Simulation.from_primary_key((request.params_path['simulationId'],))

    # Make sure this Simulation exists

    if not simulation.exists():
        return Response(404, '{} not found.'.format(simulation))

    # Make sure this user is authorized to edit this Simulation's Experiments

    if not simulation.google_id_has_at_least(request.google_id, 'EDIT'):
        return Response(403, 'Forbidden from adding an experiment to {}.'.format(simulation))

    # Instantiate an Experiment

    experiment = Experiment.from_JSON(request.params_body['experiment'])
    experiment.state = 'QUEUED'
    experiment.last_simulated_tick = 0

    # Try to insert this Experiment

    try:
        experiment.insert()

    except exceptions.ForeignKeyError as e:
        return Response(400, 'Foreign key constraint not met.' + e.message)

    # Return this Experiment

    experiment.read()

    return Response(
        200,
        'Successfully added {}.'.format(experiment),
        experiment.to_JSON()
    )