def from_dict(self, value: dict): """ The Avro Python library does not support code generation. For this reason we must provide conversion from dict to our class for de-serialization :param value: incoming message dictionary """ for k, v in value.items(): if k in self.__dict__ and v is not None: if k == Constants.STATUS: self.status = ResultAvro() self.status.from_dict(value=v) elif k == Constants.SLICES: self.from_dict_slices(value=v) elif k == Constants.RESERVATIONS: self.from_dict_reservations(value=v) elif k == Constants.RESERVATION_STATES: self.from_dict_reservation_states(value=v) elif k == Constants.UNITS: self.from_dict_units(value=v) elif k == Constants.PROXIES: self.from_dict_proxies(value=v) elif k == Constants.MODEL: self.from_dict_model(value=v) elif k == Constants.ACTORS: self.from_dict_actors(value=v) elif k == Constants.DELEGATIONS: self.from_dict_delegations(value=v) else: self.__dict__[k] = v
def unregister_client(self, *, guid: ID, caller: AuthToken) -> ResultAvro: result = ResultAvro() if guid is None or caller is None: result.set_code(ErrorCodes.ErrorInvalidArguments.value) result.set_message(ErrorCodes.ErrorInvalidArguments.interpret()) return result try: class Runner(ABCActorRunnable): def __init__(self, *, actor: ABCActorMixin): self.actor = actor def run(self): self.actor.unregister_client(guid=guid) return None self.actor.execute_on_actor_thread_and_wait(runnable=Runner( actor=self.actor)) except Exception as e: self.logger.error("unregister_client: {}".format(e)) result.set_code(ErrorCodes.ErrorInternalError.value) result.set_message( ErrorCodes.ErrorInternalError.interpret(exception=e)) result = ManagementObject.set_exception_details(result=result, e=e) return result
def run(self): result = ResultAvro() slice_obj = self.actor.get_slice(slice_id=slice_id) if slice_obj is None: result.set_code(ErrorCodes.ErrorNoSuchSlice.value) result.set_message( ErrorCodes.ErrorNoSuchSlice.interpret()) return result slice_obj = ManagementUtils.update_slice( slice_obj=slice_obj, slice_mng=slice_mng) slice_obj.set_dirty() try: self.actor.get_plugin().get_database().update_slice( slice_object=slice_obj) except Exception as e: print("Could not commit slice update {}".format(e)) result.set_code(ErrorCodes.ErrorDatabaseError.value) result.set_message( ErrorCodes.ErrorDatabaseError.interpret( exception=e)) result = ManagementObject.set_exception_details( result=result, e=e) return result
def register_client(self, *, client: ClientMng, kafka_topic: str, caller: AuthToken) -> ResultAvro: result = ResultAvro() if client is None or kafka_topic is None or caller is None: result.set_code(ErrorCodes.ErrorInvalidArguments.value) result.set_message(ErrorCodes.ErrorInvalidArguments.interpret()) return result try: client_obj = Converter.fill_client(client_mng=client) client_obj.set_kafka_topic(kafka_topic=kafka_topic) class Runner(ABCActorRunnable): def __init__(self, *, actor: ABCActorMixin): self.actor = actor def run(self): self.actor.register_client(client=client_obj) return None self.actor.execute_on_actor_thread_and_wait(runnable=Runner( actor=self.actor)) except Exception as e: self.logger.error("register_client: {}".format(e)) result.set_code(ErrorCodes.ErrorInternalError.value) result.set_message( ErrorCodes.ErrorInternalError.interpret(exception=e)) result = ManagementObject.set_exception_details(result=result, e=e) return result
def run(self): result = ResultAvro() r = self.actor.get_reservation(rid=rid) if r is None: result.set_code( ErrorCodes.ErrorNoSuchReservation.value) result.set_message( ErrorCodes.ErrorNoSuchReservation.interpret()) return result r = ManagementUtils.update_reservation(res_obj=r, rsv_mng=reservation) r.set_dirty() try: self.actor.get_plugin().get_database( ).update_reservation(reservation=r) except Exception as e: print("Could not commit slice update {}".format(e)) result.set_code(ErrorCodes.ErrorDatabaseError.value) result.set_message( ErrorCodes.ErrorDatabaseError.interpret( exception=e)) result = ManagementObject.set_exception_details( result=result, e=e) return result
def on_exception(self, e: Exception, traceback_str: str): self.last_exception = e status = ResultAvro() status.code = ErrorCodes.ErrorInternalError.value status.message = ErrorCodes.ErrorInternalError.interpret(exception=e) status.details = traceback_str self.last_status = status
def run(self): result = ResultAvro() rid = ID(uid=reservation.get_reservation_id()) r = self.actor.get_reservation(rid=rid) if r is None: result.set_code( ErrorCodes.ErrorNoSuchReservation.value) result.set_message( ErrorCodes.ErrorNoSuchReservation.interpret()) return result ManagementUtils.update_reservation(res_obj=r, rsv_mng=reservation) if isinstance(reservation, LeaseReservationAvro): predecessors = reservation.get_redeem_predecessors() for pred in predecessors: if pred.get_reservation_id() is None: self.logger.warning( "Redeem predecessor specified for rid={} " "but missing reservation id of predecessor" .format(rid)) continue predid = ID(uid=pred.get_reservation_id()) pr = self.actor.get_reservation(rid=predid) if pr is None: self.logger.warning( "Redeem predecessor for rid={} with rid={} does not exist. " "Ignoring it!".format(rid, predid)) continue if not isinstance(pr, ABCControllerReservation): self.logger.warning( "Redeem predecessor for rid={} is not an IControllerReservation: " "class={}".format(rid, type(pr))) continue self.logger.debug( "Setting redeem predecessor on reservation # {} pred={}" .format(r.get_reservation_id(), pr.get_reservation_id())) r.add_redeem_predecessor(reservation=pr) try: self.actor.get_plugin().get_database( ).update_reservation(reservation=r) except Exception as e: self.logger.error( "Could not commit slice update {}".format(e)) result.set_code(ErrorCodes.ErrorDatabaseError.value) result.set_message( ErrorCodes.ErrorDatabaseError.interpret( exception=e)) self.actor.demand(rid=rid) return result
def extend_reservation(self, *, reservation: id, new_end_time: datetime, new_units: int, caller: AuthToken) -> ResultAvro: result = ResultAvro() if reservation is None or caller is None or new_end_time is None: result.set_code(ErrorCodes.ErrorInvalidArguments.value) result.set_message(ErrorCodes.ErrorInvalidArguments.interpret()) return result try: class Runner(ABCActorRunnable): def __init__(self, *, actor: ABCActorMixin): self.actor = actor def run(self): result = ResultAvro() r = self.actor.get_reservation(rid=reservation) if r is None: result.set_code( ErrorCodes.ErrorNoSuchReservation.value) result.set_message( ErrorCodes.ErrorNoSuchReservation.interpret()) return result rset = ResourceSet() if new_units == Constants.EXTEND_SAME_UNITS: rset.set_units(units=r.get_resources().get_units()) else: rset.set_units(units=new_units) rset.set_type(rtype=r.get_resources().get_type()) tmp_start_time = r.get_term().get_start_time() new_term = r.get_term().extend() new_term.set_end_time(date=new_end_time) new_term.set_new_start_time(date=tmp_start_time) new_term.set_start_time(date=tmp_start_time) self.actor.extend(rid=r.get_reservation_id(), resources=rset, term=new_term) return result result = self.client.execute_on_actor_thread_and_wait( runnable=Runner(actor=self.client)) except Exception as e: self.logger.error("extend_reservation {}".format(e)) result.set_code(ErrorCodes.ErrorInternalError.value) result.set_message( ErrorCodes.ErrorInternalError.interpret(exception=e)) result = ManagementObject.set_exception_details(result=result, e=e) return result
class ResultStringAvro(AbcMessageAvro): """ Implements Avro representation of a Result Message containing String """ def __init__(self): super(ResultStringAvro, self).__init__() self.name = AbcMessageAvro.result_string self.status = None self.result_str = None def from_dict(self, value: dict): """ The Avro Python library does not support code generation. For this reason we must provide conversion from dict to our class for de-serialization :param value: incoming message dictionary """ for k, v in value.items(): if k in self.__dict__ and v is not None: self.__dict__[k] = v if k == Constants.STATUS: self.status = ResultAvro() self.status.from_dict(value=v) def get_status(self) -> ResultAvro: """ Return status """ return self.status def set_status(self, value: ResultAvro): """ Set status @param value value """ self.status = value def get_result(self) -> str: """ Return result string """ return self.result_str def set_result(self, result: str): """ Set result string """ self.result_str = result def validate(self) -> bool: """ Check if the object is valid and contains all mandatory fields :return True on success; False on failure """ ret_val = super().validate() if self.status is None: ret_val = False return ret_val
def from_dict(self, value: dict): """ The Avro Python library does not support code generation. For this reason we must provide conversion from dict to our class for de-serialization :param value: incoming message dictionary """ for k, v in value.items(): if k in self.__dict__ and v is not None: self.__dict__[k] = v if k == Constants.STATUS: self.status = ResultAvro() self.status.from_dict(value=v)
def update_slice(self, *, slice_mng: SliceAvro, caller: AuthToken) -> ResultAvro: result = ResultAvro() if slice_mng is None or slice_mng.get_slice_id( ) is None or caller is None: result.set_code(ErrorCodes.ErrorInvalidArguments.value) result.set_message(ErrorCodes.ErrorInvalidArguments.interpret()) return result try: slice_id = ID(uid=slice_mng.get_slice_id()) class Runner(ABCActorRunnable): def __init__(self, *, actor: ABCActorMixin): self.actor = actor def run(self): result = ResultAvro() slice_obj = self.actor.get_slice(slice_id=slice_id) if slice_obj is None: result.set_code(ErrorCodes.ErrorNoSuchSlice.value) result.set_message( ErrorCodes.ErrorNoSuchSlice.interpret()) return result slice_obj = ManagementUtils.update_slice( slice_obj=slice_obj, slice_mng=slice_mng) slice_obj.set_dirty() try: self.actor.get_plugin().get_database().update_slice( slice_object=slice_obj) except Exception as e: print("Could not commit slice update {}".format(e)) result.set_code(ErrorCodes.ErrorDatabaseError.value) result.set_message( ErrorCodes.ErrorDatabaseError.interpret( exception=e)) result = ManagementObject.set_exception_details( result=result, e=e) return result result = self.actor.execute_on_actor_thread_and_wait( runnable=Runner(actor=self.actor)) except Exception as e: self.logger.error("update_slice: {}".format(e)) result.set_code(ErrorCodes.ErrorInternalError.value) result.set_message( ErrorCodes.ErrorInternalError.interpret(exception=e)) result = ManagementObject.set_exception_details(result=result, e=e) return result
def send_request(self, request: AbcMessageAvro) -> Tuple[ResultAvro, Any]: self.clear_last() status = ResultAvro() rret_val = None try: ret_val = self.producer.produce(topic=self.kafka_topic, record=request) self.logger.debug( Constants.MANAGEMENT_INTER_ACTOR_OUTBOUND_MESSAGE.format( request.get_message_name(), self.kafka_topic)) if ret_val: message_wrapper = self.message_processor.add_message( message=request) with message_wrapper.condition: message_wrapper.condition.wait( Constants.MANAGEMENT_API_TIMEOUT_IN_SECONDS) if not message_wrapper.done: self.logger.debug( Constants.MANAGEMENT_API_TIMEOUT_OCCURRED) self.message_processor.remove_message( msg_id=request.get_message_id()) status.code = ErrorCodes.ErrorTransportTimeout.value status.message = ErrorCodes.ErrorTransportTimeout.interpret( ) else: self.logger.debug( Constants.MANAGEMENT_INTER_ACTOR_INBOUND_MESSAGE. format(message_wrapper.response)) status = message_wrapper.response.status if status.code == 0: rret_val = message_wrapper.response else: self.logger.debug( Constants.MANAGEMENT_INTER_ACTOR_MESSAGE_FAILED.format( request.get_message_name(), self.kafka_topic)) status.code = ErrorCodes.ErrorTransportFailure.value status.message = ErrorCodes.ErrorTransportFailure.interpret() except Exception as e: self.last_exception = e status.code = ErrorCodes.ErrorInternalError.value status.message = ErrorCodes.ErrorInternalError.interpret( exception=e) status.details = traceback.format_exc() self.last_status = status return status, rret_val
def from_dict(self, value: dict): """ The Avro Python library does not support code generation. For this reason we must provide conversion from dict to our class for de-serialization :param value: incoming message dictionary """ if value[Constants.NAME] != AbcMessageAvro.result_strings: raise MessageBusException(Constants.ERROR_INVALID_MESSAGE) for k, v in value.items(): if k in self.__dict__ and v is not None: self.__dict__[k] = v if k == Constants.STATUS: self.status = ResultAvro() self.status.from_dict(value=v)
def add_client_slice(self, *, request: AddSliceAvro) -> ResultStringAvro: result = ResultStringAvro() result.status = ResultAvro() result.message_id = request.message_id try: if request.guid is None: result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message( ErrorCodes.ErrorInvalidArguments.interpret()) return result auth = Translate.translate_auth_from_avro(auth_avro=request.auth) mo = self.get_actor_mo(guid=ID(uid=request.guid)) result = mo.add_client_slice(caller=auth, slice_obj=request.slice_obj) except Exception as e: result.status.set_code(ErrorCodes.ErrorInternalError.value) result.status.set_message( ErrorCodes.ErrorInternalError.interpret(exception=e)) result.status = ManagementObject.set_exception_details( result=result.status, e=e) result.message_id = request.message_id return result
def get_slices_by_slice_type(self, *, request: GetSlicesRequestAvro, slice_type: SliceTypes) -> ResultSliceAvro: result = ResultSliceAvro() result.status = ResultAvro() result.message_id = request.message_id try: if request.guid is None: result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message( ErrorCodes.ErrorInvalidArguments.interpret()) return result auth = Translate.translate_auth_from_avro(auth_avro=request.auth) mo = self.get_actor_mo(guid=ID(uid=request.guid)) result = mo.get_slices_by_slice_type( caller=auth, slice_type=slice_type, id_token=request.get_id_token()) except Exception as e: result.status.set_code(ErrorCodes.ErrorInternalError.value) result.status.set_message( ErrorCodes.ErrorInternalError.interpret(exception=e)) result.status = ManagementObject.set_exception_details( result=result.status, e=e) result.message_id = request.message_id return result
def reclaim(self, *, request: ReclaimResourcesAvro): result = ResultDelegationAvro() result.status = ResultAvro() result.message_id = request.message_id try: if request.guid is None or request.broker_id is None or request.delegation_id is None: result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message(ErrorCodes.ErrorInvalidArguments.interpret()) return result auth = Translate.translate_auth_from_avro(auth_avro=request.auth) mo = self.get_actor_mo(guid=ID(uid=request.guid)) if mo is None: self.logger.debug("Management object could not be found: guid: {} auth: {}".format(request.guid, auth)) result.status.set_code(ErrorCodes.ErrorNoSuchBroker.value) result.status.set_message(ErrorCodes.ErrorNoSuchBroker.interpret()) return result result = mo.reclaim_delegations(broker=ID(uid=request.broker_id), did=request.delegation_id, caller=auth, id_token=request.id_token) except Exception as e: result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message(ErrorCodes.ErrorInvalidArguments.interpret()) result.status.set_message(str(e)) result.status.set_details(traceback.format_exc()) result.message_id = request.message_id return result
def get_broker_query_model(self, *, request: GetBrokerQueryModelRequestAvro) -> ResultBrokerQueryModelAvro: result = ResultBrokerQueryModelAvro() result.status = ResultAvro() result.message_id = request.message_id try: if request.guid is None: result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message(ErrorCodes.ErrorInvalidArguments.interpret()) return result auth = Translate.translate_auth_from_avro(auth_avro=request.auth) mo = self.get_actor_mo(guid=ID(uid=request.guid)) graph_format = GraphFormat(request.graph_format) result = mo.get_broker_query_model(broker=ID(uid=request.broker_id), caller=auth, id_token=request.get_id_token(), graph_format=graph_format) except Exception as e: result.status.set_code(ErrorCodes.ErrorInternalError.value) result.status.set_message(ErrorCodes.ErrorInternalError.interpret(exception=e)) result.status = ManagementObject.set_exception_details(result=result.status, e=e) result.message_id = request.message_id return result
def get_slices(self, *, request: GetSlicesRequestAvro) -> ResultSliceAvro: result = ResultSliceAvro() result.status = ResultAvro() result.message_id = request.message_id try: if request.guid is None: result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message(ErrorCodes.ErrorInvalidArguments.interpret()) return result auth = Translate.translate_auth_from_avro(auth_avro=request.auth) mo = self.get_actor_mo(guid=ID(uid=request.guid)) slice_id = None if request.slice_id is not None: slice_id = ID(uid=request.slice_id) result = mo.get_slices(slice_id=slice_id, caller=auth, id_token=request.get_id_token(), slice_name=request.slice_name, email=request.get_email()) except Exception as e: self.logger.error(traceback.format_exc()) result.status.set_code(ErrorCodes.ErrorInternalError.value) result.status.set_message(ErrorCodes.ErrorInternalError.interpret(exception=e)) result.status = ManagementObject.set_exception_details(result=result.status, e=e) result.message_id = request.message_id return result
def do_get_actors(self, *, atype: int, caller: AuthToken, id_token: str = None) -> ResultActorAvro: result = ResultActorAvro() result.status = ResultAvro() if caller is None: result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message(ErrorCodes.ErrorInvalidArguments.name) return result try: act_list = self.get_actors_from_registry(atype=atype, caller=caller) result.actors = Converter.fill_actors(act_list=act_list) except Exception as e: self.logger.error("get_actors {}".format(e)) result.status.set_code(ErrorCodes.ErrorInternalError.value) result.status.set_message( ErrorCodes.ErrorInternalError.interpret(exception=e)) result.status = ManagementObject.set_exception_details( result=result.status, e=e) return result
def get_reservations_by_category( self, *, request: GetReservationsRequestAvro, category: ReservationCategory) -> ResultReservationAvro: result = ResultReservationAvro() result.status = ResultAvro() result.message_id = request.message_id try: if request.guid is None: result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message( ErrorCodes.ErrorInvalidArguments.interpret()) return result auth = Translate.translate_auth_from_avro(auth_avro=request.auth) mo = self.get_actor_mo(guid=ID(uid=request.guid)) result = mo.get_reservations_by_category( caller=auth, category=category, id_token=request.get_id_token(), slice_id=request.slice_id) except Exception as e: result.status.set_code(ErrorCodes.ErrorInternalError.value) result.status.set_message( ErrorCodes.ErrorInternalError.interpret(exception=e)) result.status = ManagementObject.set_exception_details( result=result.status, e=e) result.message_id = request.message_id return result
def demand_reservation(self, *, request: DemandReservationAvro) -> ResultStringAvro: result = ResultStringAvro() result.status = ResultAvro() result.message_id = request.message_id try: if request.guid is None or (request.reservation_id is None and request.reservation_obj is None): result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message(ErrorCodes.ErrorInvalidArguments.interpret()) return result if request.reservation_obj is not None and request.reservation_id is not None: result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message(ErrorCodes.ErrorInvalidArguments.interpret()) return result auth = Translate.translate_auth_from_avro(auth_avro=request.auth) mo = self.get_actor_mo(guid=ID(uid=request.guid)) if request.reservation_id is not None: result.status = mo.demand_reservation_rid(rid=ID(uid=request.reservation_id), caller=auth) else: result.status = mo.demand_reservation(reservation=request.reservation_obj, caller=auth) except Exception as e: result.status.set_code(ErrorCodes.ErrorInternalError.value) result.status.set_message(ErrorCodes.ErrorInternalError.interpret(exception=e)) result.status = ManagementObject.set_exception_details(result=result.status, e=e) result.message_id = request.message_id return result
def get_delegations(self, *, request: GetDelegationsAvro) -> ResultDelegationAvro: result = ResultDelegationAvro() result.status = ResultAvro() result.message_id = request.message_id try: if request.guid is None: result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message(ErrorCodes.ErrorInvalidArguments.interpret()) return result auth = Translate.translate_auth_from_avro(auth_avro=request.auth) mo = self.get_actor_mo(guid=ID(uid=request.guid)) if request.get_delegation_id() is not None: result = mo.get_delegations(caller=auth, did=ID(uid=request.get_delegation_id()), id_token=request.get_id_token(), state=request.delegation_state) elif request.get_slice_id() is not None: result = mo.get_delegations(caller=auth, slice_id=ID(uid=request.get_slice_id()), id_token=request.get_id_token(), state=request.delegation_state) else: result = mo.get_delegations(caller=auth, id_token=request.get_id_token(), state=request.delegation_state) except Exception as e: result.status.set_code(ErrorCodes.ErrorInternalError.value) result.status.set_message(ErrorCodes.ErrorInternalError.interpret(exception=e)) result.status = ManagementObject.set_exception_details(result=result.status, e=e) result.message_id = request.message_id return result
def close_reservations(self, *, request: CloseReservationsAvro) -> ResultStringAvro: result = ResultStringAvro() result.status = ResultAvro() result.message_id = request.message_id try: if request.guid is None or (request.get_slice_id() is None and request.get_reservation_id() is None): result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message(ErrorCodes.ErrorInvalidArguments.interpret()) return result auth = Translate.translate_auth_from_avro(auth_avro=request.auth) mo = self.get_actor_mo(guid=ID(uid=request.guid)) if request.get_slice_id() is not None: result.status = mo.close_slice_reservations(caller=auth, slice_id=ID(uid=request.slice_id), id_token=request.id_token) else: result.status = mo.close_reservation(caller=auth, rid=ID(uid=request.reservation_id), id_token=request.id_token) except Exception as e: result.status.set_code(ErrorCodes.ErrorInternalError.value) result.status.set_message(ErrorCodes.ErrorInternalError.interpret(exception=e)) result.status = ManagementObject.set_exception_details(result=result.status, e=e) result.message_id = request.message_id return result
def get_reservations_by_category( self, *, caller: AuthToken, category: ReservationCategory, slice_id: ID = None, id_token: str = None) -> ResultReservationAvro: result = ResultReservationAvro() result.status = ResultAvro() if caller is None: result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message( ErrorCodes.ErrorInvalidArguments.interpret()) return result try: res_list = None try: if category == ReservationCategory.Client: if slice_id is None: res_list = self.db.get_client_reservations() else: res_list = self.db.get_client_reservations_by_slice_id( slice_id=slice_id) elif category == ReservationCategory.Broker: res_list = self.db.get_broker_reservations() elif category == ReservationCategory.Inventory: if slice_id is None: res_list = self.db.get_holdings() else: res_list = self.db.get_holdings_by_slice_id( slice_id=slice_id) except Exception as e: self.logger.error("do_get_reservations:db access {}".format(e)) result.status.set_code(ErrorCodes.ErrorDatabaseError.value) result.status.set_message( ErrorCodes.ErrorDatabaseError.interpret(exception=e)) result.status = ManagementObject.set_exception_details( result=result.status, e=e) return result if res_list is not None: result.result = [] for r in res_list: slice_obj = self.get_slice_by_guid(guid=r.get_slice_id()) r.restore(actor=self.actor, slice_obj=slice_obj, logger=self.logger) rr = Converter.fill_reservation(reservation=r, full=True) result.result.append(rr) except Exception as e: self.logger.error("do_get_reservations: {}".format(e)) result.status.set_code(ErrorCodes.ErrorInternalError.value) result.status.set_message( ErrorCodes.ErrorInternalError.interpret(exception=e)) result.status = ManagementObject.set_exception_details( result=result.status, e=e) return result
def add_reservations(self, *, reservations: List[TicketReservationAvro], caller: AuthToken) -> ResultStringsAvro: result = ResultStringsAvro() result.status = ResultAvro() if reservations is None or caller is None: result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message( ErrorCodes.ErrorInvalidArguments.interpret()) return result for r in reservations: if r.get_slice_id() is None: result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message( ErrorCodes.ErrorInvalidArguments.interpret()) return result try: class Runner(ABCActorRunnable): def __init__(self, *, parent): self.parent = parent def run(self): result = [] try: for r in reservations: rr, status = self.parent.add_reservation_private( reservation=r) if rr is not None: result.append(str(rr)) else: raise ManageException( "Could not add reservation") except Exception: for r in reservations: self.parent.client.unregister(reservation=r) result.clear() return result rids, result.status = self.client.execute_on_actor_thread_and_wait( runnable=Runner(parent=self)) if result.status.get_code() == 0: for r in rids: result.result.append(r) except Exception as e: self.logger.error("add_reservations {}".format(e)) result.status.set_code(ErrorCodes.ErrorInternalError.value) result.status.set_message( ErrorCodes.ErrorInternalError.interpret(exception=e)) result.status = ManagementObject.set_exception_details( result=result.status, e=e) return result
def get_reservations(self, *, request: GetReservationsRequestAvro) -> ResultReservationAvro: result = ResultReservationAvro() result.status = ResultAvro() result.message_id = request.message_id try: if request.guid is None: result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message(ErrorCodes.ErrorInvalidArguments.interpret()) return result auth = Translate.translate_auth_from_avro(auth_avro=request.auth) mo = self.get_actor_mo(guid=ID(uid=request.guid)) slice_id = None if request.slice_id is not None: slice_id = ID(uid=request.slice_id) rid = None if request.get_reservation_id() is not None: rid = ID(uid=request.get_reservation_id()) if rid is not None: result = mo.get_reservations(caller=auth, rid=rid, id_token=request.get_id_token()) elif slice_id is not None: if request.get_reservation_state() is not None and \ request.get_reservation_state() != Constants.ALL_RESERVATION_STATES: result = mo.get_reservations(caller=auth, slice_id=slice_id, state=request.get_reservation_state(), id_token=request.get_id_token()) else: result = mo.get_reservations(caller=auth, slice_id=slice_id, id_token=request.get_id_token()) else: if request.get_reservation_state() is not None and \ request.get_reservation_state() != Constants.ALL_RESERVATION_STATES: result = mo.get_reservations(caller=auth, state=request.get_reservation_state(), id_token=request.get_id_token(), email=request.get_email()) else: result = mo.get_reservations(caller=auth, id_token=request.get_id_token(), email=request.get_email()) except Exception as e: result.status.set_code(ErrorCodes.ErrorInternalError.value) result.status.set_message(ErrorCodes.ErrorInternalError.interpret(exception=e)) result.status = ManagementObject.set_exception_details(result=result.status, e=e) result.message_id = request.message_id return result
def modify_reservation(self, *, rid: ID, modify_properties: dict, caller: AuthToken) -> ResultAvro: result = ResultAvro() if rid is None or modify_properties is None: result.set_code(ErrorCodes.ErrorInvalidArguments.value) result.set_message(ErrorCodes.ErrorInvalidArguments.interpret()) return result self.logger.debug("reservation: {} | modifyProperties= {}".format( rid, modify_properties)) try: class Runner(ABCActorRunnable): def __init__(self, *, actor: ABCActorMixin): self.actor = actor def run(self): result = ResultAvro() r = self.actor.get_reservation(rid=rid) if r is None: result.set_code( ErrorCodes.ErrorNoSuchReservation.value) result.set_message( ErrorCodes.ErrorNoSuchReservation.interpret()) return result self.actor.modify(reservation_id=rid, modify_properties=modify_properties) return result result = self.client.execute_on_actor_thread_and_wait( runnable=Runner(actor=self.client)) except Exception as e: self.logger.error("modify_reservation {}".format(e)) result.set_code(ErrorCodes.ErrorInternalError.value) result.set_message( ErrorCodes.ErrorInternalError.interpret(exception=e)) result = ManagementObject.set_exception_details(result=result, e=e) return result
def get_authority_reservations( self, *, caller: AuthToken, id_token: str = None) -> ResultReservationAvro: result = ResultReservationAvro() result.status = ResultAvro() if caller is None: result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message( ErrorCodes.ErrorInvalidArguments.interpret()) return result try: AccessChecker.check_access(action_id=ActionId.query, resource_type=ResourceType.sliver, token=id_token, logger=self.logger, actor_type=self.actor.get_type()) res_list = None try: res_list = self.db.get_authority_reservations() except Exception as e: self.logger.error( "get_authority_reservations:db access {}".format(e)) result.status.set_code(ErrorCodes.ErrorDatabaseError.value) result.status.set_message( ErrorCodes.ErrorDatabaseError.interpret(exception=e)) result.status = ManagementObject.set_exception_details( result=result.status, e=e) return result if res_list is not None: result.reservations = [] for r in res_list: slice_obj = self.get_slice_by_guid(guid=r.get_slice_id()) r.restore(actor=self.actor, slice_obj=slice_obj, logger=self.logger) rr = Converter.fill_reservation(reservation=r, full=True) result.reservations.append(rr) except ReservationNotFoundException as e: self.logger.error("get_authority_reservations: {}".format(e)) result.status.set_code(ErrorCodes.ErrorNoSuchReservation.value) result.status.set_message(e.text) except Exception as e: self.logger.error("get_authority_reservations: {}".format(e)) result.status.set_code(ErrorCodes.ErrorInvalidArguments.value) result.status.set_message( ErrorCodes.ErrorInvalidArguments.interpret()) result.status = ManagementObject.set_exception_details( result=result.status, e=e) return result
def run(self): result = ResultAvro() r = self.actor.get_reservation(rid=reservation) if r is None: result.set_code( ErrorCodes.ErrorNoSuchReservation.value) result.set_message( ErrorCodes.ErrorNoSuchReservation.interpret()) return result rset = ResourceSet() if new_units == Constants.EXTEND_SAME_UNITS: rset.set_units(units=r.get_resources().get_units()) else: rset.set_units(units=new_units) rset.set_type(rtype=r.get_resources().get_type()) tmp_start_time = r.get_term().get_start_time() new_term = r.get_term().extend() new_term.set_end_time(date=new_end_time) new_term.set_new_start_time(date=tmp_start_time) new_term.set_start_time(date=tmp_start_time) self.actor.extend(rid=r.get_reservation_id(), resources=rset, term=new_term) return result
def remove_slice(self, *, slice_id: ID, caller: AuthToken, id_token: str = None) -> ResultAvro: result = ResultAvro() if slice_id is None or caller is None: result.set_code(ErrorCodes.ErrorInvalidArguments.value) result.set_message(ErrorCodes.ErrorInvalidArguments.interpret()) return result try: if id_token is not None: AccessChecker.check_access(action_id=ActionId.delete, resource_type=ResourceType.slice, token=id_token, logger=self.logger, actor_type=self.actor.get_type(), resource_id=str(slice_id)) class Runner(ABCActorRunnable): def __init__(self, *, actor: ABCActorMixin): self.actor = actor def run(self): self.actor.remove_slice_by_slice_id(slice_id=slice_id) return None self.actor.execute_on_actor_thread_and_wait(runnable=Runner( actor=self.actor)) except Exception as e: self.logger.error("remove_slice: {}".format(e)) result.set_code(ErrorCodes.ErrorInternalError.value) result.set_message( ErrorCodes.ErrorInternalError.interpret(exception=e)) result = ManagementObject.set_exception_details(result=result, e=e) return result