summaryrefslogtreecommitdiff
path: root/opendc/api/v1/tiles/tileId/rack/machines/endpoint.py
blob: 5272c117a2e17b6f8dec0d7045dfa345dbcece12 (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
113
114
115
116
117
118
from opendc.models.machine import Machine
from opendc.models.rack import Rack
from opendc.util import exceptions
from opendc.util.rest import Response


def GET(request):
    """Get this Rack's Machines."""

    # Make sure required parameters are there

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

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

    # Instantiate a Rack from the database

    rack = Rack.from_tile_id(request.params_path['tileId'])

    # Make sure this Rack exists

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

    # Make sure this user is authorized to view this Rack's Machines

    if not rack.google_id_has_at_least(request.google_id, 'VIEW'):
        return Response(403, 'Forbidden from viewing {}.'.format(rack))

    # Get and return the Machines

    machines = Machine.query('rack_id', rack.id)

    for machine in machines:
        machine.read()

    return Response(
        200,
        'Successfully retrieved Machines for {}.'.format(rack),
        [x.to_JSON() for x in machines]
    )


def POST(request):
    """Add a Machine to this rack."""

    # Make sure required parameters are there

    try:
        request.check_required_parameters(
            path={
                'tileId': 'int'
            },
            body={
                'machine': {
                    'rackId': 'int',
                    'position': 'int',
                    'tags': 'list-string',
                    'cpuIds': 'list-int',
                    'gpuIds': 'list-int',
                    'memoryIds': 'list-int',
                    'storageIds': 'list-int'
                }
            }
        )

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

    # Instantiate a Rack from the database

    rack = Rack.from_tile_id(request.params_path['tileId'])

    # Make sure this Rack exists

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

    # Make sure this Rack's ID matches the given rack ID

    if rack.id != request.params_body['machine']['rackId']:
        return Response(400, 'Rack ID in `machine` and path do not match.')

    # Make sure this user is authorized to edit this Rack's Machines

    if not rack.google_id_has_at_least(request.google_id, 'VIEW'):
        return Response(403, 'Forbidden from viewing {}.'.format(rack))

    # Instantiate a Machine

    machine = Machine.from_JSON(request.params_body['machine'])

    # Try to insert this Machine

    try:
        machine.insert()

    except exceptions.ForeignKeyError:
        return Response(409, 'Rack position occupied.')

    except:
        return Response(400, 'Invalid Machine.')

    # Return this Machine

    machine.read()

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