Ejemplo n.º 1
0
    def test_get_receiver_list(self, monkeypatch, additional_addresses, expected_receivers):
        class TagConf(object):
            unique_images = []

        class WF(object):
            image = ImageName.parse('foo/bar:baz')
            openshift_build_selflink = '/builds/blablabla'
            build_process_failed = False
            autorebuild_canceled = False
            build_canceled = False
            tag_conf = TagConf()
            exit_results = {
                KojiImportPlugin.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(koji, ClientSession=lambda hub, opts: session, PathInfo=pathinfo)
        kwargs = {
            'url': 'https://something.com',
            'smtp_host': 'smtp.bar.com',
            'from_address': '*****@*****.**',
            'additional_addresses': additional_addresses
        }

        workflow = WF()

        openshift_map = {'url': 'https://something.com'}
        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.bar.com',
            'send_to_submitter': False,
            'send_to_pkg_owner': False,
            'additional_addresses': additional_addresses
        }
        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=None, root_url='https://koji/',
                                 ssl_certs_dir='/certs')

        p = SendMailPlugin(None, workflow, **kwargs)
        if expected_receivers is not None:
            assert sorted(expected_receivers) == sorted(p._get_receivers_list())
        else:
            with pytest.raises(RuntimeError) as ex:
                p._get_receivers_list()
                assert str(ex.value) == 'No recipients found'
Ejemplo n.º 2
0
    def test_should_send(self, rebuild, success, auto_canceled, manual_canceled, send_on, expected):
        class WF(object):
            exit_results = {
                KojiImportPlugin.key: MOCK_KOJI_BUILD_ID
            }
            plugin_workspace = {}

        kwargs = {
            'smtp_host': 'smtp.bar.com',
            'from_address': '*****@*****.**',
            'send_on': send_on,
        }

        workflow = WF()

        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.spam.com',
        }
        workflow.plugin_workspace[ReactorConfigPlugin.key] = {}
        workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\
            ReactorConfig({'version': 1, 'smtp': smtp_map})
        add_koji_map_in_workflow(workflow, hub_url='/', root_url='',
                                 ssl_certs_dir='/certs')

        p = SendMailPlugin(None, workflow, **kwargs)
        assert p._should_send(rebuild, success, auto_canceled, manual_canceled) == expected
Ejemplo n.º 3
0
    def test_run_ok(self, tmpdir, workflow, source_dir):
        workflow.data.plugin_failed = True
        receivers = ['*****@*****.**', '*****@*****.**']

        dockerfile = source_dir / DOCKERFILE_FILENAME
        dockerfile.write_text(MOCK_DOCKERFILE, "utf-8")
        flexmock(workflow, df_path=str(dockerfile))

        mock_store_metadata_results(workflow)

        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.bar.com',
        }
        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,
                           from_address='*****@*****.**', smtp_host='smtp.spam.com',
                           send_on=[])

        (flexmock(p).should_receive('_should_send')
         .with_args(False, False).and_return(True))
        flexmock(p).should_receive('_get_receivers_list').and_return(receivers)
        flexmock(p).should_receive('_send_mail').with_args(receivers,
                                                           str, str, None)

        p.run()
Ejemplo n.º 4
0
    def test_skip_plugin(self, caplog, target, yum_repos, include_repo):
        tasker, workflow = prepare()
        args = {'target': target}

        workflow.plugin_workspace[ReactorConfigPlugin.key] = {}
        workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\
            ReactorConfig({'version': 1})
        add_koji_map_in_workflow(workflow, hub_url='', root_url='http://example.com')

        workflow.user_params['include_koji_repo'] = include_repo
        workflow.user_params['yum_repourls'] = yum_repos

        runner = PreBuildPluginsRunner(tasker, workflow, [{
            'name': KojiPlugin.key,
            'args': args,
        }])

        runner.run()

        if (not include_repo and yum_repos):
            log_msg = 'there is a yum repo user parameter, skipping plugin'
        else:
            log_msg = 'no target provided, skipping plugin'

        assert log_msg in caplog.text
