def get_pool(pool_name, session): """ Get a pool """ obj = session.query(Pool).filter(Pool.pool == pool_name).one_or_none() if obj is None: raise NotFound(detail=f"Pool with name:'{pool_name}' not found") return pool_schema.dump(obj)
def patch_pool( *, pool_name: str, update_mask: UpdateMask = None, session: Session = NEW_SESSION, ) -> APIResponse: """Update a pool""" request_dict = get_json_request_dict() # Only slots can be modified in 'default_pool' try: if pool_name == Pool.DEFAULT_POOL_NAME and request_dict[ "name"] != Pool.DEFAULT_POOL_NAME: if update_mask and len( update_mask) == 1 and update_mask[0].strip() == "slots": pass else: raise BadRequest( detail="Default Pool's name can't be modified") except KeyError: pass pool = session.query(Pool).filter(Pool.pool == pool_name).first() if not pool: raise NotFound(detail=f"Pool with name:'{pool_name}' not found") try: patch_body = pool_schema.load(request_dict) except ValidationError as err: raise BadRequest(detail=str(err.messages)) if update_mask: update_mask = [i.strip() for i in update_mask] _patch_body = {} try: update_mask = [ pool_schema.declared_fields[field].attribute if pool_schema.declared_fields[field].attribute else field for field in update_mask ] except KeyError as err: raise BadRequest( detail=f"Invalid field: {err.args[0]} in update mask") _patch_body = {field: patch_body[field] for field in update_mask} patch_body = _patch_body else: required_fields = {"name", "slots"} fields_diff = required_fields - set(get_json_request_dict().keys()) if fields_diff: raise BadRequest( detail=f"Missing required property(ies): {sorted(fields_diff)}" ) for key, value in patch_body.items(): setattr(pool, key, value) session.commit() return pool_schema.dump(pool)
def get_pool(pool_name, session): """ Get a pool """ pool_id = pool_name query = session.query(Pool) obj = query.filter(Pool.pool == pool_id).one_or_none() if obj is None: raise NotFound("Pool not found") return pool_schema.dump(obj)
def patch_pool(pool_name, session, update_mask=None): """ Update a pool """ # Only slots can be modified in 'default_pool' try: if pool_name == Pool.DEFAULT_POOL_NAME and request.json[ "name"] != Pool.DEFAULT_POOL_NAME: if update_mask and len( update_mask) == 1 and update_mask[0].strip() == "slots": pass else: raise BadRequest( detail="Default Pool's name can't be modified") except KeyError: pass pool = session.query(Pool).filter(Pool.pool == pool_name).first() if not pool: raise NotFound(detail=f"Pool with name:'{pool_name}' not found") try: patch_body = pool_schema.load(request.json) except ValidationError as err: raise BadRequest(detail=str(err.messages)) if update_mask: update_mask = [i.strip() for i in update_mask] _patch_body = {} try: update_mask = [ pool_schema.declared_fields[field].attribute if pool_schema.declared_fields[field].attribute else field for field in update_mask ] except KeyError as err: raise BadRequest( detail=f"Invalid field: {err.args[0]} in update mask") _patch_body = {field: patch_body[field] for field in update_mask} patch_body = _patch_body else: for field in ["name", "slots"]: if field not in request.json.keys(): raise BadRequest(detail=f"'{field}' is a required property") for key, value in patch_body.items(): setattr(pool, key, value) session.commit() return pool_schema.dump(pool)
def test_serialize(self, session): pool_model = Pool(pool="test_pool", slots=2) session.add(pool_model) session.commit() pool_instance = session.query(Pool).filter( Pool.pool == pool_model.pool).first() serialized_pool = pool_schema.dump(pool_instance) assert serialized_pool == { "name": "test_pool", "slots": 2, "occupied_slots": 0, "running_slots": 0, "queued_slots": 0, "open_slots": 2, }
def post_pool(session): """Create a pool""" required_fields = ["name", "slots" ] # Pool would require both fields in the post request for field in required_fields: if field not in request.json.keys(): raise BadRequest(detail=f"'{field}' is a required property") try: post_body = pool_schema.load(request.json, session=session) except ValidationError as err: raise BadRequest(detail=str(err.messages)) pool = Pool(**post_body) try: session.add(pool) session.commit() return pool_schema.dump(pool) except IntegrityError: raise AlreadyExists(detail=f"Pool: {post_body['pool']} already exists")
def post_pool(session): """Create a pool""" required_fields = {"name", "slots" } # Pool would require both fields in the post request fields_diff = required_fields - set(request.json.keys()) if fields_diff: raise BadRequest( detail=f"Missing required property(ies): {sorted(fields_diff)}") try: post_body = pool_schema.load(request.json, session=session) except ValidationError as err: raise BadRequest(detail=str(err.messages)) pool = Pool(**post_body) try: session.add(pool) session.commit() return pool_schema.dump(pool) except IntegrityError: raise AlreadyExists(detail=f"Pool: {post_body['pool']} already exists")
def get_pool(*, pool_name: str, session: Session = NEW_SESSION) -> APIResponse: """Get a pool""" obj = session.query(Pool).filter(Pool.pool == pool_name).one_or_none() if obj is None: raise NotFound(detail=f"Pool with name:'{pool_name}' not found") return pool_schema.dump(obj)