def _basic_action(self, lease_id, event_id, action_time, reservation_status=None): """Commits basic lease actions such as starting and ending.""" lease = self.get_lease(lease_id) event_status = status.event.DONE for reservation in lease['reservations']: resource_type = reservation['resource_type'] try: if reservation_status is not None: if not status.reservation.is_valid_transition( reservation['status'], reservation_status): raise common_ex.InvalidStatus self.resource_actions[resource_type][action_time]( reservation['resource_id'] ) except common_ex.BlazarException: LOG.exception("Failed to execute action %(action)s " "for lease %(lease)s", {'action': action_time, 'lease': lease_id}) event_status = status.event.ERROR db_api.reservation_update( reservation['id'], {'status': status.reservation.ERROR}) else: if reservation_status is not None: db_api.reservation_update(reservation['id'], {'status': reservation_status}) db_api.event_update(event_id, {'status': event_status}) return event_status
def update_statuses(self, callback, *args, **kwargs): """Update leases and reservations table after executing a callback.""" try: # The callback() has to return a dictionary of # {reservation id: flags to update}. # e.g. {'dummyid': {'missing_resources': True}} reservation_flags = callback(*args, **kwargs) except Exception as e: LOG.exception( 'Caught an exception while executing a callback. ' '%s', str(e)) # TODO(hiro-kobayashi): update statuses of related leases and # reservations. Depends on the state-machine blueprint. # Update flags of related leases and reservations. lease_ids = set([]) for reservation_id, flags in reservation_flags.items(): db_api.reservation_update(reservation_id, flags) LOG.debug('Reservation %s was updated: %s', reservation_id, flags) reservation = db_api.reservation_get(reservation_id) lease_ids.add(reservation['lease_id']) for lease_id in lease_ids: LOG.debug('Lease %s was updated: {"degraded": True}', lease_id) db_api.lease_update(lease_id, {'degraded': True})
def _update_flags(self, reservation_flags): """Update lease/reservation flags.""" lease_ids = set([]) for reservation_id, flags in reservation_flags.items(): db_api.reservation_update(reservation_id, flags) LOG.debug('Reservation %s was updated: %s', reservation_id, flags) reservation = db_api.reservation_get(reservation_id) lease_ids.add(reservation['lease_id']) for lease_id in lease_ids: LOG.debug('Lease %s was updated: {"degraded": True}', lease_id) db_api.lease_update(lease_id, {'degraded': True})
def _create_reservation(self, values): resource_type = values['resource_type'] if resource_type not in self.plugins: raise exceptions.UnsupportedResourceType(resource_type) reservation_values = { 'lease_id': values['lease_id'], 'resource_type': resource_type, 'status': status.reservation.PENDING } reservation = db_api.reservation_create(reservation_values) resource_id = self.plugins[resource_type].reserve_resource( reservation['id'], values) db_api.reservation_update(reservation['id'], {'resource_id': resource_id})
def update_reservation(self, reservation_id, values): """Update reservation.""" reservation_values = {'resource_id': values['resource_id']} db_api.reservation_update(reservation_id, reservation_values)