Ejemplo n.º 5
0
    def test_run_does_nothing_if_conditions_not_met(self):  # noqa
        class WF(object):
            autorebuild_canceled = False
            build_canceled = False
            prebuild_results = {CheckAndSetRebuildPlugin.key: True}
            image = ImageName.parse('repo/name')
            build_process_failed = True
            exit_results = {}
            plugin_workspace = {}

        workflow = WF()

        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.spam.com',
        }
        workflow.plugin_workspace[ReactorConfigPlugin.key] = {}
        workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\
            ReactorConfig({'version': 1, 'smtp': smtp_map})
        add_koji_map_in_workflow(workflow, hub_url='/', root_url='',
                                 ssl_certs_dir='/certs')

        p = SendMailPlugin(None, workflow,
                           from_address='*****@*****.**', smtp_host='smtp.spam.com',
                           send_on=[MS])

        (flexmock(p).should_receive('_should_send')
            .with_args(True, False, False, False).and_return(False))
        flexmock(p).should_receive('_get_receivers_list').times(0)
        flexmock(p).should_receive('_send_mail').times(0)

        p.run()
Ejemplo n.º 6
0
    def test_get_email_from_koji_obj(self, has_kerberos,
                                     email_domain, expected_email,
                                     workflow):
        session = MockedClientSession('', has_kerberos=has_kerberos)
        flexmock(koji, ClientSession=lambda hub, opts: session)

        workflow.data.postbuild_results[KojiImportPlugin.key] = MOCK_KOJI_BUILD_ID

        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.bar.com',
            'domain': email_domain,
        }

        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, email_domain=email_domain)
        koji_task_owner = get_koji_task_owner(p.session, p.koji_task_id)

        try:
            found_email = p._get_email_from_koji_obj(koji_task_owner)
            assert expected_email == found_email
        except RuntimeError as exc:
            if not email_domain:
                assert str(exc) == "Empty email_domain specified"
            else:
                assert str(exc) == "Koji task owner name is missing"
Ejemplo n.º 7
0
def test_include_koji_without_target(workflow, build_dir, caplog, target,
                                     include_repo):
    prepare(workflow, build_dir, include_koji_repo=include_repo)
    args = {'target': target}

    add_koji_map_in_workflow(workflow,
                             hub_url='',
                             root_url='http://example.com')

    runner = PreBuildPluginsRunner(workflow, [{
        'name': InjectYumReposPlugin.key,
        'args': args,
    }])

    runner.run()

    if not include_repo or not target:
        if not include_repo:
            log_msg = f"'include_koji_repo parameter is set to '{include_repo}', " \
                      f"not including koji repo"
        else:
            log_msg = 'no target provided, not adding koji repo'
    else:
        log_msg = "injected yum repo: /etc/yum.repos.d/target-bd4b1.repo for 'x86_64' platform"
    assert log_msg in caplog.text
Ejemplo n.º 8
0
    def test_get_receiver_list(self, additional_addresses, expected_receivers, workflow):
        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': '*****@*****.**',
            'additional_addresses': additional_addresses
        }

        workflow.data.postbuild_results[KojiImportPlugin.key] = MOCK_KOJI_BUILD_ID

        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.bar.com',
            'send_to_submitter': False,
            'send_to_pkg_owner': False,
            'additional_addresses': additional_addresses
        }
        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=None, root_url='https://koji/',
                                 ssl_certs_dir='/certs')

        p = SendMailPlugin(workflow, **kwargs)
        if expected_receivers is not None:
            assert sorted(expected_receivers) == sorted(p._get_receivers_list())
        else:
            with pytest.raises(RuntimeError) as ex:
                p._get_receivers_list()
                assert str(ex.value) == 'No recipients found'
Ejemplo n.º 9
0
def create_runner(workflow,
                  ssl_certs=False,
                  principal=None,
                  keytab=None,
                  poll_interval=0.01,
                  proxy_user=None,
                  use_args=True,
                  koji_target='koji-target'):
    args = {
        'target': koji_target,
    }

    if poll_interval is not None:
        args['poll_interval'] = poll_interval

    add_koji_map_in_workflow(workflow,
                             hub_url='',
                             ssl_certs_dir='/' if ssl_certs else None,
                             krb_keytab=keytab,
                             krb_principal=principal,
                             proxyuser=proxy_user)

    plugin_conf = {'name': KojiTagBuildPlugin.key}
    if use_args:
        plugin_conf['args'] = args
    else:
        plugin_conf['args'] = {'target': koji_target}

    runner = PostBuildPluginsRunner(workflow, [plugin_conf])

    return runner
