def test_runs_bootstrap_when_forced(self, lb): opts = self.opts._replace(logdog_force=True) rv = annotated_run._exec_recipe(self.rt, opts, self.basedir, self.tdir, self._config(), self.properties) self.assertEqual(rv, 0) lb.assert_called_once() annotated_run._run_command.assert_called_once()
def test_forwards_error_code(self, lb): opts = self.opts._replace( logdog_force=True) rv = annotated_run._exec_recipe(self.rt, opts, self.basedir, self.tdir, self._config(), self.properties) self.assertEqual(rv, 2) lb.assert_called_once()
def test_runs_directly_if_logdog_error(self, bs_result, bootstrap): bootstrap.return_value = logdog_bootstrap.BootstrapState( ['logdog_bootstrap'] + self.recipe_args, '/path/to/result.json') bs_result.side_effect = logdog_bootstrap.BootstrapError() # Return a different error code depending on whether we're bootstrapping so # we can assert that specifically the non-bootstrapped error code is the one # that is returned. def get_error_code(args, **_kw): if len(args) > 0 and args[0] == 'logdog_bootstrap': return (1, '') return (2, '') annotated_run._run_command.side_effect = get_error_code rv = annotated_run._exec_recipe(self.rt, self.opts, self.basedir, self.tdir, self.properties) self.assertEqual(rv, 2) bootstrap.assert_called_once() bs_result.assert_called_once() annotated_run._run_command.assert_has_calls([ mock.call(['logdog_bootstrap'] + self.recipe_args, dry_run=False), mock.call(self.recipe_args, dry_run=False), ])
def test_exec_with_logdog_bootstrap_fail_raises(self, bootstrap): bootstrap.side_effect = logdog_bootstrap.BootstrapError( 'Bootstrap failed') with self.assertRaises(logdog_bootstrap.BootstrapError): _ = annotated_run._exec_recipe(self.rt, self.opts, self.stream, self.basedir, self.tdir, self.properties)
def test_exec_with_whitelist_builder_runs_logdog(self, service_account, isfile): self.properties['buildername'] = 'yesbuilder' isfile.return_value = True butler_path = self._bp('.recipe_logdog_cipd', 'logdog_butler') annotee_path = self._bp('.recipe_logdog_cipd', 'logdog_annotee') service_account.return_value = 'creds.json' annotated_run._run_command.return_value = (0, '') self._patch(mock.patch('tempfile.mkdtemp', return_value='foo')) config = self._config() rv = annotated_run._exec_recipe(self.rt, self.opts, self.basedir, self.tdir, config, self.properties) self.assertEqual(rv, 0) streamserver_uri = 'unix:%s' % (os.path.join('foo', 'butler.sock'), ) service_account.assert_called_once_with( self.opts, config.logdog_platform.credential_path) annotated_run._run_command.assert_called_with([ butler_path, '-log-level', 'warning', '-prefix', 'bb/master.some/yesbuilder/1337', '-output', 'pubsub,topic="projects/luci-logdog/topics/logs"', '-service-account-json', 'creds.json', '-output-max-buffer-age', '15s', 'run', '-stdout', 'tee=stdout', '-stderr', 'tee=stderr', '-streamserver-uri', streamserver_uri, '--', annotee_path, '-log-level', 'warning', '-butler-stream-server', streamserver_uri, '-logdog-host', 'luci-logdog', '-annotate', 'tee', '-name-base', 'recipes', '-print-summary', '-tee', '-json-args-path', self._tp('logdog_annotee_cmd.json'), ], dry_run=False) self._assertRecipeProperties(self.properties) self._assertAnnoteeCommand(self.recipe_args)
def test_runs_directly_if_bootstrap_fails(self, bootstrap): annotated_run._run_command.return_value = (123, '') rv = annotated_run._exec_recipe(self.rt, self.opts, self.basedir, self.tdir, self.properties) self.assertEqual(rv, 123) bootstrap.assert_called_once() annotated_run._run_command.assert_called_once_with(self.recipe_args, dry_run=False)
def test_runs_directly_if_bootstrap_fails(self, lb): annotated_run._run_command.return_value = (123, '') rv = annotated_run._exec_recipe(self.rt, self.opts, self.basedir, self.tdir, self._config(), self.properties) self.assertEqual(rv, 123) lb.assert_called_once() annotated_run._run_command.assert_called_once_with(self.recipe_args, dry_run=False)
def test_exec_successful(self): annotated_run._run_command.return_value = (0, '') rv = annotated_run._exec_recipe(self.rt, self.opts, self.basedir, self.tdir, self._config(), self.properties) self.assertEqual(rv, 0) self._assertRecipeProperties(self.properties) annotated_run._run_command.assert_called_once_with(self.recipe_args, dry_run=False)
def test_exec_successful(self): annotated_run._run_command.return_value = (0, '') rv = annotated_run._exec_recipe(self.rt, self.opts, self.basedir, self.tdir, self.properties) self.assertEqual(rv, 0) self._assertRecipeProperties(self.properties) annotated_run._run_command.assert_called_once_with(self.recipe_args, dry_run=False)
def test_exec_with_result_proto(self, bootstrap): bootstrap.side_effect = logdog_bootstrap.NotBootstrapped() annotated_run._get_engine_flags.return_value = { 'use_result_proto': True, } annotated_run._run_command.return_value = (13, '') self._writeRecipeResult({}) rv = annotated_run._exec_recipe(self.rt, self.opts, self.stream, self.basedir, self.tdir, self.properties) self.assertEqual(rv, 13)
def test_exec_with_logdog_bootstrap(self, bs_result, bootstrap): bootstrap.return_value = logdog_bootstrap.BootstrapState( ['logdog_bootstrap'] + self.recipe_args, '/path/to/result.json') bootstrap.return_value.get_result.return_value = 13 annotated_run._run_command.return_value = (13, '') rv = annotated_run._exec_recipe(self.rt, self.opts, self.basedir, self.tdir, self.properties) self.assertEqual(rv, 13) annotated_run._run_command.assert_called_once_with( ['logdog_bootstrap'] + self.recipe_args, dry_run=False) self._assertRecipeProperties(self.properties)
def test_runs_directly_if_logdog_error(self, service_account, cipd, isfile): self.properties['buildername'] = 'yesbuilder' # Test Windows builder this time. infra_platform.get.return_value = ('win', 64) isfile.return_value = True cipd.return_value = ('logdog_butler.exe', 'logdog_annotee.exe') service_account.return_value = 'creds.json' def error_for_logdog(args, **kw): if len(args) > 0 and args[0] == 'logdog_butler.exe': return (250, '') return (4, '') annotated_run._run_command.side_effect = error_for_logdog config = self._config() self._patch(mock.patch('tempfile.mkdtemp', return_value='foo')) rv = annotated_run._exec_recipe(self.rt, self.opts, self.basedir, self.tdir, config, self.properties) self.assertEqual(rv, 4) streamserver_uri = 'net.pipe:LUCILogDogButler' service_account.assert_called_once_with( self.opts, config.logdog_platform.credential_path) annotated_run._run_command.assert_has_calls([ mock.call([ 'logdog_butler.exe', '-log-level', 'warning', '-prefix', 'bb/master.some/yesbuilder/1337', '-output', 'pubsub,topic="projects/luci-logdog/topics/logs"', '-service-account-json', 'creds.json', '-output-max-buffer-age', '15s', 'run', '-stdout', 'tee=stdout', '-stderr', 'tee=stderr', '-streamserver-uri', streamserver_uri, '--', 'logdog_annotee.exe', '-log-level', 'warning', '-butler-stream-server', streamserver_uri, '-logdog-host', 'luci-logdog', '-annotate', 'tee', '-name-base', 'recipes', '-print-summary', '-tee', '-json-args-path', self._tp('logdog_annotee_cmd.json'), ], dry_run=False), mock.call(self.recipe_args, dry_run=False), ])
def test_exec_with_whitelist_builder_runs_logdog(self, service_account, isfile): self.properties['buildername'] = 'yesbuilder' isfile.return_value = True butler_path = self._bp('.recipe_logdog_cipd', 'logdog_butler') annotee_path = self._bp('.recipe_logdog_cipd', 'logdog_annotee') service_account.return_value = 'creds.json' annotated_run._run_command.return_value = (0, '') self._patch(mock.patch('tempfile.mkdtemp', return_value='foo')) config = self._config() rv = annotated_run._exec_recipe(self.rt, self.opts, self.basedir, self.tdir, config, self.properties) self.assertEqual(rv, 0) streamserver_uri = 'unix:%s' % (os.path.join('foo', 'butler.sock'),) service_account.assert_called_once_with( self.opts, config.logdog_platform.credential_path) annotated_run._run_command.assert_called_with( [butler_path, '-log-level', 'warning', '-prefix', 'bb/master.some/yesbuilder/1337', '-output', 'pubsub,topic="projects/luci-logdog/topics/logs"', '-service-account-json', 'creds.json', '-output-max-buffer-age', '15s', 'run', '-stdout', 'tee=stdout', '-stderr', 'tee=stderr', '-streamserver-uri', streamserver_uri, '--', annotee_path, '-log-level', 'warning', '-butler-stream-server', streamserver_uri, '-logdog-host', 'luci-logdog', '-annotate', 'tee', '-name-base', 'recipes', '-print-summary', '-tee', '-json-args-path', self._tp('logdog_annotee_cmd.json'), ], dry_run=False) self._assertRecipeProperties(self.properties) self._assertAnnoteeCommand(self.recipe_args)
def test_exec_with_logdog_bootstrap_logdog_only(self, bs_result, bootstrap): cfg = self._default_namedtuple(logdog_bootstrap.Config)._replace( params=self._default_namedtuple(logdog_bootstrap.Params)._replace( project="project", ), prefix="prefix", host="example.com", logdog_only=True, ) bootstrap.return_value = logdog_bootstrap.BootstrapState( cfg, ['logdog_bootstrap'] + self.recipe_args, '/path/to/result.json') bootstrap.return_value.get_result.return_value = 13 annotated_run._run_command.return_value = (13, '') self._writeRecipeResult({}) rv = annotated_run._exec_recipe(self.rt, self.opts, self.stream, self.basedir, self.tdir, self.properties) self.assertEqual(rv, 13) annotated_run._run_command.assert_called_once_with( ['logdog_bootstrap'] + self.recipe_args, dry_run=False) self._assertRecipeProperties(self.properties) self.assertEqual([ l for l in self.stream_output.getvalue().splitlines() if l ], [ '@@@SEED_STEP LogDog Bootstrap@@@', '@@@STEP_CURSOR LogDog Bootstrap@@@', '@@@STEP_STARTED@@@', '@@@SET_BUILD_PROPERTY@logdog_project@"project"@@@', '@@@SET_BUILD_PROPERTY@logdog_prefix@"prefix"@@@', ('@@@SET_BUILD_PROPERTY@log_location@' '"logdog://example.com/project/prefix/+/recipes/annotations"@@@'), '@@@STEP_CURSOR LogDog Bootstrap@@@', '@@@STEP_CLOSED@@@', ])
def test_forwards_error_code(self, lb): opts = self.opts._replace(logdog_force=True) rv = annotated_run._exec_recipe(self.rt, opts, self.basedir, self.tdir, self._config(), self.properties) self.assertEqual(rv, 2) lb.assert_called_once()