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)
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)
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()
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()
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 ...')
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)
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)