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)
示例#2
0
    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)
示例#3
0
    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
示例#4
0
    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
示例#5
0
    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)
示例#6
0
    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)
示例#7
0
    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)
示例#10
0
    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
示例#11
0
    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)