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 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, ))
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() )
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())