Ejemplo n.º 10
0
    def test_run_ok_and_send(self, workflow):
        workflow.data.plugin_failed = True

        class SMTP(object):
            def sendmail(self, from_addr, to, msg):
                pass

            def quit(self):
                pass

        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.spam.com',
        }
        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')

        receivers = ['*****@*****.**', '*****@*****.**']
        p = SendMailPlugin(workflow,
                           from_address='*****@*****.**', smtp_host='smtp.spam.com',
                           send_on=[])

        (flexmock(p).should_receive('_should_send')
            .with_args(False, False).and_return(True))
        flexmock(p).should_receive('_get_receivers_list').and_return(receivers)
        flexmock(p).should_receive('_get_image_name_and_repos').and_return(('foobar',
                                                                           ['foo/bar:baz',
                                                                            'foo/bar:spam']))

        smtp_inst = SMTP()
        flexmock(smtplib).should_receive('SMTP').and_return(smtp_inst)
        p.run()
Ejemplo n.º 11
0
    def test_send_mail(self, throws_exception, workflow):
        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.bar.com',
        }
        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, from_address='*****@*****.**', smtp_host='smtp.spam.com')

        class SMTP(object):
            def sendmail(self, from_addr, to, msg):
                pass

            def quit(self):
                pass

        smtp_inst = SMTP()
        flexmock(smtplib).should_receive('SMTP').and_return(smtp_inst)
        sendmail_chain = (flexmock(smtp_inst).should_receive('sendmail').
                          with_args('*****@*****.**', ['*****@*****.**'], str))
        if throws_exception:
            sendmail_chain.and_raise(smtplib.SMTPException, "foo")
        flexmock(smtp_inst).should_receive('quit')

        if throws_exception:
            with pytest.raises(SMTPException) as e:
                p._send_mail(['*****@*****.**'], 'subject', 'body')
            assert str(e.value) == 'foo'
        else:
            p._send_mail(['*****@*****.**'], 'subject', 'body')
Ejemplo n.º 12
0
def create_runner(tasker, workflow, ssl_certs=False, principal=None,
                  keytab=None, poll_interval=0.01, proxy_user=None,
                  use_args=True, koji_target='koji-target'):
    args = {
        'target': koji_target,
    }

    if poll_interval is not None:
        args['poll_interval'] = poll_interval

    workflow.plugin_workspace[ReactorConfigPlugin.key] = {}
    workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\
        ReactorConfig({'version': 1})
    add_koji_map_in_workflow(workflow, hub_url='',
                             ssl_certs_dir='/' if ssl_certs else None,
                             krb_keytab=keytab,
                             krb_principal=principal,
                             proxyuser=proxy_user)

    plugin_conf = {
        'name': KojiTagBuildPlugin.key
    }
    if use_args:
        plugin_conf['args'] = args
    else:
        plugin_conf['args'] = {'target': koji_target}

    runner = ExitPluginsRunner(tasker, workflow, [plugin_conf])

    return runner
Ejemplo n.º 13
0
    def test_run_fails_to_obtain_receivers(self, workflow):
        MockEnv(workflow).mock_build_outcome(failed=True)
        error_addresses = ['*****@*****.**']
        mock_store_metadata_results(workflow)

        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.bar.com',
            'error_addresses': ['*****@*****.**'],
        }
        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,
                           from_address='*****@*****.**', smtp_host='smtp.spam.com',
                           send_on=[], error_addresses=error_addresses)

        (flexmock(p).should_receive('_should_send')
            .with_args(False, False).and_return(True))
        flexmock(p).should_receive('_get_receivers_list').and_raise(RuntimeError())
        flexmock(p).should_receive('_get_image_name_and_repos').and_return(('foobar',
                                                                           ['foo/bar:baz',
                                                                            'foo/bar:spam']))
        flexmock(p).should_receive('_send_mail').with_args(error_addresses, str, str, None)

        p.run()
