def test_updater_simple(self): # Test the client-side updater logic in its simplest case: everything succeeds, and no rolling # updates. mock_options = self.setup_mock_options() (mock_api, mock_scheduler_proxy) = self.create_mock_api() mock_health_check = self.setup_health_checks(mock_api) mock_quota_check = self.setup_quota_check() mock_job_monitor = self.setup_job_monitor() fake_mux = self.FakeSchedulerMux() with contextlib.nested( patch('twitter.common.app.get_options', return_value=mock_options), patch('apache.aurora.client.api.SchedulerProxy', return_value=mock_scheduler_proxy), patch('apache.aurora.client.factory.CLUSTERS', new=self.TEST_CLUSTERS), patch('apache.aurora.client.api.instance_watcher.StatusHealthCheck', return_value=mock_health_check), patch('apache.aurora.client.api.updater.QuotaCheck', return_value=mock_quota_check), patch('apache.aurora.client.api.updater.JobMonitor', return_value=mock_job_monitor), patch('apache.aurora.client.api.updater.SchedulerMux', return_value=fake_mux), patch('time.time', side_effect=functools.partial(self.fake_time, self)), patch('threading._Event.wait') ) as (options, scheduler_proxy_class, test_clusters, mock_health_check_factory, mock_quota_check_patch, mock_job_monitor_patch, fake_mux, time_patch, sleep_patch): self.setup_mock_scheduler_for_simple_update(mock_api) with temporary_file() as fp: fp.write(self.get_valid_config()) fp.flush() update(['west/mchucarroll/test/hello', fp.name]) # We don't check all calls. The updater should be able to change. What's important # is that we verify the key parts of the update process, to have some confidence # that update did the right things. # Every update should: # check its options, acquire an update lock, check status, # kill the old tasks, start new ones, wait for the new ones to healthcheck, # and finally release the lock. # The kill/start should happen in rolling batches. assert options.call_count == 2 assert mock_scheduler_proxy.acquireLock.call_count == 1 self.assert_correct_killtask_calls(mock_scheduler_proxy) self.assert_correct_addinstance_calls(mock_scheduler_proxy) self.assert_correct_status_calls(mock_scheduler_proxy) assert mock_scheduler_proxy.releaseLock.call_count == 1
def test_update_command_line_succeeds(self): mock_options = self.setup_mock_options() (mock_api, mock_scheduler_proxy) = self.create_mock_api() with contextlib.nested( patch('apache.aurora.client.commands.core.make_client', return_value=mock_api), patch('twitter.common.app.get_options', return_value=mock_options), patch('apache.aurora.client.factory.CLUSTERS', new=self.TEST_CLUSTERS)): mock_api.update_job.return_value = self.create_simple_success_response() with temporary_file() as fp: fp.write(self.get_valid_config()) fp.flush() update([self.TEST_JOBSPEC, fp.name]) assert mock_api.update_job.call_count == 1 args, kwargs = mock_api.update_job.call_args assert isinstance(args[0], AuroraConfig) assert args[1] == 3 assert args[2] is None