| """This module is for all fake implementations of things in Mysos executor for testing.""" |
| |
| import os |
| import random |
| import subprocess |
| import threading |
| |
| from mysos.common.decorators import synchronized |
| from mysos.executor.task_control import TaskControl, TaskControlProvider |
| |
| |
| class FakeTaskControlProvider(TaskControlProvider): |
| """ |
| An implementation of TaskControlProvider for testing. |
| """ |
| |
| def from_task(self, task, sandbox): |
| return FakeTaskControl(position=random.randint(0, 100)) |
| |
| |
| class FakeTaskControl(TaskControl): |
| def __init__( |
| self, |
| mysqld="tail -f /dev/null", |
| initialize_cmd=":", |
| start_cmd=":", |
| reparent_cmd=":", |
| promote_cmd=":", |
| get_log_position_cmd=":", |
| position=1): |
| """ |
| :param mysqld: The command that 'simulates' mysqld (and does nothing). |
| :param *_cmd: The commands that are executed for the respective FakeTaskControl operations. |
| :param position: The 'mysqld' log position to return as the result of get_log_position(). |
| """ |
| self._lock = threading.Lock() |
| self._mysqld = mysqld |
| self._initialize_cmd = initialize_cmd |
| self._start_cmd = start_cmd, |
| self._reparent_cmd = reparent_cmd, |
| self._promote_cmd = promote_cmd, |
| self._get_log_position_cmd = get_log_position_cmd |
| self._position = position |
| self._process = None |
| |
| @synchronized |
| def initialize(self, env): |
| subprocess.check_call(self._initialize_cmd, shell=True) |
| |
| @synchronized |
| def start(self, env=None): |
| if self._process: |
| return |
| |
| self._process = subprocess.Popen(self._mysqld, shell=True, preexec_fn=os.setsid) |
| subprocess.check_call(self._start_cmd, shell=True) |
| return self._process |
| |
| @synchronized |
| def reparent(self, master_host, master_port, env=None): |
| subprocess.check_call(self._reparent_cmd, shell=True) |
| |
| @synchronized |
| def promote(self, env=None): |
| subprocess.check_call(self._promote_cmd, shell=True) |
| |
| @synchronized |
| def get_log_position(self, env=None): |
| subprocess.check_call(self._get_log_position_cmd, shell=True) |
| return self._position |