Ejemplo n.º 14
0
    def test_run_ok(self, tmpdir, workflow, source_dir):
        MockEnv(workflow).mock_build_outcome(failed=True)
        receivers = ['*****@*****.**', '*****@*****.**']

        mock_dockerfile(workflow)
        mock_store_metadata_results(workflow)

        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.bar.com',
        }
        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,
                           from_address='*****@*****.**', smtp_host='smtp.spam.com',
                           send_on=[])

        (flexmock(p).should_receive('_should_send')
         .with_args(False, False).and_return(True))
        flexmock(p).should_receive('_get_receivers_list').and_return(receivers)
        flexmock(p).should_receive('_send_mail').with_args(receivers,
                                                           str, str, None)

        p.run()
Ejemplo n.º 15
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.plugins_results[KojiImportPlugin.key] = MOCK_KOJI_BUILD_ID

        mock_dockerfile(workflow)

        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
Ejemplo n.º 16
0
    def test_run_invalid_receivers(self, caplog, workflow):
        workflow.data.plugin_failed = True
        error_addresses = ['*****@*****.**']

        mock_store_metadata_results(workflow)

        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.bar.com',
            'error_addresses': ['*****@*****.**'],
        }
        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,
                           from_address='*****@*****.**', smtp_host='smtp.spam.com',
                           send_on=[], error_addresses=error_addresses)

        (flexmock(p).should_receive('_should_send')
            .with_args(False, False).and_return(True))
        flexmock(p).should_receive('_get_receivers_list').and_return([])
        flexmock(p).should_receive('_get_image_name_and_repos').and_return(('foobar',
                                                                           ['foo/bar:baz',
                                                                            'foo/bar:spam']))
        p.run()
        assert 'no valid addresses in requested addresses. Doing nothing' in caplog.text
    def run_plugin_with_args(self, workflow, plugin_args=None, organization=None,
                             base_from_scratch=False, custom_base_image=False,
                             koji_parent_build=KOJI_BUILD_ID):
        plugin_args = plugin_args or {}
        plugin_args.setdefault('koji_parent_build', koji_parent_build)

        rcm = {'version': 1, 'registries_organization': organization,
               'source_registry': {'url': 'source_registry.com'}}
        workflow.conf.conf = rcm
        add_koji_map_in_workflow(workflow,
                                 hub_url=KOJI_HUB,
                                 root_url='',
                                 ssl_certs_dir=plugin_args.get('koji_ssl_certs_dir'))

        runner = PreBuildPluginsRunner(
            workflow,
            [{'name': InjectParentImage.key, 'args': plugin_args}]
        )

        result = runner.run()
        if not koji_parent_build:
            return
        if base_from_scratch or custom_base_image:
            assert result[InjectParentImage.key] is None
        else:
            # Koji build ID is always used, even when NVR is given.
            assert result[InjectParentImage.key] == KOJI_BUILD_ID
Ejemplo n.º 18
0
    def test_generated_email(self, monkeypatch, has_kerberos, expected_receivers):
        class TagConf(object):
            unique_images = []

        class WF(object):
            image = ImageName.parse('foo/bar:baz')
            openshift_build_selflink = '/builds/blablabla'
            build_process_failed = False
            tag_conf = TagConf()
            exit_results = {
                KojiImportPlugin.key: MOCK_KOJI_BUILD_ID
            }
            plugin_workspace = {}

        monkeypatch.setenv("BUILD", json.dumps({
            'metadata': {
                'labels': {
                    'koji-task-id': MOCK_KOJI_TASK_ID,
                },
                'name': {},
            }
        }))

        session = MockedClientSession('', has_kerberos=has_kerberos)
        flexmock(koji, ClientSession=lambda hub, opts: session, PathInfo=MockedPathInfo)

        kwargs = {
            'url': 'https://something.com',
            'smtp_host': 'smtp.bar.com',
            'from_address': '*****@*****.**',
            'to_koji_submitter': True,
            'to_koji_pkgowner': True,
            'email_domain': MOCK_EMAIL_DOMAIN
        }

        workflow = WF()

        openshift_map = {'url': 'https://something.com'}
        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.bar.com',
            'send_to_submitter': True,
            'send_to_pkg_owner': True,
            'domain': MOCK_EMAIL_DOMAIN,
        }
        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='/', root_url='',
                                 ssl_certs_dir='/certs')

        p = SendMailPlugin(None, workflow, **kwargs)
        receivers = p._get_receivers_list()
        assert sorted(receivers) == sorted(expected_receivers)

        if has_kerberos:
            assert p.submitter == MOCK_KOJI_SUBMITTER_EMAIL
        else:
            assert p.submitter == MOCK_KOJI_SUBMITTER_GENERATED
