def test_owner_pr_module_utils_and_modules_updated_submitter_maintainer_2(self): """ PR updates 2 files (one below modules, the other below module_utils), submitter is a maintainer from both, check that owner_pr is set. Submitter is maintainer from module_utils file. """ BOTMETA = u""" --- macros: modules: lib/ansible/modules module_utils: lib/ansible/module_utils files: $modules/foo/bar.py: maintainers: ElsA ZaZa $module_utils/baz/bar.py: maintainers: TiTi mscherer """ modules = {u'lib/ansible/modules/foo/bar.py': None} module_indexer = create_indexer(textwrap.dedent(BOTMETA), modules) self.assertEqual(len(module_indexer.modules), 2) # ensure only fake data are loaded self.assertEqual(sorted(module_indexer.botmeta[u'files'][u'lib/ansible/modules/foo/bar.py'][u'maintainers']), [u'ElsA', u'ZaZa']) self.assertEqual(sorted(module_indexer.botmeta[u'files'][u'lib/ansible/module_utils/baz/bar.py'][u'maintainers']), [u'TiTi', u'mscherer']) CM = ComponentMatcherMock() CM.expected_results = [ { u'repo_filename': u'lib/ansible/module_utils/foo/bar.py', u'labels': [], u'support': None, u'maintainers': [u'ElsA', u'mscherer'], u'notify': [u'ElsA', u'mscherer'], u'ignore': [], }, { u'repo_filename': u'lib/ansible/modules/baz/bar.py', u'labels': [], u'support': None, u'maintainers': [u'TiTi', u'ZaZa'], u'notify': [u'TiTi', u'ZaZa'], u'ignore': [], } ] meta = self.meta.copy() datafile = u'tests/fixtures/shipit/0_issue.yml' statusfile = u'tests/fixtures/shipit/0_prstatus.json' with get_issue(datafile, statusfile) as iw: iw.pr_files = [ MockFile(u'lib/ansible/modules/foo/bar.py'), MockFile(u'lib/ansible/module_utils/baz/bar.py') ] iw.file_indexer = FileIndexerMock() meta.update(get_component_match_facts(iw, CM, [])) facts = get_shipit_facts(iw, meta, module_indexer, core_team=[u'bcoca'], botnames=[u'ansibot']) self.assertEqual(iw.submitter, u'mscherer') self.assertFalse(facts[u'owner_pr'])
def testshipit_with_noncore_rebuild_merge(self): # a !core rebuild_merge should not be a shipit? IW = IssueWrapperMock('ansible', 'ansible', 1) IW._is_pullrequest = True IW.add_file(u'foo', u'') IW.add_comment('jane', 'shipit') IW.add_comment('z', 'rebuild_merge') MI = ModuleIndexerMock([]) meta = { u'is_module_util': False, u'is_new_module': False, u'is_needs_rebase': False, u'is_needs_revision': False, u'component_maintainers': [u'jane', u'doe'], u'component_matches': [ {u'repo_filename': u'foo', u'maintainers': [u'jane', u'doe']} ] } core_team = ['x'] sfacts = get_shipit_facts(IW, meta, MI, core_team=core_team) assert not sfacts[u'shipit'] assert not sfacts[u'supershipit'] assert not sfacts[u'supershipit_actors'] assert sfacts[u'shipit_actors'] == [u'jane'] assert sfacts[u'shipit_actors_other'] == [u'z'] assert sfacts[u'shipit_count_ansible'] == 0 assert sfacts[u'shipit_count_maintainer'] == 1 assert sfacts[u'shipit_count_other'] == 1 assert sfacts[u'shipit_count_vtotal'] == 2
def test_owner_pr_submitter_is_not_maintainer_of_all_updated_files(self): """ PR updates 2 files below module_utils, submitter is a maintainer from only one: ensure owner_pr isn't set """ BOTMETA = u""" --- macros: modules: lib/ansible/modules module_utils: lib/ansible/module_utils files: $module_utils/foo/bar.py: maintainers: ElsA Oliver $module_utils/baz/bar.py: maintainers: TiTi ZaZa """ module_indexer = create_indexer(textwrap.dedent(BOTMETA), {}) self.assertEqual(len(module_indexer.modules), 1) # ensure only fake data are loaded self.assertEqual(sorted(module_indexer.botmeta[u'files'][u'lib/ansible/module_utils/foo/bar.py'][u'maintainers']), [u'ElsA', u'Oliver']) self.assertEqual(sorted(module_indexer.botmeta[u'files'][u'lib/ansible/module_utils/baz/bar.py'][u'maintainers']), [u'TiTi', u'ZaZa']) CM = ComponentMatcherMock() CM.expected_results = [ { u'repo_filename': u'lib/ansible/module_utils/foo/bar.py', u'labels': [], u'support': None, u'maintainers': [u'ElsA', u'Oliver'], u'notify': [u'ElsA', u'Oliver'], u'ignore': [], }, { u'repo_filename': u'lib/ansible/modules/baz/bar.py', u'labels': [], u'support': None, u'maintainers': [u'TiTi', u'ZaZa'], u'notify': [u'TiTi', u'ZaZa'], u'ignore': [], } ] issue = IssueMock(u'/dev/null') issue.user.login = u'ElsA' issue.html_url = u'https://github.com/ansible/ansible/pull/123' iw = IssueWrapper(cachedir="", issue=issue) iw.pr_files = [ MockFile(u'lib/ansible/module_utils/foo/bar.py'), MockFile(u'lib/ansible/module_utils/baz/bar.py') ] iw.file_indexer = FileIndexerMock() iw.repo = MockRepo(repo_path='ansible/ansible') meta = self.meta.copy() iw._commits = [] meta.update(get_component_match_facts(iw, CM, [])) facts = get_shipit_facts(iw, meta, module_indexer, core_team=[u'bcoca', u'mscherer'], botnames=[u'ansibot']) self.assertEqual(iw.submitter, u'ElsA') self.assertFalse(facts[u'owner_pr'])
def test_supershipit_changelogs(self): # a supershipit should count from a supershipiteer # https://github.com/ansible/ansibullbot/issues/1147 IW = IssueWrapperMock('ansible', 'ansible', 1) IW._is_pullrequest = True IW.add_comment('jane', 'shipit') MI = ModuleIndexerMock([]) meta = { u'is_module_util': False, u'is_new_module': False, u'is_needs_rebase': False, u'is_needs_revision': False, u'component_matches': [ {u'repo_filename': u'foo', u'supershipit': [u'jane', u'doe']}, {u'repo_filename': u'changelogs/fragments/000-foo-change.yml'} ] } sfacts = get_shipit_facts(IW, meta, MI) # don't let the plugin modify the meta assert len(meta[u'component_matches']) == 2 assert sfacts[u'shipit'] assert sfacts[u'supershipit'] assert sfacts[u'shipit_actors'] == [] assert sfacts[u'shipit_actors_other'] == [u'jane']
def test_review_facts_are_defined_module_utils(self): BOTMETA = u""" --- macros: modules: lib/ansible/modules module_utils: lib/ansible/module_utils files: $module_utils: support: community $modules/foo/bar.py: maintainers: ElsA ZaZa $module_utils/baz/bar.py: maintainers: TiTi mscherer """ modules = {u'lib/ansible/modules/foo/bar.py': None} module_indexer = create_indexer(textwrap.dedent(BOTMETA), modules) self.assertEqual(len(module_indexer.modules), 2) # ensure only fake data are loaded self.assertEqual(sorted(module_indexer.botmeta[u'files'][u'lib/ansible/modules/foo/bar.py'][u'maintainers']),[u'ElsA', u'ZaZa']) self.assertEqual(sorted(module_indexer.botmeta[u'files'][u'lib/ansible/module_utils/baz/bar.py'][u'maintainers']),[u'TiTi', u'mscherer']) datafile = u'tests/fixtures/shipit/2_issue.yml' statusfile = u'tests/fixtures/shipit/2_prstatus.json' with get_issue(datafile, statusfile) as iw: iw.pr_files = [MockFile(u'lib/ansible/module_utils/foo/bar.py')] # need to give the wrapper a list of known files to compare against iw.file_indexer = FileIndexerMock() iw.file_indexer.files.append(u'lib/ansible/modules/foo/bar.py') # predefine what the matcher is going to return CM = ComponentMatcherMock() CM.expected_results = [ { u'repo_filename': u'lib/ansible/module_utils/foo/bar.py', u'labels': [], u'support': None, u'maintainers': [u'ElsA', u'Oliver'], u'notify': [u'ElsA', u'Oliver'], u'ignore': [], } ] meta = self.meta.copy() iw._commits = [] meta.update(get_component_match_facts(iw, CM, [])) meta.update(get_shipit_facts(iw, meta, module_indexer, core_team=[u'bcoca'], botnames=[u'ansibot'])) facts = get_review_facts(iw, meta) self.assertTrue(facts[u'community_review']) self.assertFalse(facts[u'core_review']) self.assertFalse(facts[u'committer_review'])
def needs_rebase_or_revision_prevent_shipit(self, meta): datafile = u'tests/fixtures/shipit/1_issue.yml' statusfile = u'tests/fixtures/shipit/1_prstatus.json' with get_issue(datafile, statusfile) as iw: namespace_maintainers = [u'LinusU'] facts = get_shipit_facts(iw, meta, ModuleIndexerMock(namespace_maintainers), core_team=[u'bcoca', u'mscherer'], botnames=[u'ansibot']) self.assertEqual(iw.submitter, u'mscherer') self.assertFalse(facts[u'community_usernames']) self.assertFalse(facts[u'shipit_actors']) self.assertEqual(facts[u'shipit_count_ansible'], 0) self.assertEqual(facts[u'shipit_count_maintainer'], 0) self.assertEqual(facts[u'shipit_count_community'], 0) self.assertFalse(facts[u'shipit'])
def test_owner_pr_submitter_is_maintainer_new_module(self): """ Submitter is a maintainer: pull request adds a new module: ensure owner_pr is False """ BOTMETA = u""" --- macros: modules: lib/ansible/modules module_utils: lib/ansible/module_utils files: $modules/foo/bar.py: maintainers: ElsA mscherer """ modules = {} # new module module_indexer = create_indexer(textwrap.dedent(BOTMETA), modules) self.assertEqual(len(module_indexer.modules), 1) # ensure only fake data are loaded # Ensure that BOTMETA.yml updates doesn't interfere self.assertEqual(sorted(module_indexer.botmeta[u'files'][u'lib/ansible/modules/foo/bar.py'][u'maintainers']), [u'ElsA', u'mscherer']) CM = ComponentMatcherMock() CM.expected_results = [ { u'repo_filename': u'lib/ansible/modules/foo/bar.py', u'labels': [], u'support': None, u'maintainers': [u'ElsA', u'mscherer'], u'notify': [u'ElsA', u'mscherer'], u'ignore': [], } ] meta = self.meta.copy() datafile = u'tests/fixtures/shipit/0_issue.yml' statusfile = u'tests/fixtures/shipit/0_prstatus.json' with get_issue(datafile, statusfile) as iw: iw.pr_files = [MockFile(u'lib/ansible/modules/foo/bar.py')] iw.file_indexer = FileIndexerMock() meta.update(get_component_match_facts(iw, CM, [])) facts = get_shipit_facts(iw, meta, module_indexer, core_team=[u'bcoca'], botnames=[u'ansibot']) self.assertEqual(iw.submitter, u'mscherer') self.assertFalse(facts[u'owner_pr'])
def test_supershipit_shipit_facts(self): # a supershipit should count from a supershipiteer IW = IssueWrapperMock('ansible', 'ansible', 1) IW._is_pullrequest = True IW.add_comment('jane', 'shipit') MI = ModuleIndexerMock([]) meta = { u'is_module_util': False, u'is_new_module': False, u'is_needs_rebase': False, u'is_needs_revision': False, u'component_matches': [ {u'repo_filename': u'foo', u'supershipit': [u'jane', u'doe']} ] } sfacts = get_shipit_facts(IW, meta, MI) assert sfacts[u'shipit'] assert sfacts[u'supershipit'] assert sfacts[u'shipit_actors'] == [] assert sfacts[u'shipit_actors_other'] == [u'jane']
def test_core_is_not_supershipit(self): # a core team member should not be auto-added as a shipiteer IW = IssueWrapperMock('ansible', 'ansible', 1) IW._is_pullrequest = True IW.add_comment('coreperson', 'shipit') MI = ModuleIndexerMock([]) meta = { u'is_module_util': False, u'is_new_module': False, u'is_needs_rebase': False, u'is_needs_revision': False, u'component_matches': [ {u'repo_filename': u'foo', u'supershipit': [u'jane', u'doe']} ] } sfacts = get_shipit_facts(IW, meta, MI, core_team=[u'coreperson']) assert not sfacts[u'supershipit'] assert not sfacts[u'shipit'] assert not sfacts[u'supershipit'] assert not sfacts[u'shipit_actors_other'] assert sfacts[u'shipit_actors'] == [u'coreperson']
def test_supershipit_shipit_not_all_files(self): # make sure there is supershipit for all files IW = IssueWrapperMock('ansible', 'ansible', 1) IW._is_pullrequest = True IW.add_comment(u'jane', u'shipit') MI = ModuleIndexerMock([]) meta = { u'is_module_util': False, u'is_new_module': False, u'is_needs_rebase': False, u'is_needs_revision': False, u'component_matches': [ {u'repo_filename': u'foo', u'supershipit': [u'jane']}, {u'repo_filename': u'bar', u'supershipit': [u'doe']} ] } sfacts = get_shipit_facts(IW, meta, MI) assert not sfacts[u'shipit'] assert not sfacts[u'supershipit'] assert sfacts[u'shipit_actors_other'] == [u'jane'] assert not sfacts[u'shipit_actors']
def test_submitter_is_maintainer(self): """ Submitter is a namespace maintainer: approval must be automatically added """ datafile = u'tests/fixtures/shipit/0_issue.yml' statusfile = u'tests/fixtures/shipit/0_prstatus.json' with get_issue(datafile, statusfile) as iw: namespace_maintainers = [u'LinusU', u'mscherer'] _meta = self.meta.copy() _meta[u'component_maintainers'] = [] _meta[u'component_namespace_maintainers'] = namespace_maintainers[:] facts = get_shipit_facts(iw, _meta, ModuleIndexerMock(namespace_maintainers), core_team=[u'bcoca'], botnames=[u'ansibot']) self.assertEqual(iw.submitter, u'mscherer') self.assertEqual([u'LinusU', u'mscherer'], facts[u'community_usernames']) self.assertEqual([u'mscherer'], facts[u'shipit_actors']) self.assertEqual(facts[u'shipit_count_ansible'], 0) # bcoca self.assertEqual(facts[u'shipit_count_maintainer'], 0) # abulimov self.assertEqual(facts[u'shipit_count_community'], 1) # LinusU, mscherer self.assertFalse(facts[u'shipit'])
def test_supershipit_changelogs(self): # a supershipit should count from a supershipiteer # https://github.com/ansible/ansibullbot/issues/1147 IW = IssueWrapperMock('ansible', 'ansible', 1) IW.pr_files = [ MockFile(u'foo'), MockFile(u'changelogs/fragments/000-foo-change.yml'), ] IW._is_pullrequest = True IW.add_comment('jane', 'shipit') meta = { u'is_module_util': False, u'is_new_module': False, u'is_needs_rebase': False, u'is_needs_revision': False, u'component_matches': [{ u'repo_filename': u'foo', u'supershipit': [u'jane', u'doe'] }, { u'repo_filename': u'changelogs/fragments/000-foo-change.yml' }] } sfacts = get_shipit_facts(IW, meta, {}) # don't let the plugin modify the meta assert len(meta[u'component_matches']) == 2 assert sfacts[u'shipit'] assert sfacts[u'supershipit'] assert sfacts[u'shipit_actors'] == [] assert sfacts[u'shipit_actors_other'] == [u'jane']
def test_owner_pr_module_utils_and_modules_updated_submitter_maintainer_2( self): """ PR updates 2 files (one below modules, the other below module_utils), submitter is a maintainer from both, check that owner_pr is set. Submitter is maintainer from module_utils file. """ BOTMETA = """ --- macros: modules: lib/ansible/modules module_utils: lib/ansible/module_utils files: $modules/foo/bar.py: maintainers: ElsA ZaZa $module_utils/baz/bar.py: maintainers: TiTi mscherer """ modules = {'lib/ansible/modules/foo/bar.py': None} module_indexer = create_indexer(textwrap.dedent(BOTMETA), modules) self.assertEqual(len(module_indexer.modules), 2) # ensure only fake data are loaded self.assertEqual( sorted(module_indexer.botmeta['files'] ['lib/ansible/modules/foo/bar.py']['maintainers']), ['ElsA', 'ZaZa']) self.assertEqual( sorted(module_indexer.botmeta['files'] ['lib/ansible/module_utils/baz/bar.py']['maintainers']), ['TiTi', 'mscherer']) CM = ComponentMatcherMock() CM.expected_results = [{ 'repo_filename': 'lib/ansible/module_utils/foo/bar.py', 'labels': [], 'support': None, 'maintainers': ['ElsA', 'mscherer'], 'notify': ['ElsA', 'mscherer'], 'ignore': [], }, { 'repo_filename': 'lib/ansible/modules/baz/bar.py', 'labels': [], 'support': None, 'maintainers': ['TiTi', 'ZaZa'], 'notify': ['TiTi', 'ZaZa'], 'ignore': [], }] meta = self.meta.copy() datafile = 'tests/fixtures/shipit/0_issue.yml' statusfile = 'tests/fixtures/shipit/0_prstatus.json' with get_issue(datafile, statusfile) as iw: iw.pr_files = [ MockFile('lib/ansible/modules/foo/bar.py'), MockFile('lib/ansible/module_utils/baz/bar.py') ] iw.file_indexer = FileIndexerMock() meta.update( get_component_match_facts(iw, {}, CM, iw.file_indexer, module_indexer, [])) facts = get_shipit_facts(iw, meta, module_indexer, core_team=['bcoca'], botnames=['ansibot']) self.assertEqual(iw.submitter, 'mscherer') self.assertFalse(facts['owner_pr'])
def test_owner_pr_submitter_is_not_maintainer_of_all_updated_files(self): """ PR updates 2 files below module_utils, submitter is a maintainer from only one: ensure owner_pr isn't set """ BOTMETA = """ --- macros: modules: lib/ansible/modules module_utils: lib/ansible/module_utils files: $module_utils/foo/bar.py: maintainers: ElsA Oliver $module_utils/baz/bar.py: maintainers: TiTi ZaZa """ module_indexer = create_indexer(textwrap.dedent(BOTMETA), {}) self.assertEqual(len(module_indexer.modules), 1) # ensure only fake data are loaded self.assertEqual( sorted(module_indexer.botmeta['files'] ['lib/ansible/module_utils/foo/bar.py']['maintainers']), ['ElsA', 'Oliver']) self.assertEqual( sorted(module_indexer.botmeta['files'] ['lib/ansible/module_utils/baz/bar.py']['maintainers']), ['TiTi', 'ZaZa']) CM = ComponentMatcherMock() CM.expected_results = [{ 'repo_filename': 'lib/ansible/module_utils/foo/bar.py', 'labels': [], 'support': None, 'maintainers': ['ElsA', 'Oliver'], 'notify': ['ElsA', 'Oliver'], 'ignore': [], }, { 'repo_filename': 'lib/ansible/modules/baz/bar.py', 'labels': [], 'support': None, 'maintainers': ['TiTi', 'ZaZa'], 'notify': ['TiTi', 'ZaZa'], 'ignore': [], }] issue = IssueMock('/dev/null') issue.user.login = '******' issue.html_url = 'https://github.com/ansible/ansible/pull/123' iw = IssueWrapper(cachedir="", issue=issue) iw.pr_files = [ MockFile('lib/ansible/module_utils/foo/bar.py'), MockFile('lib/ansible/module_utils/baz/bar.py') ] iw.file_indexer = FileIndexerMock() iw.repo = MockRepo(repo_path='ansible/ansible') meta = self.meta.copy() meta.update( get_component_match_facts(iw, {}, CM, FileIndexerMock(), module_indexer, [])) facts = get_shipit_facts(iw, meta, module_indexer, core_team=['bcoca', 'mscherer'], botnames=['ansibot']) self.assertEqual(iw.submitter, 'ElsA') self.assertFalse(facts['owner_pr'])
def test_review_facts_are_defined_module_utils(self): BOTMETA = u""" --- macros: modules: lib/ansible/modules module_utils: lib/ansible/module_utils files: $module_utils: support: community $modules/foo/bar.py: maintainers: ElsA ZaZa $module_utils/baz/bar.py: maintainers: TiTi mscherer """ modules = {u'lib/ansible/modules/foo/bar.py': None} module_indexer = create_indexer(textwrap.dedent(BOTMETA), modules) self.assertEqual(len(module_indexer.modules), 2) # ensure only fake data are loaded self.assertEqual( sorted(module_indexer.botmeta[u'files'] [u'lib/ansible/modules/foo/bar.py'][u'maintainers']), [u'ElsA', u'ZaZa']) self.assertEqual( sorted(module_indexer.botmeta[u'files'] [u'lib/ansible/module_utils/baz/bar.py'][u'maintainers']), [u'TiTi', u'mscherer']) datafile = u'tests/fixtures/shipit/2_issue.yml' statusfile = u'tests/fixtures/shipit/2_prstatus.json' with get_issue(datafile, statusfile) as iw: iw.pr_files = [MockFile(u'lib/ansible/module_utils/foo/bar.py')] # need to give the wrapper a list of known files to compare against iw.file_indexer = FileIndexerMock() iw.file_indexer.files.append(u'lib/ansible/modules/foo/bar.py') # predefine what the matcher is going to return CM = ComponentMatcherMock() CM.expected_results = [{ u'repo_filename': u'lib/ansible/module_utils/foo/bar.py', u'labels': [], u'support': None, u'maintainers': [u'ElsA', u'Oliver'], u'notify': [u'ElsA', u'Oliver'], u'ignore': [], }] meta = self.meta.copy() iw._commits = [] meta.update(get_component_match_facts(iw, CM, [])) meta.update( get_shipit_facts(iw, meta, module_indexer, core_team=[u'bcoca'], botnames=[u'ansibot'])) facts = get_review_facts(iw, meta) self.assertTrue(facts[u'community_review']) self.assertFalse(facts[u'core_review']) self.assertFalse(facts[u'committer_review'])