示例#1
0
文件: endpoint.py 项目: kl1de/kl1de
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])
示例#2
0
    def from_tile_id_and_rack_position(cls, tile_id, position):
        """Get a Rack from the ID of the tile its Rack is on, and its position in the Rack."""

        try:
            rack = Rack.from_tile_id(tile_id)
        except:
            return cls(id=-1)

        try:
            statement = 'SELECT id FROM machines WHERE rack_id = %s AND position = %s'
            machine_id = database.fetchone(statement, (rack.id, position))[0]
        except:
            return cls(id=-1)

        return cls.from_primary_key((machine_id, ))
示例#3
0
def PUT(request):
    """Update the Machine at this location in this Rack."""

    try:
        request.check_required_parameters(
            path={
                'tileId': 'int',
                'position': '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 Machine from the database

    machine = Machine.from_tile_id_and_rack_position(request.params_path['tileId'], request.params_path['position'])

    # Make sure this Machine exists

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

    # Make sure this Machine's rack ID is right

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

    if not rack.exists() or rack.id != request.params_body['machine']['rackId']:
        return Response(400, 'Mismatch in Rack IDs.')

    # Make sure this user is authorized to edit this Machine

    if not machine.google_id_has_at_least(request.google_id, 'EDIT'):
        return Response(403, 'Forbidden from retrieving {}.'.format(machine))

    # Update this Machine

    machine.position = request.params_body['machine']['position']
    machine.tags = request.params_body['machine']['tags']
    machine.cpu_ids = request.params_body['machine']['cpuIds']
    machine.gpu_ids = request.params_body['machine']['gpuIds']
    machine.memory_ids = request.params_body['machine']['memoryIds']
    machine.storage_ids = request.params_body['machine']['storageIds']

    try:
        machine.update()

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

    except Exception as e:
        print e
        return Response(400, 'Invalid Machine.')

    # Return this Machine

    machine.read()

    return Response(
        200,
        'Successfully updated {}.'.format(machine),
        machine.to_JSON()
    )
示例#4
0
文件: endpoint.py 项目: kl1de/kl1de
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())