Ejemplo n.º 19
0
    def prepare(self,
                tmpdir,
                labels=None,
                include_target=True,
                certs=False,
                append=False,
                reserve_build=False,
                is_auto=False,
                add_timestamp=None,
                fetch_source=False,
                scratch=None):
        if labels is None:
            labels = {}

        workflow = flexmock()
        setattr(workflow, 'builder', flexmock())
        setattr(workflow, 'plugin_workspace', {})
        setattr(workflow, 'reserved_build_id', None)
        setattr(workflow, 'reserved_token ', None)
        setattr(workflow, 'source', MockSource(tmpdir, add_timestamp))
        setattr(workflow, 'prebuild_results', {CheckAndSetRebuildPlugin.key: is_auto})
        setattr(workflow, 'user_params', {})
        if scratch is not None:
            workflow.user_params['scratch'] = scratch
        if fetch_source:
            workflow.prebuild_results[PLUGIN_FETCH_SOURCES_KEY] = {
                'sources_for_nvr': KOJI_SOURCE_NVR
            }

        df = tmpdir.join('Dockerfile')
        df.write('FROM base\n')
        for key, value in labels.items():
            df.write('LABEL {key}={value}\n'.format(key=key, value=value), mode='a')
        setattr(workflow.builder, 'df_path', str(df))

        kwargs = {
            'tasker': None,
            'workflow': workflow,
        }

        if include_target:
            kwargs['target'] = 'foo'
        if append:
            kwargs['append'] = True
        if certs:
            tmpdir.join('cert').write('cert')
            tmpdir.join('serverca').write('serverca')

        workflow.plugin_workspace[ReactorConfigPlugin.key] = {}
        workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\
            ReactorConfig({'version': 1})
        add_koji_map_in_workflow(workflow, hub_url='', root_url='',
                                 reserve_build=reserve_build,
                                 ssl_certs_dir=str(tmpdir) if certs else None)

        plugin = BumpReleasePlugin(**kwargs)
        return plugin
Ejemplo n.º 20
0
    def test_koji_recepients_exception(self, exception_location, expected_receivers, workflow):
        if exception_location == 'empty_owner':
            koji_build_id = None
        else:
            koji_build_id = MOCK_KOJI_BUILD_ID

        has_kerberos = exception_location != 'empty_email_domain'
        session = MockedClientSession('', has_kerberos=has_kerberos)
        if exception_location == 'koji_connection':
            (flexmock(session)
                .should_receive('ssl_login')
                .and_raise(RuntimeError, "xyz"))
        elif exception_location == 'submitter':
            (flexmock(session)
                .should_receive('getTaskInfo')
                .and_raise(RuntimeError, "xyz"))
        elif exception_location == 'owner':
            (flexmock(session)
                .should_receive('getPackageConfig')
                .and_raise(RuntimeError, "xyz"))

        flexmock(koji, ClientSession=lambda hub, opts: session, PathInfo=MockedPathInfo)

        kwargs = {
            'url': 'https://something.com',
            'smtp_host': 'smtp.bar.com',
            'from_address': '*****@*****.**',
            'to_koji_submitter': True,
            'to_koji_pkgowner': True
        }
        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.bar.com',
            'send_to_submitter': True,
            'send_to_pkg_owner': True,
        }
        if exception_location != 'empty_email_domain':
            kwargs['email_domain'] = MOCK_EMAIL_DOMAIN
            smtp_map['domain'] = MOCK_EMAIL_DOMAIN

        workflow.data.postbuild_results[KojiImportPlugin.key] = koji_build_id
        if exception_location == 'empty_submitter':
            workflow.user_params['koji_task_id'] = None
        else:
            workflow.user_params['koji_task_id'] = MOCK_KOJI_TASK_ID
        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)
        if not expected_receivers:
            with pytest.raises(RuntimeError):
                p._get_receivers_list()
        else:
            receivers = p._get_receivers_list()
            assert sorted(receivers) == sorted(expected_receivers)
