def delete(self, offer_id): request = pecan.request.context cdict = request.to_policy_values() policy.authorize('esi_leap:offer:delete', cdict, cdict) o_id = offer.Offer.get(offer_id) permission = [] for o in o_id: try: if o.project_id != request.project_id: policy.authorize('esi_leap:offer:offer_admin', cdict, cdict) permission.append(o) except oslo_policy.PolicyNotAuthorized: continue if len(permission) > 1: raise exception.ContractDuplicateName(name=offer_id) if len(permission) == 0: raise exception.OfferNotFound(offer_id=offer_id) OffersController._verify_resource_permission(cdict, o_id[0].to_dict()) o_id[0].cancel()
def create(self, context=None): updates = self.obj_get_changes() updates['uuid'] = uuidutils.generate_uuid() if 'offer_uuid' not in updates: raise exception.ContractNoOfferUUID() related_offer = self.dbapi.offer_get_by_uuid(updates['offer_uuid']) if related_offer is None: raise exception.OfferNotFound(offer_uuid=updates['offer_uuid']) if related_offer.status != statuses.AVAILABLE: raise exception.OfferNotAvailable(offer_uuid=related_offer.uuid, status=related_offer.status) if 'start_time' not in updates: updates['start_time'] = datetime.datetime.now() if 'end_time' not in updates: q = self.dbapi.offer_get_first_availability(related_offer, updates['start_time']) if q is None: updates['end_time'] = related_offer.end_time else: updates['end_time'] = q.start_time self.dbapi.offer_verify_availability(related_offer, updates['start_time'], updates['end_time']) db_contract = self.dbapi.contract_create(updates) self._from_db_object(context, self, db_contract)
def get_offer_authorized(uuid_or_name, cdict, status_filter=None): if uuidutils.is_uuid_like(uuid_or_name): o = offer.Offer.get(uuid_or_name) offer_objs = [] if not status_filter or o.status == status_filter: try: if o.project_id != cdict['project_id']: policy.authorize('esi_leap:offer:offer_admin', cdict, cdict) offer_objs.append(o) except oslo_policy.PolicyNotAuthorized: pass else: try: policy.authorize('esi_leap:offer:offer_admin', cdict, cdict) offer_objs = offer.Offer.get_all({ 'name': uuid_or_name, 'status': status_filter }) except oslo_policy.PolicyNotAuthorized: offer_objs = offer.Offer.get_all({ 'name': uuid_or_name, 'project_id': cdict['project_id'], 'status': status_filter }) if len(offer_objs) == 0: raise exception.OfferNotFound(offer_uuid=uuid_or_name) elif len(offer_objs) > 1: raise exception.OfferDuplicateName(name=uuid_or_name) return offer_objs[0]
def get_offer(uuid_or_name, status_filters=[]): if uuidutils.is_uuid_like(uuid_or_name): o = offer_obj.Offer.get(uuid_or_name) if not status_filters or o.status in status_filters: return o else: raise exception.OfferNotFound(offer_uuid=uuid_or_name) else: offers = offer_obj.Offer.get_all({'name': uuid_or_name, 'status': status_filters}) if len(offers) != 1: if len(offers) == 0: raise exception.OfferNotFound(offer_uuid=uuid_or_name) else: raise exception.OfferDuplicateName(name=uuid_or_name) return offers[0]
def offer_destroy(offer_uuid): query = model_query(models.Offer, get_session()) offer_ref = query.filter_by(uuid=offer_uuid).one_or_none() if not offer_ref: raise exception.OfferNotFound(offer_uuid=offer_uuid) model_query(models.Offer, get_session()).filter_by(uuid=offer_uuid).delete()
def offer_get(context, offer_uuid): query = model_query(context, models.Offer, get_session()) result = query.filter_by(uuid=offer_uuid).first() if not result: raise exception.OfferNotFound(offer_uuid=offer_uuid) if not context.is_admin: if context.project_id != result.project_id: raise exception.OfferNoPermission(offer_uuid=offer_uuid) return result
def offer_destroy(offer_uuid): with _session_for_write() as session: query = model_query(models.Offer) offer_ref = query.filter_by(uuid=offer_uuid).one_or_none() if not offer_ref: raise exception.OfferNotFound(offer_uuid=offer_uuid) model_query(models.Offer).filter_by(uuid=offer_uuid).delete() session.flush()
def get_offer(uuid_or_name, status_filter=None): if uuidutils.is_uuid_like(uuid_or_name): o = offer.Offer.get(uuid_or_name) if not status_filter or o.status == status_filter: return o else: raise exception.OfferNotFound(offer_uuid=uuid_or_name) else: offer_objs = offer.Offer.get_all({ 'name': uuid_or_name, 'status': status_filter }) if len(offer_objs) > 1: raise exception.OfferDuplicateName(name=uuid_or_name) elif len(offer_objs) == 0: raise exception.OfferNotFound(offer_uuid=uuid_or_name) return offer_objs[0]
def get_one(self, offer_id): request = pecan.request.context cdict = request.to_policy_values() policy.authorize('esi_leap:offer:get', cdict, cdict) o_id = offer.Offer.get(offer_id) if len(o_id) > 1: raise exception.OfferDuplicateName(name=offer_id) elif len(o_id) == 0: raise exception.OfferNotFound(offer_uuid=offer_id) o = OffersController._add_offer_availabilities(o_id[0]) return Offer(**o)
def offer_destroy(context, offer_uuid): offer_ref = offer_get(context, offer_uuid) if not offer_ref: raise exception.OfferNotFound(offer_uuid=offer_uuid) if not context.is_admin: if context.project_id != offer_ref.project_id: raise exception.OfferNoPermission(offer_uuid=offer_uuid) resource = ro_factory.ResourceObjectFactory.get_resource_object( offer_ref.resource_type, offer_ref.resource_uuid) if not resource.is_resource_admin(context.project_id): raise exception.ResourceNoPermission( resource_type=offer_ref.resource_type, resource_uuid=offer_ref.resource_uuid) model_query(context, models.Offer, get_session()).filter_by(uuid=offer_uuid).delete()
def post(self, new_contract): request = pecan.request.context cdict = request.to_policy_values() policy.authorize('esi_leap:contract:create', cdict, cdict) contract_dict = new_contract.to_dict() contract_dict['project_id'] = request.project_id contract_dict['uuid'] = uuidutils.generate_uuid() if new_contract.offer_uuid_or_name is None: raise exception.ContractNoOfferUUID() o_objects = offer.Offer.get(new_contract.offer_uuid_or_name) if len(o_objects) > 1: raise exception.OfferDuplicateName( name=new_contract.offer_uuid_or_name) elif len(o_objects) == 0: raise exception.OfferNotFound( offer_uuid=new_contract.offer_uuid_or_name) related_offer = o_objects[0] contract_dict['offer_uuid'] = related_offer.uuid if 'start_time' not in contract_dict: contract_dict['start_time'] = datetime.datetime.now() if 'end_time' not in contract_dict: q = related_offer.get_first_availability( contract_dict['start_time']) if q is None: contract_dict['end_time'] = related_offer.end_time else: contract_dict['end_time'] = q.start_time c = contract.Contract(**contract_dict) c.create(request) return Contract(**c.to_dict())