def test_not_tag_build_if_no_rules_are_matched(self, tag_build):
        # Note that, platform does not match the rule in rule file.
        self.mock_retrieve_modulemd_content.return_value = dedent('''\
            ---
            document: modulemd
            version: 2
            data:
              name: ant
              stream: 1
              version: 1
              context: c1
              dependencies:
              - buildrequires:
                  platform: [el8]
                requires:
                  platform: [el8]
            ''')

        rule_defs = read_rule_defs()

        with patch.object(tagging_service.logger, 'info') as info:
            # Note that, no module property matches rule in rule file.
            tagging_service.handle(rule_defs, {
                'id': 1,
                'name': 'ant',
                'stream': '1',
                'version': '1',
                'context': 'c1',
                'state_name': 'ready',
            })

            assert ('Module build %s does not match any rule.', 'ant-1-1-c1') == \
                info.call_args[0]
            tag_build.assert_not_called()
    def consume(self, msg):
        logger.debug('Got message: %r', msg)

        try:
            rule_defs = read_rule_defs()
        except requests.exceptions.HTTPError:
            logger.exception('Failed to retrieve rules content.')
        else:
            # For an empty yaml file, YAML returns None. So, if the remote rule
            # file is empty, catch this case and skip to handle the tag.
            if rule_defs is not None:
                tagging_service.handle(rule_defs, msg['body']['msg'])
    def test_tag_build_if_match_one_rule_only(self, read_config, ClientSession,
                                              retrieve_modulemd_content):
        read_config.return_value = koji_config_krb_auth

        # Note that, platform does not match the rule in rule file.
        retrieve_modulemd_content.return_value = '''\
---
document: modulemd
version: 2
data:
  name: javapackages-tools
  stream: 1
  version: 1
  context: c1
  dependencies:
  - buildrequires:
      platform: [f29]
    requires:
      platform: [f29]
'''

        rule_file = os.path.join(test_data_dir, 'mts-test-rules.yaml')
        with patch('requests.get') as get:
            with open(rule_file, 'r') as f:
                get.return_value.text = f.read()
            rule_defs = read_rule_defs()

            tagging_service.handle(
                rule_defs, {
                    'id': 1,
                    'name': 'javapackages-tools',
                    'stream': '1',
                    'version': '1',
                    'context': 'c1',
                    'state_name': 'ready',
                })

            session = ClientSession.return_value
            nvr = 'javapackages-tools-1-1.c1'
            session.tagBuild.assert_has_calls([
                call('f29-modular-ursamajor', nvr),
                call('modular-fallback-tag', nvr),
            ],
                                              any_order=True)
Пример #4
0
    def consume(self, msg):
        logger.debug('Got message: %r', msg)

        event_msg = msg['body']['msg']
        if event_msg['state_name'] != 'ready':
            logger.info(
                'Skip module build %s as it is not in ready state yet.',
                event_msg['koji_tag'])
            return

        try:
            rule_defs = read_rule_defs()
        except requests.exceptions.HTTPError:
            logger.exception('Failed to retrieve rules content.')
        else:
            # For an empty yaml file, YAML returns None. So, if the remote rule
            # file is empty, catch this case and skip to handle the tag.
            if rule_defs is not None:
                tagging_service.handle(rule_defs, event_msg)
Пример #5
0
    def test_match_module_by_build_state_in_rule(self, build_state):
        self.mock_retrieve_modulemd_content.return_value = dedent('''\
            ---
            document: modulemd
            version: 2
            data:
              name: nodejs
              stream: 10
              version: 1
              context: c1
              dependencies:
              - buildrequires:
                  platform: [f29]
                requires:
                  platform: [f29]
            ''')

        session = self.mock_ClientSession.return_value
        session.tagBuild.side_effect = [1, 2, 3]

        rule_defs = read_rule_defs()
        tagging_service.handle(
            rule_defs, {
                'id': 1,
                'name': 'nodejs',
                'stream': '10',
                'version': '1',
                'context': 'c1',
                'state_name': build_state,
            })

        if build_state == 'done':
            session.tagBuild.assert_has_calls([
                call('f29-modular-gating', 'nodejs-10-1.c1'),
                call('f29-modular-gating', 'nodejs-devel-10-1.c1'),
            ],
                                              any_order=True)
        elif build_state == 'build':
            # The rule file for this test does not any rule defined for state
            # "build", so no rule is matched, then no tag should be applied to
            # the fake module build.
            session.tagBuild.assert_not_called()