Ejemplo n.º 21
0
    def test_skip_plugin(self, caplog, workflow):
        rcm = {'version': 1, '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)
        p.run()
        log_msg = 'no smtp configuration, skipping plugin'
        assert log_msg in caplog.text
    def run_plugin_with_args(self, workflow, plugin_args=None, expect_result=True,  # noqa
                             external_base=False, deep_inspection=True, mismatch_failure=False,
                             user_params=None, is_isolated=None,
                             pull_registries=None, source_registry=None):
        plugin_args = plugin_args or {}
        user_params = user_params or {}
        plugin_args.setdefault('poll_interval', 0.01)
        plugin_args.setdefault('poll_timeout', 1)
        workflow.user_params = user_params

        workflow.plugin_workspace[ReactorConfigPlugin.key] = {}

        config_dict = {'version': 1,
                       'deep_manifest_list_inspection': deep_inspection,
                       'fail_on_digest_mismatch': mismatch_failure,
                       'skip_koji_check_for_base_image': external_base,
                       'platform_descriptors': [{'architecture': 'amd64', 'platform': 'x86_64'}]}

        if pull_registries:
            config_dict['pull_registries'] = pull_registries
        if source_registry:
            config_dict['source_registry'] = source_registry

        workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\
            ReactorConfig(config_dict)
        add_koji_map_in_workflow(workflow, hub_url=KOJI_HUB, root_url='',
                                 ssl_certs_dir=plugin_args.get('koji_ssl_certs_dir'))

        runner = PreBuildPluginsRunner(
            workflow.builder.tasker,
            workflow,
            [{'name': KojiParentPlugin.key, 'args': plugin_args}]
        )

        result = runner.run()
        if user_params:
            return
        base_img = ImageName.parse('base:latest')
        if expect_result is True:
            expected_result = {BASE_IMAGE_KOJI_BUILD: KOJI_BUILD,
                               PARENT_IMAGES_KOJI_BUILDS: {
                                   base_img: KOJI_BUILD}}
            if is_isolated is not None:
                expected_result = deepcopy(expected_result)
                expected_result[BASE_IMAGE_KOJI_BUILD]['extra']['image']['isolated'] = is_isolated
                expected_result[PARENT_IMAGES_KOJI_BUILDS][base_img]['extra']['image']['isolated']\
                    = is_isolated
        elif expect_result is False:
            expected_result = None
        else:  # param provided the expected result
            expected_result = expect_result

        assert result[KojiParentPlugin.key] == expected_result
Ejemplo n.º 23
0
def test_append_from_user_params(workflow, flatpak, isolated, append):
    workflow.user_params["flatpak"] = flatpak
    workflow.user_params["isolated"] = isolated
    add_koji_map_in_workflow(workflow, hub_url='', root_url='')

    session = MockedClientSessionGeneral('')
    flexmock(koji, ClientSession=session)

    runner = PreBuildPluginsRunner(workflow, [])
    plugin = runner.create_instance_from_plugin(BumpReleasePlugin, {})

    assert plugin.append == append
    def prepare(self,
                tmpdir,
                is_auto=False,
                triggered_after_koji_task=None,
                delegate_task=False,
                delegated_priority=None):

        workflow = flexmock()
        setattr(workflow, 'builder', flexmock())
        setattr(workflow, 'plugin_workspace', {})
        setattr(workflow, 'reserved_build_id', None)
        setattr(workflow, 'reserved_token ', None)
        setattr(workflow, 'cancel_isolated_autorebuild', None)
        setattr(workflow, 'triggered_after_koji_task', None)
        setattr(workflow, 'source', MockSource(tmpdir))
        setattr(workflow, 'prebuild_results',
                {CheckAndSetRebuildPlugin.key: is_auto})
        setattr(workflow, 'user_params', {})

        df = tmpdir.join('Dockerfile')
        df.write('FROM base\n')
        setattr(workflow.builder, 'df_path', str(df))

        kwargs = {
            'tasker': None,
            'workflow': workflow,
        }
        if triggered_after_koji_task:
            kwargs['triggered_after_koji_task'] = triggered_after_koji_task

        openshift_map = {
            'url': '',
            'insecure': False,
            'auth': {
                'enable': True
            }
        }

        workflow.plugin_workspace[ReactorConfigPlugin.key] = {}
        workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\
            ReactorConfig({'version': 1, 'openshift': openshift_map})
        add_koji_map_in_workflow(workflow,
                                 hub_url='',
                                 root_url='',
                                 reserve_build=False,
                                 delegate_task=delegate_task,
                                 delegated_priority=delegated_priority)

        plugin = KojiDelegatePlugin(**kwargs)
        return plugin
Ejemplo n.º 25
0
def prepare(workflow,
            build_dir,
            inherited_user='',
            dockerfile=DEFAULT_DOCKERFILE,
            scratch=False,
            platforms=None,
            include_koji_repo=False,
            yum_proxy=None,
            koji_ssl_certs=False,
            root_url=ROOT,
            yum_repourls=None):
    if yum_repourls is None:
        yum_repourls = {}
    if not platforms:
        platforms = ['x86_64']
    if koji_ssl_certs:
        build_dir.joinpath("cert").write_text("cert", "utf-8")
        build_dir.joinpath("serverca").write_text("serverca", "utf-8")
    workflow.user_params['scratch'] = scratch
    workflow.data.prebuild_results[
        PLUGIN_CHECK_AND_SET_PLATFORMS_KEY] = platforms
    workflow.source = MockSource(build_dir)
    inspect_data = {INSPECT_CONFIG: {'User': inherited_user}}
    flexmock(workflow.imageutil).should_receive(
        'base_image_inspect').and_return(inspect_data)
    with open(workflow.source.dockerfile_path, 'w') as f:
        f.write(dockerfile)
    workflow.build_dir.init_build_dirs(platforms, workflow.source)
    df = df_parser(str(build_dir))
    df.content = dockerfile
    workflow.data.dockerfile_images = DockerfileImages(df.parent_images)
    if include_koji_repo:
        session = MockedClientSession(hub='', opts=None)
        workflow.koji_session = session
        flexmock(koji, ClientSession=session, PathInfo=MockedPathInfo)

        workflow.conf.conf = {'version': 1, 'yum_proxy': yum_proxy}
        add_koji_map_in_workflow(
            workflow,
            hub_url='',
            root_url=root_url,
            ssl_certs_dir=str(build_dir) if koji_ssl_certs else None)
    workflow.data.prebuild_results[PLUGIN_RESOLVE_COMPOSES_KEY] = {
        'composes': [],
        'include_koji_repo': include_koji_repo,
        'yum_repourls': yum_repourls,
    }
    return workflow
Ejemplo n.º 26
0
    def prepare(self,
                workflow,
                source_dir: Path,
                labels=None,
                certs=False,
                append=False,
                reserve_build=False,
                add_timestamp=None,
                fetch_source=False,
                scratch=None):
        if labels is None:
            labels = {}

        workflow.source = MockSource(str(source_dir), add_timestamp)
        if scratch is not None:
            workflow.user_params['scratch'] = scratch
        if fetch_source:
            workflow.data.prebuild_results[PLUGIN_FETCH_SOURCES_KEY] = {
                'sources_for_nvr': KOJI_SOURCE_NVR
            }

        df = source_dir / 'Dockerfile'
        lines: List[str] = ["FROM base"]
        lines.extend(f"LABEL {key}={value}" for key, value in labels.items())
        df.write_text('\n'.join(lines), "utf-8")

        kwargs = {
            'workflow': workflow,
        }

        if append:
            kwargs['append'] = True
        if certs:
            source_dir.joinpath('cert').write_text('cert', 'utf-8')
            source_dir.joinpath('serverca').write_text('serverca', 'utf-8')

        add_koji_map_in_workflow(
            workflow,
            hub_url='',
            root_url='',
            reserve_build=reserve_build,
            ssl_certs_dir=str(source_dir) if certs else None)

        workflow.build_dir.init_build_dirs(["aarch", "x86_64"],
                                           workflow.source)

        plugin = BumpReleasePlugin(**kwargs)
        return plugin
Ejemplo n.º 27
0
    def test_fails_with_unknown_states(self, workflow):
        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.spam.com',
        }

        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,
                           smtp_host='smtp.bar.com', from_address='*****@*****.**',
                           send_on=['unknown_state', MS])
        with pytest.raises(PluginFailedException) as e:
            p.run()
        assert str(e.value) == 'Unknown state(s) "unknown_state" for sendmail plugin'
