Example #1
0
    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
Example #2
0
    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})
Example #3
0
    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})
Example #4
0
 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})
Example #5
0
 def update_reservation(self, reservation_id, values):
     """Update reservation."""
     reservation_values = {'resource_id': values['resource_id']}
     db_api.reservation_update(reservation_id, reservation_values)