Пример #6
0
    def test_not_tag_build_if_no_rules_are_matched(self, tag_build,
                                                   retrieve_modulemd_content):
        # Note that, platform does not match the rule in rule file.
        retrieve_modulemd_content.return_value = '''\
---
document: modulemd
version: 2
data:
  name: ant
  stream: 1
  version: 1
  context: c1
  dependencies:
  - buildrequires:
      platform: [el8]
    requires:
      platform: [el8]
'''

        rule_file = os.path.join(test_data_dir, 'mts-test-for-no-match.yaml')
        with patch('requests.get') as get:
            with open(rule_file, 'r') as f:
                get.return_value.text = f.read()
            rule_defs = read_rule_defs()

        with patch.object(tagging_service.logger, 'info') as info:
            # Note that, no module property matches rule in rule file.
            tagging_service.handle(
                rule_defs, {
                    'id': 1,
                    'name': 'ant',
                    'stream': '1',
                    'version': '1',
                    'context': 'c1',
                    'state_name': 'ready',
                })

            assert ('Module build %s does not match any rule.', 'ant-1-1-c1') == \
                info.call_args[0]
            tag_build.assert_not_called()
Пример #7
0
def consume(msg):
    """Do the work to tag build if it matches a rule

    :param msg: the message got from message bus.
    :type msg: a Message object implementing interfaces to access message body
        at least.
    """

    mbs_msg = msg.body
    if not mbs_msg:
        logger.error(
            'Cannot find out the embedded MBS message from received '
            'message %r.', msg)
        return

    if mbs_msg.get('scratch'):
        logger.warning('Ignore scratch build %s', mbs_msg)
        return

    try:
        rule_defs = read_rule_defs()
    except requests.exceptions.HTTPError:
        logger.exception('Failed to retrieve rules content.')
        return

    nsvc = '{name}:{stream}:{version}:{context}'.format(**mbs_msg)

    # For an empty yaml file, YAML returns None. So, if the remote rule
    # file is empty, catch this case and skip to handle the tag.
    if rule_defs is None:
        logger.warning(
            'Ignore module build %s as no rule is defined in rule file.', nsvc)
    else:
        try:
            logger.info('Start to handle build: %s', nsvc)
            tagging_service.handle(rule_defs, mbs_msg)
        except:  # noqa
            logger.exception(f'Failed to handle message {mbs_msg}')
            logger.info('Continue to handle next MBS message ...')