Ejemplo n.º 28
0
    def test_run_ok(self, tmpdir):  # noqa
        class TagConf(object):
            unique_images = []

        class WF(object):
            autorebuild_canceled = False
            build_canceled = False
            prebuild_results = {CheckAndSetRebuildPlugin.key: True}
            image = ImageName.parse('repo/name')
            build_process_failed = True
            tag_conf = TagConf()
            exit_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)

        receivers = ['*****@*****.**', '*****@*****.**']

        workflow = WF()
        mock_store_metadata_results(workflow)

        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.bar.com',
        }
        workflow.plugin_workspace[ReactorConfigPlugin.key] = {}
        workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\
            ReactorConfig({'version': 1, 'smtp': smtp_map})
        add_koji_map_in_workflow(workflow, hub_url='/', root_url='',
                                 ssl_certs_dir='/certs')

        p = SendMailPlugin(None, workflow,
                           from_address='*****@*****.**', smtp_host='smtp.spam.com',
                           send_on=[AF])

        (flexmock(p).should_receive('_should_send')
         .with_args(True, False, False, False).and_return(True))
        flexmock(p).should_receive('_get_receivers_list').and_return(receivers)
        flexmock(p).should_receive('_fetch_log_files').and_return(None)
        flexmock(p).should_receive('_send_mail').with_args(receivers,
                                                           str, str, None)

        p.run()
