Creates a mock job manager that intercepts job manager (PBS/Slurm) in the given `hq_env` and passes them to the given `handler`.
| 51 | |
| 52 | |
| 53 | class MockJobManager: |
| 54 | """ |
| 55 | Creates a mock job manager that intercepts job manager (PBS/Slurm) in the given `hq_env` and |
| 56 | passes them to the given `handler`. |
| 57 | """ |
| 58 | |
| 59 | def __init__( |
| 60 | self, |
| 61 | hq_env: HqEnv, |
| 62 | handler: CommandHandler, |
| 63 | mocked_commands=("qsub", "qstat", "qdel", "sbatch", "scontrol", "scancel"), |
| 64 | ): |
| 65 | self.handler: CommandHandler = handler |
| 66 | |
| 67 | # Make sure that we're not communicating with a different test instance that could target |
| 68 | # the same port. |
| 69 | self.key = generate_key() |
| 70 | |
| 71 | # Prepare redirector path |
| 72 | self.redirector_path = hq_env.mock.directory / "redirector.py" |
| 73 | self.mocked_commands = mocked_commands |
| 74 | self.hq_env = hq_env |
| 75 | |
| 76 | self.bg_server: Optional[BackgroundServer] = None |
| 77 | |
| 78 | def __enter__(self): |
| 79 | assert self.bg_server is None |
| 80 | self.bg_server = BackgroundServer(handler=self.handler, key=self.key) |
| 81 | prepare_redirector(self.redirector_path, port=self.bg_server.port, key=self.key) |
| 82 | # Link selected commands to redirector |
| 83 | for cmd in self.mocked_commands: |
| 84 | self.hq_env.mock.redirect_program_to_binary(cmd, self.redirector_path) |
| 85 | |
| 86 | logging.debug(f"Wrote redirector to {self.redirector_path}") |
| 87 | return self |
| 88 | |
| 89 | def __exit__(self, exc_type, exc_val, exc_tb): |
| 90 | assert self.bg_server is not None |
| 91 | self.bg_server.stop() |
| 92 | self.bg_server = None |
| 93 | |
| 94 | |
| 95 | def generate_key() -> str: |
no outgoing calls