def _retrieve_tasks(self): """Retrieve a list of tasks to retry.""" repositories.start() try: entities, _, _, total = self.order_retry_repo.get_by_create_date( only_at_or_before_this_date=datetime.datetime.utcnow(), suppress_exception=True) finally: repositories.clear() return entities, total
def setup_in_memory_db(): # Ensure we are using in-memory SQLite database, and creating tables. repositories.CONF.set_override("sql_connection", "sqlite:///:memory:") repositories.CONF.set_override("db_auto_create", True) repositories.CONF.set_override("debug", True) # Ensure the connection is completely closed, so any previous in-memory # database can be removed prior to starting the next test run. repositories.hard_reset() # Start the in-memory database, creating required tables. repositories.start()
def test_rollback_with_error_during_project_cleanup(self, mock_delete, mock_handle_error): self._init_memory_db_setup() rep.start() secret = self._create_secret_for_project(self.project1_data) self.assertIsNotNone(secret) secret_id = secret.id project1_id = self.project1_data.id db_secrets = self.repos.secret_repo.get_project_entities(project1_id) self.assertEqual(1, len(db_secrets)) self.assertEqual(secret.id, db_secrets[0].id) db_tenant_secret = self.repos.tenant_secret_repo.get_project_entities( project1_id) self.assertEqual(1, len(db_tenant_secret)) db_kek = self.repos.kek_repo.get_project_entities(project1_id) self.assertEqual(1, len(db_kek)) # rollback changes made so far before creating rollback scenario rep.commit() task = consumer.KeystoneEventConsumer() handle_error_mock = mock.MagicMock() task.handler_error = handle_error_mock self.assertRaises(exception.BarbicanException, task.process, project_id=self.project_id1, resource_type='project', operation_type='deleted') mock_handle_error.assert_called() args, kwargs = mock_handle_error.call_args self.assertEqual(500, args[1]) self.assertEqual(self.project_id1, kwargs['project_id']) self.assertEqual('project', kwargs['resource_type']) self.assertEqual('deleted', kwargs['operation_type']) # Make sure entities are still present after rollback db_secrets = self.repos.secret_repo.get_project_entities(project1_id) self.assertEqual(1, len(db_secrets)) self.assertEqual(secret_id, db_secrets[0].id) db_tenant_secret = self.repos.tenant_secret_repo.get_project_entities( project1_id) self.assertEqual(1, len(db_tenant_secret)) db_kek = self.repos.kek_repo.get_project_entities(project1_id) self.assertEqual(1, len(db_kek)) db_tenant = self.repos.tenant_repo.get_project_entities(project1_id) self.assertEqual(1, len(db_tenant))
def process(self, *args, **kwargs): try: rep.start() super(KeystoneEventConsumer, self).process(*args, **kwargs) rep.commit() except Exception as e: """Exceptions that reach here needs to revert the entire transaction. No need to log error message as its already done earlier. """ rep.rollback() raise e finally: rep.clear()
def setUp(self): super(RepositoryTestCase, self).setUp() # Ensure we are using in-memory SQLite database, and creating tables. repositories.CONF.set_override("sql_connection", "sqlite:///:memory:") repositories.CONF.set_override("db_auto_create", True) repositories.CONF.set_override("debug", False) # Ensure the connection is completely closed, so any previous in-memory # database can be removed prior to starting the next test run. repositories.hard_reset() # Start the in-memory database, creating required tables. repositories.start() # Clean up once tests are completed. self.addCleanup(self._cleanup)
def wrapper(*args, **kwargs): if not queue.is_server_side(): fn(*args, **kwargs) # Non-server mode directly invokes tasks. else: # Start the database session. repositories.start() # Manage session/transaction. try: fn(*args, **kwargs) repositories.commit() except Exception: """NOTE: Wrapped functions must process with care! Exceptions that reach here will revert the entire transaction, including any updates made to entities such as setting error codes and error messages. """ repositories.rollback() finally: repositories.clear()
def _enqueue_task(self, task): """Re-enqueue the specified task.""" retry_task_name = 'N/A' retry_args = 'N/A' retry_kwargs = 'N/A' # Start a new isolated database transaction just for this task. repositories.start() try: # Invoke queue client to place retried RPC task on queue. retry_task_name = task.retry_task retry_args = task.retry_args retry_kwargs = task.retry_kwargs retry_method = getattr(self.queue, retry_task_name) retry_method(*retry_args, **retry_kwargs) # Remove the retry record from the queue. task.status = models.States.ACTIVE self.order_retry_repo.delete_entity_by_id(task.id, None) repositories.commit() LOG.debug( "(Enqueued method '{0}' with args '{1}' and " "kwargs '{2}')".format( retry_task_name, retry_args, retry_kwargs)) except Exception: LOG.exception( u._LE( "Problem enqueuing method '%(name)s' with args '%(args)s' " "and kwargs '%(kwargs)s'."), { 'name': retry_task_name, 'args': retry_args, 'kwargs': retry_kwargs } ) repositories.rollback() finally: repositories.clear()