def test_service_reconfigure(self): config_template = BASIC_CONFIG + dedent(""" services: - name: "a_service" node: local pid_file: "{wd}/%(name)s-%(instance_number)s.pid" command: "{command}" monitor_interval: {monitor_interval} restart_delay: 2 """) command = ("cd {path} && PYTHONPATH=. python " "{path}/tests/mock_daemon.py %(pid_file)s") command = command.format(path=os.path.abspath('.')) config = config_template.format( command=command, monitor_interval=1, wd=self.sandbox.tmp_dir) self.start_with_config(config) service_name = 'MASTER.a_service' service_url = self.client.get_url(service_name) self.sandbox.tronctl('start', service_name) waiter = sandbox.build_waiter_func(self.client.service, service_url) waiter(service.ServiceState.UP) new_config = config_template.format( command=command, monitor_interval=2, wd=self.sandbox.tmp_dir) self.sandbox.tronfig(new_config) waiter(service.ServiceState.DISABLED) self.sandbox.tronctl('start', service_name) waiter(service.ServiceState.UP) self.sandbox.tronctl('stop', service_name) waiter(service.ServiceState.DISABLED)
def test_skip_failed_actions(self): config = BASIC_CONFIG + dedent(""" jobs: - name: "multi_step_job" node: local schedule: "constant" actions: - name: "broken" command: "failingcommand" - name: "works" command: "echo ok" requires: [broken] """) self.start_with_config(config) action_run_url = self.client.get_url('MASTER.multi_step_job.0.broken') waiter = sandbox.build_waiter_func(self.client.action_runs, action_run_url) waiter(actionrun.ActionRun.STATE_FAILED.name) self.sandbox.tronctl('skip', 'MASTER.multi_step_job.0.broken') waiter(actionrun.ActionRun.STATE_SKIPPED.name) action_run_url = self.client.get_url('MASTER.multi_step_job.0.works') sandbox.wait_on_state(self.client.action_runs, action_run_url, actionrun.ActionRun.STATE_SUCCEEDED.name) job_run_url = self.client.get_url('MASTER.multi_step_job.0') sandbox.wait_on_state(self.client.job_runs, job_run_url, actionrun.ActionRun.STATE_SUCCEEDED.name)
def test_service_failed_restart(self): config = BASIC_CONFIG + dedent(""" services: - name: service_restart node: local pid_file: "/tmp/file_dne" command: "sleep 1; cat /bogus/file/DNE" monitor_interval: 1 restart_delay: 2 """) self.start_with_config(config) service_name = 'MASTER.service_restart' service_url = self.client.get_url(service_name) self.sandbox.tronctl('start', service_name) waiter = sandbox.build_waiter_func(self.client.service, service_url) waiter(service.ServiceState.FAILED) service_content = self.client.service(service_url) expected = 'cat: /bogus/file/DNE: No such file or directory' assert_in(service_content['instances'][0]['failures'][0], expected) waiter(service.ServiceState.STARTING)
def test_service_reconfigure(self): config_template = BASIC_CONFIG + dedent(""" services: - name: "a_service" node: local pid_file: "{wd}/%(name)s-%(instance_number)s.pid" command: "{command}" monitor_interval: {monitor_interval} restart_delay: 2 """) command = ("cd {path} && PYTHONPATH=. python " "{path}/tests/mock_daemon.py %(pid_file)s") command = command.format(path=os.path.abspath('.')) config = config_template.format( command=command, monitor_interval=1, wd=self.sandbox.tmp_dir, ) self.start_with_config(config) service_name = 'MASTER.a_service' service_url = self.client.get_url(service_name) self.sandbox.tronctl('start', service_name) waiter = sandbox.build_waiter_func(self.client.service, service_url) waiter(service.ServiceState.UP) new_config = config_template.format( command=command, monitor_interval=2, wd=self.sandbox.tmp_dir, ) self.sandbox.tronfig(new_config) waiter(service.ServiceState.DISABLED) self.sandbox.tronctl('start', service_name) waiter(service.ServiceState.UP) self.sandbox.tronctl('stop', service_name) waiter(service.ServiceState.DISABLED)