Files
mongo/buildscripts/resmokelib/testing/hooks/magic_restore.py
seanzimm 138235d599 SERVER-87172: Implement magic restore hook (#19675)
GitOrigin-RevId: ce2811099a58f6e132a13128f67ee521cb201448
2024-03-08 21:26:19 +00:00

85 lines
3.1 KiB
Python

"""Test hook for periodically running a magic restore process and validating cluster consistency."""
import os
from buildscripts.resmokelib.testing.hooks import interface
from buildscripts.resmokelib.testing.hooks import jsfile
class MagicRestoreEveryN(interface.Hook):
"""Open a backup cursor and run magic restore process after 'n' tests have run.
Requires the use of MagicRestoreFixture.
"""
IS_BACKGROUND = False
DEFAULT_N = 20
def __init__(self, hook_logger, fixture, n=DEFAULT_N):
"""Initialize MagicRestoreEveryN."""
description = "MagicRestoreEveryN (runs magic restore against a new cluster every `n` tests)"
interface.Hook.__init__(self, hook_logger, fixture, description)
self.n = n # pylint: disable=invalid-name
self.tests_run = 0
def after_test(self, test, test_report):
"""After test cleanup."""
self.tests_run += 1
if self.tests_run < self.n:
return
# The process of doing magic restore requires the following steps
# Collect backup cursor
hook_test_case = BackupCursorTestCase.create_after_test(test.logger, test, self)
hook_test_case.configure(self.fixture)
hook_test_case.run_dynamic_test(test_report)
# Run the magic restore procedure and run a data consistency check
magic_restore_test_case = MagicRestoreTestCase.create_after_test(test.logger, test, self)
magic_restore_test_case.configure(self.fixture)
magic_restore_test_case.run_dynamic_test(test_report)
self.logger.info("Tearing the fixture down to clear its data.")
self.fixture.teardown()
self.logger.info("Starting the fixture back up again.")
self.fixture.setup()
self.fixture.await_ready()
class BackupCursorTestCase(jsfile.DynamicJSTestCase):
"""BackupCursorTestCase class."""
JS_FILENAME = os.path.join("jstests", "hooks", "magic_restore_backup.js")
def __init__(self, logger, test_name, description, base_test_name, hook):
"""Initialize BackupCursorTestCase."""
jsfile.DynamicJSTestCase.__init__(self, logger, test_name, description, base_test_name,
hook, self.JS_FILENAME)
def run_test(self):
"""Execute test hook."""
self.logger.info("Beginning backup cursor capture")
self._js_test_case.run_test()
self.logger.info("Backup cursor capture complete")
class MagicRestoreTestCase(jsfile.DynamicJSTestCase):
"""MagicRestoreTestCase class."""
JS_FILENAME = os.path.join("jstests", "hooks", "magic_restore.js")
def __init__(self, logger, test_name, description, base_test_name, hook):
"""Initialize MagicRestoreTestCase."""
jsfile.DynamicJSTestCase.__init__(self, logger, test_name, description, base_test_name,
hook, self.JS_FILENAME)
def run_test(self):
"""Execute test hook."""
self.logger.info("Beginning magic restore")
self._js_test_case.run_test()
self.logger.info("Magic restore complete")