Ejemplo n.º 29
0
    def test_run_fails_to_obtain_receivers(self):  # noqa
        class TagConf(object):
            unique_images = []

        class WF(object):
            autorebuild_canceled = False
            build_canceled = False
            prebuild_results = {CheckAndSetRebuildPlugin.key: True}
            image = ImageName.parse('repo/name')
            build_process_failed = True
            tag_conf = TagConf()
            exit_results = {}
            plugin_workspace = {}
            source = mock_source()

        error_addresses = ['*****@*****.**']
        workflow = WF()
        mock_store_metadata_results(workflow)

        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.bar.com',
            'error_addresses': ['*****@*****.**'],
        }
        workflow.plugin_workspace[ReactorConfigPlugin.key] = {}
        workflow.plugin_workspace[ReactorConfigPlugin.key][WORKSPACE_CONF_KEY] =\
            ReactorConfig({'version': 1, 'smtp': smtp_map})
        add_koji_map_in_workflow(workflow, hub_url='/', root_url='',
                                 ssl_certs_dir='/certs')

        p = SendMailPlugin(None, workflow,
                           from_address='*****@*****.**', smtp_host='smtp.spam.com',
                           send_on=[AF], error_addresses=error_addresses)

        (flexmock(p).should_receive('_should_send')
            .with_args(True, False, False, False).and_return(True))
        flexmock(p).should_receive('_get_receivers_list').and_raise(RuntimeError())
        flexmock(p).should_receive('_fetch_log_files').and_return(None)
        flexmock(p).should_receive('_get_image_name_and_repos').and_return(('foobar',
                                                                           ['foo/bar:baz',
                                                                            'foo/bar:spam']))
        flexmock(p).should_receive('_send_mail').with_args(error_addresses, str, str, None)

        p.run()
Ejemplo n.º 30
0
    def test_should_send(self, success, manual_canceled, send_on, expected, workflow):
        kwargs = {
            'smtp_host': 'smtp.bar.com',
            'from_address': '*****@*****.**',
            'send_on': send_on,
        }

        workflow.data.postbuild_results[KojiImportPlugin.key] = MOCK_KOJI_BUILD_ID

        smtp_map = {
            'from_address': '*****@*****.**',
            'host': 'smtp.spam.com',
        }
        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)
        assert p._should_send(success, manual_canceled) == expected