def test_render_mail(self, autorebuild, submitter): # just test a random combination of the method inputs and hope it's ok for other # combinations class WF(object): image = ImageName.parse('foo/bar:baz') openshift_build_selflink = '/builds/blablabla' kwargs = {'url': 'https://something.com'} if submitter: kwargs['submitter'] = submitter p = SendMailPlugin(None, WF(), **kwargs) subject, body = p._render_mail(autorebuild, False, False) exp_subject = 'Image foo/bar:baz; Status failed; Submitted by ' exp_body = [ 'Image: foo/bar:baz', 'Status: failed', 'Submitted by: ', 'Logs: https://something.com/builds/blablabla/log' ] if autorebuild: exp_subject += '<autorebuild>' exp_body[2] += '<autorebuild>' elif submitter: exp_subject += submitter exp_body[2] += submitter else: exp_subject += 'unknown' exp_body[2] += 'unknown' assert subject == exp_subject assert body == '\n'.join(exp_body)
def test_failed_logs(self, workflow, source_dir, error_type): # just test a random combination of the method inputs and hope it's ok for other # combinations session = MockedClientSession('', has_kerberos=True) pathinfo = MockedPathInfo('https://koji') flexmock(koji, ClientSession=lambda hub, opts: session, PathInfo=pathinfo) kwargs = { 'url': 'https://something.com', 'smtp_host': 'smtp.bar.com', 'from_address': '*****@*****.**', 'to_koji_submitter': True, 'to_koji_pkgowner': False, } mock_store_metadata_results(workflow) workflow.data.postbuild_results[KojiImportPlugin.key] = MOCK_KOJI_BUILD_ID dockerfile = source_dir / DOCKERFILE_FILENAME dockerfile.write_text(MOCK_DOCKERFILE, "utf-8") flexmock(workflow, df_path=str(dockerfile)) smtp_map = { 'from_address': '*****@*****.**', 'host': 'smtp.bar.com', 'send_to_submitter': True, 'send_to_pkg_owner': False, } rcm = {'version': 1, 'smtp': smtp_map, 'openshift': {'url': 'https://something.com'}} workflow.conf = Configuration(raw_config=rcm) add_koji_map_in_workflow(workflow, hub_url='/', root_url='', ssl_certs_dir='/certs') p = SendMailPlugin(workflow, **kwargs) _, _, fail_logs = p._render_mail(False, False) assert not fail_logs
def test_failed_logs(self, monkeypatch, error_type, reactor_config_map): # noqa # just test a random combination of the method inputs and hope it's ok for other # combinations class TagConf(object): unique_images = [] class WF(object): image = util.ImageName.parse('foo/bar:baz') openshift_build_selflink = '/builds/blablabla' build_process_failed = True autorebuild_canceled = False build_canceled = False tag_conf = TagConf() exit_results = {KojiPromotePlugin.key: MOCK_KOJI_BUILD_ID} prebuild_results = {} plugin_workspace = {} monkeypatch.setenv( "BUILD", json.dumps({ 'metadata': { 'labels': { 'koji-task-id': MOCK_KOJI_TASK_ID, }, 'name': {}, } })) session = MockedClientSession('', has_kerberos=True) pathinfo = MockedPathInfo('https://koji') flexmock(OSBS).should_receive('get_orchestrator_build_logs').and_raise( error_type) flexmock(koji, ClientSession=lambda hub, opts: session, PathInfo=pathinfo) kwargs = { 'url': 'https://something.com', 'smtp_host': 'smtp.bar.com', 'from_address': '*****@*****.**', 'to_koji_submitter': True, 'to_koji_pkgowner': False, 'koji_hub': '/', 'koji_root': 'https://koji/', 'koji_proxyuser': None, 'koji_ssl_certs_dir': '/certs', 'koji_krb_principal': None, 'koji_krb_keytab': None } workflow = WF() mock_store_metadata_results(workflow) if reactor_config_map: smtp_map = { 'from_address': '*****@*****.**', 'host': 'smtp.bar.com', 'send_to_submitter': True, 'send_to_pkg_owner': False, } koji_map = { 'hub_url': '/', 'root_url': 'https://koji/', 'auth': { 'ssl_certs_dir': '/certs' } } workflow.plugin_workspace[ReactorConfigPlugin.key] = {} workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\ ReactorConfig({'version': 1, 'openshift': {'url': 'https://something.com'}, 'smtp': smtp_map, 'koji': koji_map}) p = SendMailPlugin(None, workflow, **kwargs) subject, body, fail_logs = p._render_mail(True, False, False, False) assert not fail_logs
def test_render_mail(self, monkeypatch, autorebuild, auto_cancel, manual_cancel, to_koji_submitter, has_koji_logs, koji_integration, success, reactor_config_map, has_store_metadata_results, annotations, has_repositories, expect_error): log_url_cases = { # (koji_integration,autorebuild,success) (False, False, False): False, (False, False, True): False, (False, True, False): False, # Included as attachment (False, True, True): False, (True, False, False): True, (True, False, True): True, (True, True, False): False, # Included as attachment (True, True, True): False, # Logs in Koji Build } class TagConf(object): unique_images = [] class WF(object): image = util.ImageName.parse('foo/bar:baz') openshift_build_selflink = '/builds/blablabla' build_process_failed = False autorebuild_canceled = auto_cancel build_canceled = manual_cancel tag_conf = TagConf() exit_results = {KojiPromotePlugin.key: MOCK_KOJI_BUILD_ID} prebuild_results = {} plugin_workspace = {} monkeypatch.setenv( "BUILD", json.dumps({ 'metadata': { 'labels': { 'koji-task-id': MOCK_KOJI_TASK_ID, }, 'name': {}, } })) session = MockedClientSession('', has_kerberos=True) pathinfo = MockedPathInfo('https://koji') if not has_koji_logs: (flexmock(pathinfo).should_receive('work').and_raise( RuntimeError, "xyz")) fake_logs = [ LogEntry(None, 'orchestrator'), LogEntry(None, 'orchestrator line 2'), LogEntry('x86_64', 'Hurray for bacon: \u2017'), LogEntry('x86_64', 'line 2') ] flexmock(OSBS).should_receive( 'get_orchestrator_build_logs').and_return(fake_logs) flexmock(koji, ClientSession=lambda hub, opts: session, PathInfo=pathinfo) kwargs = { 'url': 'https://something.com', 'smtp_host': 'smtp.bar.com', 'from_address': '*****@*****.**', 'to_koji_submitter': to_koji_submitter, 'to_koji_pkgowner': False, 'koji_hub': '/' if koji_integration else None, 'koji_root': 'https://koji/', 'koji_proxyuser': None, 'koji_ssl_certs_dir': '/certs', 'koji_krb_principal': None, 'koji_krb_keytab': None } workflow = WF() if has_store_metadata_results: if annotations: if has_repositories: mock_store_metadata_results(workflow) else: mock_store_metadata_results(workflow, {'repositories': {}}) else: mock_store_metadata_results(workflow, None) if reactor_config_map: openshift_map = {'url': 'https://something.com'} koji_map = { 'hub_url': '/' if koji_integration else None, 'root_url': 'https://koji/', 'auth': { 'ssl_certs_dir': '/certs', 'proxyuser': None, 'krb_principal': None, 'krb_keytab_path': None } } smtp_map = { 'from_address': '*****@*****.**', 'host': 'smtp.bar.com', 'send_to_submitter': to_koji_submitter, 'send_to_pkg_owner': False, } workflow.plugin_workspace[ReactorConfigPlugin.key] = {} workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\ ReactorConfig({'version': 1, 'smtp': smtp_map, 'koji': koji_map, 'openshift': openshift_map}) p = SendMailPlugin(None, workflow, **kwargs) # Submitter is updated in _get_receivers_list try: p._get_receivers_list() except RuntimeError as ex: # Only valid exception is a RuntimeError when there are no # recipients available assert str(ex) == 'No recipients found' if expect_error: with pytest.raises(ValueError): p._render_mail(autorebuild, success, auto_cancel, manual_cancel) return subject, body, logs = p._render_mail(autorebuild, success, auto_cancel, manual_cancel) if auto_cancel or manual_cancel: status = 'Canceled' assert not logs elif success: status = 'Succeeded' assert not logs else: status = 'Failed' # Full logs are only generated on a failed autorebuild assert autorebuild == bool(logs) exp_subject = '%s building image foo/bar' % status exp_body = [ 'Image Name: foo/bar', 'Repositories: ', ' foo/bar:baz', ' foo/bar:spam', 'Status: ' + status, 'Submitted by: ', ] if autorebuild: exp_body[-1] += '<autorebuild>' elif koji_integration and to_koji_submitter: exp_body[-1] += MOCK_KOJI_SUBMITTER_EMAIL else: exp_body[-1] += SendMailPlugin.DEFAULT_SUBMITTER if log_url_cases[(koji_integration, autorebuild, success)]: if has_koji_logs: exp_body.append("Logs: https://koji/work/tasks/12345") else: exp_body.append("Logs: " "https://something.com/builds/blablabla/log") assert subject == exp_subject assert body == '\n'.join(exp_body)
def test_render_mail(self, workflow, source_dir, manual_cancel, to_koji_submitter, koji_integration, success, has_store_metadata_results, annotations, has_repositories, expect_error): git_source_url = 'git_source_url' git_source_ref = '123423431234123' VcsInfo = namedtuple('VcsInfo', ['vcs_type', 'vcs_url', 'vcs_ref']) session = MockedClientSession('', has_kerberos=True) pathinfo = MockedPathInfo('https://koji') (flexmock(pathinfo) .should_receive('work') .and_raise(RuntimeError, "xyz")) flexmock(koji, ClientSession=lambda hub, opts: session, PathInfo=pathinfo) kwargs = { 'url': 'https://something.com', 'smtp_host': 'smtp.bar.com', 'from_address': '*****@*****.**', 'to_koji_submitter': to_koji_submitter, 'to_koji_pkgowner': False } workflow.data.postbuild_results[KojiImportPlugin.key] = MOCK_KOJI_BUILD_ID workflow.user_params['koji_task_id'] = MOCK_KOJI_TASK_ID dockerfile = source_dir / DOCKERFILE_FILENAME dockerfile.write_text(MOCK_DOCKERFILE, "utf-8") flexmock(workflow, df_path=str(dockerfile)) flexmock(workflow.source, get_vcs_info=VcsInfo(vcs_type='git', vcs_url=git_source_url, vcs_ref=git_source_ref)) workflow.data.build_canceled = manual_cancel if has_store_metadata_results: if annotations: if has_repositories: mock_store_metadata_results(workflow) else: mock_store_metadata_results(workflow, {'repositories': {}}) else: mock_store_metadata_results(workflow, {}) smtp_map = { 'from_address': '*****@*****.**', 'host': 'smtp.bar.com', 'send_to_submitter': to_koji_submitter, 'send_to_pkg_owner': False, } rcm = {'version': 1, 'smtp': smtp_map, 'openshift': {'url': 'https://something.com'}} workflow.conf = Configuration(raw_config=rcm) add_koji_map_in_workflow(workflow, hub_url='/' if koji_integration else None, root_url='https://koji/', ssl_certs_dir='/certs') p = SendMailPlugin(workflow, **kwargs) # Submitter is updated in _get_receivers_list try: p._get_receivers_list() except RuntimeError as ex: # Only valid exception is a RuntimeError when there are no # recipients available assert str(ex) == 'No recipients found' if expect_error: with pytest.raises(ValueError): p._render_mail(success, manual_cancel) return subject, body, logs = p._render_mail(success, manual_cancel) if manual_cancel: status = 'Canceled' assert not logs elif success: status = 'Succeeded' assert not logs else: status = 'Failed' if has_repositories: exp_subject = '%s building image foo/bar' % status exp_body = [ 'Image Name: foo/bar', 'Repositories: ', ' foo/bar:baz', ' foo/bar:spam', ] else: exp_subject = '%s building image %s' % (status, MOCK_NAME_LABEL) exp_body = [ 'Image Name: ' + MOCK_NAME_LABEL, 'Repositories: ', ] common_body = [ 'Status: ' + status, 'Submitted by: ', 'Task id: ' + str(MOCK_KOJI_TASK_ID), 'Source url: ' + git_source_url, 'Source ref: ' + git_source_ref, ] exp_body.extend(common_body) if koji_integration and to_koji_submitter: exp_body[-4] += MOCK_KOJI_SUBMITTER_EMAIL else: exp_body[-4] += SendMailPlugin.DEFAULT_SUBMITTER if koji_integration: exp_body.insert(-2, "Logs: <not available>") assert subject == exp_subject assert body == '\n'.join(exp_body)
def test_render_mail(self, monkeypatch, autorebuild, auto_cancel, manual_cancel, to_koji_submitter, has_koji_logs): # just test a random combination of the method inputs and hope it's ok for other # combinations class TagConf(object): unique_images = [] class WF(object): image = util.ImageName.parse('foo/bar:baz') openshift_build_selflink = '/builds/blablabla' build_process_failed = False autorebuild_canceled = auto_cancel build_canceled = manual_cancel tag_conf = TagConf() exit_results = {KojiPromotePlugin.key: MOCK_KOJI_BUILD_ID} monkeypatch.setenv( "BUILD", json.dumps({ 'metadata': { 'labels': { 'koji-task-id': MOCK_KOJI_TASK_ID, }, } })) session = MockedClientSession('', has_kerberos=True) pathinfo = MockedPathInfo('https://koji') if not has_koji_logs: (flexmock(pathinfo).should_receive('work').and_raise( RuntimeError, "xyz")) flexmock(koji, ClientSession=lambda hub, opts: session, PathInfo=pathinfo) kwargs = { 'url': 'https://something.com', 'smtp_host': 'smtp.bar.com', 'from_address': '*****@*****.**', 'to_koji_submitter': to_koji_submitter, 'to_koji_pkgowner': False, 'koji_hub': '', 'koji_root': 'https://koji/', 'koji_proxyuser': None, 'koji_ssl_certs_dir': '/certs', 'koji_krb_principal': None, 'koji_krb_keytab': None } p = SendMailPlugin(None, WF(), **kwargs) assert p.koji_root == 'https://koji' subject, body = p._render_mail(autorebuild, False, auto_cancel, manual_cancel) # Submitter is updated in _get_receivers_list try: p._get_receivers_list() except Exception: pass if to_koji_submitter: subject, body = p._render_mail(autorebuild, False, auto_cancel, manual_cancel) status = 'Canceled' if auto_cancel or manual_cancel else 'Failed' exp_subject = '%s building image foo/bar:baz' % status exp_body = [ 'Image: foo/bar:baz', 'Status: ' + status, 'Submitted by: ', 'Logs: ' ] if autorebuild: exp_body[2] += '<autorebuild>' elif to_koji_submitter: exp_body[2] += MOCK_KOJI_SUBMITTER_EMAIL else: exp_body[2] += SendMailPlugin.DEFAULT_SUBMITTER if has_koji_logs: exp_body[3] += "https://koji/work/tasks/12345" else: exp_body[3] += "https://something.com/builds/blablabla/log" assert subject == exp_subject assert body == '\n'.join(exp_body)
def test_failed_logs(self, tmpdir, monkeypatch, error_type, reactor_config_map): # noqa # just test a random combination of the method inputs and hope it's ok for other # combinations class TagConf(object): unique_images = [] class WF(object): image = util.ImageName.parse('foo/bar:baz') openshift_build_selflink = '/builds/blablabla' build_process_failed = True autorebuild_canceled = False build_canceled = False tag_conf = TagConf() exit_results = { KojiPromotePlugin.key: MOCK_KOJI_BUILD_ID } prebuild_results = {} plugin_workspace = {} source = mock_source() builder = mock_builder() with open(os.path.join(str(tmpdir), 'Dockerfile'), 'wt') as df: df.write(MOCK_DOCKERFILE) setattr(builder, 'df_path', df.name) monkeypatch.setenv("BUILD", json.dumps({ 'metadata': { 'labels': { 'koji-task-id': MOCK_KOJI_TASK_ID, }, 'name': {}, } })) session = MockedClientSession('', has_kerberos=True) pathinfo = MockedPathInfo('https://koji') flexmock(OSBS).should_receive('get_orchestrator_build_logs').and_raise(error_type) flexmock(koji, ClientSession=lambda hub, opts: session, PathInfo=pathinfo) kwargs = { 'url': 'https://something.com', 'smtp_host': 'smtp.bar.com', 'from_address': '*****@*****.**', 'to_koji_submitter': True, 'to_koji_pkgowner': False, 'koji_hub': '/', 'koji_root': 'https://koji/', 'koji_proxyuser': None, 'koji_ssl_certs_dir': '/certs', 'koji_krb_principal': None, 'koji_krb_keytab': None } workflow = WF() mock_store_metadata_results(workflow) if reactor_config_map: smtp_map = { 'from_address': '*****@*****.**', 'host': 'smtp.bar.com', 'send_to_submitter': True, 'send_to_pkg_owner': False, } koji_map = { 'hub_url': '/', 'root_url': 'https://koji/', 'auth': {'ssl_certs_dir': '/certs'} } workflow.plugin_workspace[ReactorConfigPlugin.key] = {} workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\ ReactorConfig({'version': 1, 'openshift': {'url': 'https://something.com'}, 'smtp': smtp_map, 'koji': koji_map}) p = SendMailPlugin(None, workflow, **kwargs) subject, body, fail_logs = p._render_mail(True, False, False, False) assert not fail_logs
def test_render_mail(self, monkeypatch, tmpdir, autorebuild, auto_cancel, manual_cancel, to_koji_submitter, has_koji_logs, koji_integration, success, reactor_config_map, has_store_metadata_results, annotations, has_repositories, expect_error): log_url_cases = { # (koji_integration,autorebuild,success) (False, False, False): False, (False, False, True): False, (False, True, False): False, # Included as attachment (False, True, True): False, (True, False, False): True, (True, False, True): True, (True, True, False): False, # Included as attachment (True, True, True): False, # Logs in Koji Build } class TagConf(object): unique_images = [] git_source_url = 'git_source_url' git_source_ref = '123423431234123' VcsInfo = namedtuple('VcsInfo', ['vcs_type', 'vcs_url', 'vcs_ref']) class WF(object): image = util.ImageName.parse('foo/bar:baz') openshift_build_selflink = '/builds/blablabla' build_process_failed = False autorebuild_canceled = auto_cancel build_canceled = manual_cancel tag_conf = TagConf() exit_results = { KojiPromotePlugin.key: MOCK_KOJI_BUILD_ID } prebuild_results = {} plugin_workspace = {} builder = mock_builder() class mock_source(object): def get_vcs_info(self): return VcsInfo( vcs_type='git', vcs_url=git_source_url, vcs_ref=git_source_ref ) source = mock_source() with open(os.path.join(str(tmpdir), 'Dockerfile'), 'wt') as df: df.write(MOCK_DOCKERFILE) setattr(builder, 'df_path', df.name) monkeypatch.setenv("BUILD", json.dumps({ 'metadata': { 'labels': { 'koji-task-id': MOCK_KOJI_TASK_ID, }, 'name': {}, } })) session = MockedClientSession('', has_kerberos=True) pathinfo = MockedPathInfo('https://koji') if not has_koji_logs: (flexmock(pathinfo) .should_receive('work') .and_raise(RuntimeError, "xyz")) fake_logs = [LogEntry(None, 'orchestrator'), LogEntry(None, 'orchestrator line 2'), LogEntry('x86_64', 'Hurray for bacon: \u2017'), LogEntry('x86_64', 'line 2')] flexmock(OSBS).should_receive('get_orchestrator_build_logs').and_return(fake_logs) flexmock(koji, ClientSession=lambda hub, opts: session, PathInfo=pathinfo) kwargs = { 'url': 'https://something.com', 'smtp_host': 'smtp.bar.com', 'from_address': '*****@*****.**', 'to_koji_submitter': to_koji_submitter, 'to_koji_pkgowner': False, 'koji_hub': '/' if koji_integration else None, 'koji_root': 'https://koji/', 'koji_proxyuser': None, 'koji_ssl_certs_dir': '/certs', 'koji_krb_principal': None, 'koji_krb_keytab': None } workflow = WF() if has_store_metadata_results: if annotations: if has_repositories: mock_store_metadata_results(workflow) else: mock_store_metadata_results(workflow, {'repositories': {}}) else: mock_store_metadata_results(workflow, None) if reactor_config_map: openshift_map = {'url': 'https://something.com'} koji_map = { 'hub_url': '/' if koji_integration else None, 'root_url': 'https://koji/', 'auth': { 'ssl_certs_dir': '/certs', 'proxyuser': None, 'krb_principal': None, 'krb_keytab_path': None } } smtp_map = { 'from_address': '*****@*****.**', 'host': 'smtp.bar.com', 'send_to_submitter': to_koji_submitter, 'send_to_pkg_owner': False, } workflow.plugin_workspace[ReactorConfigPlugin.key] = {} workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\ ReactorConfig({'version': 1, 'smtp': smtp_map, 'koji': koji_map, 'openshift': openshift_map}) p = SendMailPlugin(None, workflow, **kwargs) # Submitter is updated in _get_receivers_list try: p._get_receivers_list() except RuntimeError as ex: # Only valid exception is a RuntimeError when there are no # recipients available assert str(ex) == 'No recipients found' if expect_error: with pytest.raises(ValueError): p._render_mail(autorebuild, success, auto_cancel, manual_cancel) return subject, body, logs = p._render_mail(autorebuild, success, auto_cancel, manual_cancel) if auto_cancel or manual_cancel: status = 'Canceled' assert not logs elif success: status = 'Succeeded' assert not logs else: status = 'Failed' # Full logs are only generated on a failed autorebuild assert autorebuild == bool(logs) if has_repositories: exp_subject = '%s building image foo/bar' % status exp_body = [ 'Image Name: foo/bar', 'Repositories: ', ' foo/bar:baz', ' foo/bar:spam', ] else: exp_subject = '%s building image %s' % (status, MOCK_NAME_LABEL) exp_body = [ 'Image Name: ' + MOCK_NAME_LABEL, 'Repositories: ', ] common_body = [ 'Status: ' + status, 'Submitted by: ', 'Source url: ' + git_source_url, 'Source ref: ' + git_source_ref, ] exp_body.extend(common_body) if autorebuild: exp_body[-3] += '<autorebuild>' elif koji_integration and to_koji_submitter: exp_body[-3] += MOCK_KOJI_SUBMITTER_EMAIL else: exp_body[-3] += SendMailPlugin.DEFAULT_SUBMITTER if log_url_cases[(koji_integration, autorebuild, success)]: if has_koji_logs: exp_body.insert(-2, "Logs: https://koji/work/tasks/12345") else: exp_body.insert(-2, "Logs: https://something.com/builds/blablabla/log") assert subject == exp_subject assert body == '\n'.join(exp_body)
def test_failed_logs(self, tmpdir, monkeypatch, error_type): # noqa # just test a random combination of the method inputs and hope it's ok for other # combinations class TagConf(object): unique_images = [] class WF(object): image = ImageName.parse('foo/bar:baz') openshift_build_selflink = '/builds/blablabla' build_process_failed = True autorebuild_canceled = False build_canceled = False tag_conf = TagConf() exit_results = { KojiImportPlugin.key: MOCK_KOJI_BUILD_ID } prebuild_results = {} plugin_workspace = {} source = mock_source() builder = mock_builder() with open(os.path.join(str(tmpdir), 'Dockerfile'), 'wt') as df: df.write(MOCK_DOCKERFILE) setattr(builder, 'df_path', df.name) monkeypatch.setenv("BUILD", json.dumps({ 'metadata': { 'labels': { 'koji-task-id': MOCK_KOJI_TASK_ID, }, 'name': {}, } })) session = MockedClientSession('', has_kerberos=True) pathinfo = MockedPathInfo('https://koji') flexmock(OSBS).should_receive('get_orchestrator_build_logs').and_raise(error_type) flexmock(koji, ClientSession=lambda hub, opts: session, PathInfo=pathinfo) kwargs = { 'url': 'https://something.com', 'smtp_host': 'smtp.bar.com', 'from_address': '*****@*****.**', 'to_koji_submitter': True, 'to_koji_pkgowner': False, } workflow = WF() mock_store_metadata_results(workflow) smtp_map = { 'from_address': '*****@*****.**', 'host': 'smtp.bar.com', 'send_to_submitter': True, 'send_to_pkg_owner': False, } workflow.plugin_workspace[ReactorConfigPlugin.key] = {} workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\ ReactorConfig({'version': 1, 'openshift': {'url': 'https://something.com'}, 'smtp': smtp_map}) add_koji_map_in_workflow(workflow, hub_url='/', root_url='', ssl_certs_dir='/certs') p = SendMailPlugin(None, workflow, **kwargs) _, _, fail_logs = p._render_mail(True, False, False, False) assert not fail_logs
def test_render_mail(self, monkeypatch, tmpdir, autorebuild, auto_cancel, manual_cancel, to_koji_submitter, has_koji_logs, koji_integration, success, has_store_metadata_results, annotations, has_repositories, expect_error): log_url_cases = { # (koji_integration,autorebuild,success) (False, False, False): False, (False, False, True): False, (False, True, False): False, # Included as attachment (False, True, True): False, (True, False, False): True, (True, False, True): True, (True, True, False): False, # Included as attachment (True, True, True): False, # Logs in Koji Build } class TagConf(object): unique_images = [] git_source_url = 'git_source_url' git_source_ref = '123423431234123' VcsInfo = namedtuple('VcsInfo', ['vcs_type', 'vcs_url', 'vcs_ref']) class WF(object): image = ImageName.parse('foo/bar:baz') openshift_build_selflink = '/builds/blablabla' build_process_failed = False autorebuild_canceled = auto_cancel build_canceled = manual_cancel tag_conf = TagConf() exit_results = { KojiImportPlugin.key: MOCK_KOJI_BUILD_ID } prebuild_results = {} plugin_workspace = {} builder = mock_builder() class mock_source(object): def get_vcs_info(self): return VcsInfo( vcs_type='git', vcs_url=git_source_url, vcs_ref=git_source_ref ) source = mock_source() with open(os.path.join(str(tmpdir), 'Dockerfile'), 'wt') as df: df.write(MOCK_DOCKERFILE) setattr(builder, 'df_path', df.name) monkeypatch.setenv("BUILD", json.dumps({ 'metadata': { 'labels': { 'koji-task-id': MOCK_KOJI_TASK_ID, }, 'name': {}, } })) session = MockedClientSession('', has_kerberos=True) pathinfo = MockedPathInfo('https://koji') if not has_koji_logs: (flexmock(pathinfo) .should_receive('work') .and_raise(RuntimeError, "xyz")) fake_logs = [LogEntry(None, 'orchestrator'), LogEntry(None, 'orchestrator line 2'), LogEntry('x86_64', 'Hurray for bacon: \u2017'), LogEntry('x86_64', 'line 2')] flexmock(OSBS).should_receive('get_orchestrator_build_logs').and_return(fake_logs) flexmock(koji, ClientSession=lambda hub, opts: session, PathInfo=pathinfo) kwargs = { 'url': 'https://something.com', 'smtp_host': 'smtp.bar.com', 'from_address': '*****@*****.**', 'to_koji_submitter': to_koji_submitter, 'to_koji_pkgowner': False } workflow = WF() if has_store_metadata_results: if annotations: if has_repositories: mock_store_metadata_results(workflow) else: mock_store_metadata_results(workflow, {'repositories': {}}) else: mock_store_metadata_results(workflow, {}) openshift_map = {'url': 'https://something.com'} smtp_map = { 'from_address': '*****@*****.**', 'host': 'smtp.bar.com', 'send_to_submitter': to_koji_submitter, 'send_to_pkg_owner': False, } workflow.plugin_workspace[ReactorConfigPlugin.key] = {} workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\ ReactorConfig({'version': 1, 'smtp': smtp_map, 'openshift': openshift_map}) add_koji_map_in_workflow(workflow, hub_url='/' if koji_integration else None, root_url='https://koji/', ssl_certs_dir='/certs') p = SendMailPlugin(None, workflow, **kwargs) # Submitter is updated in _get_receivers_list try: p._get_receivers_list() except RuntimeError as ex: # Only valid exception is a RuntimeError when there are no # recipients available assert str(ex) == 'No recipients found' if expect_error: with pytest.raises(ValueError): p._render_mail(autorebuild, success, auto_cancel, manual_cancel) return subject, body, logs = p._render_mail(autorebuild, success, auto_cancel, manual_cancel) if auto_cancel or manual_cancel: status = 'Canceled' assert not logs elif success: status = 'Succeeded' assert not logs else: status = 'Failed' # Full logs are only generated on a failed autorebuild assert autorebuild == bool(logs) if has_repositories: exp_subject = '%s building image foo/bar' % status exp_body = [ 'Image Name: foo/bar', 'Repositories: ', ' foo/bar:baz', ' foo/bar:spam', ] else: exp_subject = '%s building image %s' % (status, MOCK_NAME_LABEL) exp_body = [ 'Image Name: ' + MOCK_NAME_LABEL, 'Repositories: ', ] common_body = [ 'Status: ' + status, 'Submitted by: ', 'Task id: ' + str(MOCK_KOJI_TASK_ID), 'Source url: ' + git_source_url, 'Source ref: ' + git_source_ref, ] exp_body.extend(common_body) if autorebuild: exp_body[-4] += '<autorebuild>' elif koji_integration and to_koji_submitter: exp_body[-4] += MOCK_KOJI_SUBMITTER_EMAIL else: exp_body[-4] += SendMailPlugin.DEFAULT_SUBMITTER if log_url_cases[(koji_integration, autorebuild, success)]: if has_koji_logs: exp_body.insert(-2, "Logs: https://koji/work/tasks/12345") else: exp_body.insert(-2, "Logs: https://something.com/builds/blablabla/log") assert subject == exp_subject assert body == '\n'.join(exp_body)