Пример #8
0
    def test_tag_build_with_complex_destination(self):
        self.mock_retrieve_modulemd_content.return_value = dedent('''\
            ---
            document: modulemd
            version: 2
            data:
              name: virt
              stream: 8.1
              version: 1
              context: c1
              dependencies:
              - buildrequires:
                  platform: [el8.1.1]
                requires:
                  platform: [el8]
            ''')

        session = self.mock_ClientSession.return_value
        session.tagBuild.side_effect = [1, 2]

        rule_defs = read_rule_defs()
        tagging_service.handle(
            rule_defs, {
                'id': 1,
                'name': 'virt',
                'stream': '8.1',
                'version': '1',
                'context': 'c1',
                'state_name': 'ready',
            })

        nvr = 'virt-8.1-1.c1'
        nvr_devel = 'virt-devel-8.1-1.c1'
        session.tagBuild.assert_has_calls([
            call('advanced-virt-8.1-rhel-8.1.1-modules-gate', nvr),
            call('advanced-virt-8.1-rhel-8.1.1-modules-gate', nvr_devel),
        ],
                                          any_order=True)
    def test_apply_multiple_tags_to_a_matched_build(
            self,
            tagBuild_side_effect,
            expected_destination_tags_for_build,
            expected_destination_tags_for_devel_build
    ):

        # Because rule file specifies that destination tag uses the value of
        # requires.platform, and there are two of those values in modulemd,
        # the module build should be tagged with two tags.
        self.mock_retrieve_modulemd_content.return_value = dedent('''\
            ---
            document: modulemd
            version: 2
            data:
              name: javapackages-tools
              stream: 1
              version: 1
              context: c1
              dependencies:
              - buildrequires:
                  platform: [f29]
                requires:
                  platform: [f29, f28]
            ''')

        session = self.mock_ClientSession.return_value
        session.tagBuild.side_effect = tagBuild_side_effect

        rule_defs = read_rule_defs()
        tagging_service.handle(rule_defs, {
            'id': 1,
            'name': 'javapackages-tools',
            'stream': '1',
            'version': '1',
            'context': 'c1',
            'state_name': 'ready',
        })

        nvr = 'javapackages-tools-1-1.c1'
        nvr_devel = 'javapackages-tools-devel-1-1.c1'
        session.tagBuild.assert_has_calls([
            call('f29-modular-ursamajor', nvr),
            call('f28-modular-ursamajor', nvr),
            call('f29-modular-ursamajor', nvr_devel),
            call('f28-modular-ursamajor', nvr_devel),
        ], any_order=True)

        # 2 messages should be sent:
        # javapackages-tools: f29, f28
        # javapackages-tools-devel: f29, f28
        self.mock_publish.assert_has_calls([
            call('build.tag.requested', {
                'build': {
                    'id': 1, 'name': 'javapackages-tools',
                    'stream': '1', 'version': '1', 'context': 'c1',
                },
                'nvr': nvr,
                'destination_tags': expected_destination_tags_for_build,
            }),
            call('build.tag.requested', {
                'build': {
                    'id': 1, 'name': 'javapackages-tools-devel',
                    'stream': '1', 'version': '1', 'context': 'c1',
                },
                'nvr': nvr_devel,
                'destination_tags': expected_destination_tags_for_devel_build,
            }),
        ], any_order=True)
    def test_tag_build_if_match_one_rule_only(self):

        # Note that, platform does not match the rule in rule file.
        self.mock_retrieve_modulemd_content.return_value = dedent('''\
            ---
            document: modulemd
            version: 2
            data:
              name: javapackages-tools
              stream: 1
              version: 1
              context: c1
              dependencies:
              - buildrequires:
                  platform: [f29]
                requires:
                  platform: [f29]
            ''')

        session = self.mock_ClientSession.return_value
        session.tagBuild.side_effect = [1, 2, 3]

        rule_defs = read_rule_defs()
        tagging_service.handle(rule_defs, {
            'id': 1,
            'name': 'javapackages-tools',
            'stream': '1',
            'version': '1',
            'context': 'c1',
            'state_name': 'ready',
        })

        nvr = 'javapackages-tools-1-1.c1'
        nvr_devel = 'javapackages-tools-devel-1-1.c1'
        session.tagBuild.assert_has_calls([
            call('f29-modular-ursamajor', nvr),
            call('f29-modular-ursamajor', nvr_devel),
        ], any_order=True)

        # 2 messages should be sent:
        # javapackages-tools: f29
        # javapackages-tools-devel: f29
        self.mock_publish.assert_has_calls([
            call('build.tag.requested', {
                'build': {
                    'id': 1, 'name': 'javapackages-tools',
                    'stream': '1', 'version': '1', 'context': 'c1',
                },
                'nvr': nvr,
                'destination_tags': [
                    {'tag': 'f29-modular-ursamajor', 'task_id': 1},
                ],
            }),
            call('build.tag.requested', {
                'build': {
                    'id': 1, 'name': 'javapackages-tools-devel',
                    'stream': '1', 'version': '1', 'context': 'c1',
                },
                'nvr': nvr_devel,
                'destination_tags': [
                    {'tag': 'f29-modular-ursamajor', 'task_id': 2},
                ],
            }),
        ], any_order=True)
Пример #11
0
    def test_tag_build_if_multiple_rules_are_matched(
            self, read_config, ClientSession, publish,
            retrieve_modulemd_content):
        # Note that, {development: true} is added. That will causes this module
        # matches a second rule as well.
        retrieve_modulemd_content.return_value = '''\
---
document: modulemd
version: 2
data:
  name: javapackages-tools
  stream: 1
  version: 1
  context: c1
  development: true
  dependencies:
  - buildrequires:
      platform: [f29]
    requires:
      platform: [f29]
'''

        rule_file = os.path.join(test_data_dir, 'mts-test-rules.yaml')
        with patch('requests.get') as get:
            with open(rule_file, 'r') as f:
                get.return_value.text = f.read()
            rule_defs = read_rule_defs()

            tagging_service.handle(
                rule_defs, {
                    'id': 1,
                    'name': 'javapackages-tools',
                    'stream': '1',
                    'version': '1',
                    'context': 'c1',
                    'state_name': 'ready',
                })

            session = ClientSession.return_value
            session.tagBuild.side_effect = [1, 2]  # Task ids
            nvr = 'javapackages-tools-1-1.c1'
            session.tagBuild.assert_has_calls([
                call('modular-development-builds', nvr),
                call('modular-fallback-tag', nvr),
            ],
                                              any_order=True)

            publish.assert_called_once_with(
                'build.tagged', {
                    'build': {
                        'id': 1,
                        'name': 'javapackages-tools',
                        'stream': '1',
                        'version': '1',
                        'context': 'c1',
                    },
                    'nvr':
                    nvr,
                    'destination_tags': [
                        'modular-development-builds',
                        'modular-fallback-tag',
                    ]
                })
    def test_tag_build_if_match_one_rule_only(self, read_config, ClientSession,
                                              publish,
                                              retrieve_modulemd_content):
        read_config.return_value = koji_config_krb_auth

        # Note that, platform does not match the rule in rule file.
        retrieve_modulemd_content.return_value = dedent('''\
            ---
            document: modulemd
            version: 2
            data:
              name: javapackages-tools
              stream: 1
              version: 1
              context: c1
              dependencies:
              - buildrequires:
                  platform: [f29]
                requires:
                  platform: [f29]
            ''')

        rule_file = os.path.join(test_data_dir, 'mts-test-rules.yaml')
        with patch('requests.get') as get:
            with open(rule_file, 'r') as f:
                get.return_value.text = f.read()
            rule_defs = read_rule_defs()

            session = ClientSession.return_value
            session.tagBuild.side_effect = [1, 2, 3]

            tagging_service.handle(
                rule_defs, {
                    'id': 1,
                    'name': 'javapackages-tools',
                    'stream': '1',
                    'version': '1',
                    'context': 'c1',
                    'state_name': 'ready',
                })

            nvr = 'javapackages-tools-1-1.c1'
            nvr_devel = 'javapackages-tools-devel-1-1.c1'
            session.tagBuild.assert_has_calls([
                call('f29-modular-ursamajor', nvr),
                call('f29-modular-ursamajor', nvr_devel),
            ],
                                              any_order=True)

            # 2 messages should be sent:
            # javapackages-tools: f29
            # javapackages-tools-devel: f29
            publish.assert_has_calls([
                call(
                    'build.tag.requested', {
                        'build': {
                            'id': 1,
                            'name': 'javapackages-tools',
                            'stream': '1',
                            'version': '1',
                            'context': 'c1',
                        },
                        'nvr':
                        nvr,
                        'destination_tags': [
                            {
                                'tag': 'f29-modular-ursamajor',
                                'task_id': 1
                            },
                        ],
                    }),
                call(
                    'build.tag.requested', {
                        'build': {
                            'id': 1,
                            'name': 'javapackages-tools-devel',
                            'stream': '1',
                            'version': '1',
                            'context': 'c1',
                        },
                        'nvr':
                        nvr_devel,
                        'destination_tags': [
                            {
                                'tag': 'f29-modular-ursamajor',
                                'task_id': 2
                            },
                        ],
                    }),
            ],
                                     any_order=True)