def test_one_to_many_node_relationships(client, resource, uid, relationship, expected): """Tests getting one-to-many relationships of an artifact.""" fm_event = FreshmakerEvent.get_or_create({ 'event_type_id': 8, 'id_': '1180', 'message_id': 'ID:messaging-devops-broker01.test', 'state': 2, 'state_name': 'COMPLETE', 'state_reason': 'All container images have been rebuilt.', 'time_created': datetime(2019, 8, 21, 13, 42, 20), 'time_done': datetime(2099, 8, 21, 13, 42, 20) })[0] cb = ContainerKojiBuild.get_or_create({ 'completion_time': datetime(2017, 4, 2, 19, 39, 6), 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'epoch': '0', 'id_': '710', 'name': 'slf4j_2', 'operator': False, 'release': '4.el7_4_as', 'start_time': datetime(2017, 4, 2, 19, 39, 6), 'state': 1, 'version': '1.7.4' })[0] cb_two = ContainerKojiBuild.get_or_create({ 'completion_time': datetime(2018, 4, 2, 19, 39, 6), 'creation_time': datetime(2018, 4, 2, 19, 39, 6), 'epoch': '0', 'id_': '811', 'name': 'some_build', 'operator': False, 'release': '4.el7_4_as', 'start_time': datetime(2018, 4, 2, 19, 39, 6), 'state': 2, 'version': '1.7.5' })[0] cb_three = ContainerKojiBuild.get_or_create({ 'completion_time': datetime(2018, 4, 2, 19, 39, 6), 'creation_time': datetime(2018, 4, 2, 19, 39, 6), 'epoch': '1', 'id_': '2011', 'name': 'some_other_build', 'operator': False, 'release': '4.el7_6_a', 'start_time': datetime(2018, 4, 2, 19, 39, 6), 'state': 1, 'version': '1.7.6' })[0] fm_event.successful_koji_builds.connect(cb) fm_event.successful_koji_builds.connect(cb_two) fm_event.successful_koji_builds.connect(cb_three) rv = client.get('/api/v1/relationships/{0}/{1}/{2}'.format(resource, uid, relationship)) assert rv.status_code == 200 assert json.loads(rv.data.decode('utf-8')) == expected
def mock_kojiBuild(state=koji.BUILD_STATES['COMPLETE'], is_container=False): """ Make a mock Koji build. :param int state: the state of the build :return: a Koji build with mock data :rtype: KojiBuild """ build_params = { 'completion_time': datetime(2018, 6, 15, 20, 26, 38, tzinfo=pytz.utc), 'creation_time': datetime(2018, 6, 15, 20, 20, 38, tzinfo=pytz.utc), 'extra': {}, 'id_': '710916', 'name': 'e2e', 'owner_name': 'emusk', 'release': '36.1528968216', 'start_time': datetime(2018, 6, 15, 20, 21, 38, tzinfo=pytz.utc), 'state': state, 'version': '7.4' } if is_container: build_params['extra'] = {'container_koji_task_id': 17511743} build_params['name'] = 'e2e-container' return ContainerKojiBuild.get_or_create(build_params)[0] else: build_params['extra'] = { 'source': { 'original_url': 'git://pkgs.domain.com/rpms/squashfs-tools#09d' '40c9bdfd34c5130f8f02e49e059efd33bddf7' } } return KojiBuild.get_or_create(build_params)[0]
def cb_one(): """Return a KojiContainerBuild matching mock_getBuild_one.""" return ContainerKojiBuild.get_or_create({ 'completion_time': datetime(2018, 6, 15, 20, 26, 38, tzinfo=pytz.utc), 'creation_time': datetime(2018, 6, 15, 20, 20, 38, tzinfo=pytz.utc), 'epoch': 'epoch', 'id_': '710916', 'name': 'e2e-container-test-product-container', 'package_name': 'openstack-zaqar-container', 'original_nvr': 'e2e-container-test-product-container-7.3-210.1523551880', 'owner_name': 'emusk', 'release': '36.1528968216', 'start_time': datetime(2018, 6, 15, 20, 21, 38, tzinfo=pytz.utc), 'state': 3, 'version': '7.4' })[0]
def test_one_to_many_node_relationships_failed(client): """Tests getting one-to-many relationships of an artifact with wrong relationship name.""" fm_event = FreshmakerEvent.get_or_create({ 'event_type_id': 8, 'id_': '1180', 'message_id': 'ID:messaging-devops-broker01.test', 'state': 2, 'state_name': 'COMPLETE', 'state_reason': 'All container images have been rebuilt.', 'time_created': datetime(2019, 8, 21, 13, 42, 20), 'time_done': datetime(2099, 8, 21, 13, 42, 20) })[0] cb = ContainerKojiBuild.get_or_create({ 'completion_time': datetime(2017, 4, 2, 19, 39, 6), 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'epoch': '0', 'id_': '710', 'name': 'slf4j_2', 'operator': False, 'release': '4.el7_4_as', 'start_time': datetime(2017, 4, 2, 19, 39, 6), 'state': 1, 'version': '1.7.4' })[0] fm_event.successful_koji_builds.connect(cb) expected = { 'message': 'Please provide a valid relationship name for freshmakerevent with uid 1180', 'status': 400 } rv = client.get('/api/v1/relationships/freshmakerevent/1180/some_non-existent_relationship') assert rv.status_code == 400 assert json.loads(rv.data.decode('utf-8')) == expected
def test_module_story_node_siblings(client, resource, uid, backward_rel, expected): """Tests getting the siblings of an artifact's adjacent node in the module story path.""" bug = BugzillaBug.get_or_create({ 'classification': 'Red Hat', 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'id_': '12345', 'modified_time': datetime(2018, 2, 7, 19, 30, 47), 'priority': 'high', 'product_name': 'Red Hat Enterprise Linux', 'product_version': '7.5', 'resolution': '', 'severity': 'low', 'short_description': 'Some description', 'status': 'VERIFIED', 'target_milestone': 'rc', 'votes': 0 })[0] commit = DistGitCommit.get_or_create({ 'author_date': datetime(2017, 4, 26, 11, 44, 38), 'commit_date': datetime(2017, 4, 26, 11, 44, 38), 'hash_': '8a63adb248ba633e200067e1ad6dc61931727bad', 'log_message': 'Related: #12345 - fix xyz' })[0] build = KojiBuild.get_or_create({ 'completion_time': datetime(2017, 4, 2, 19, 39, 6), 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'epoch': '0', 'id_': '2345', 'name': 'slf4j', 'release': '4.el7_4', 'start_time': datetime(2017, 4, 2, 19, 39, 6), 'state': 1, 'version': '1.7.4' })[0] build_two = KojiBuild.get_or_create({ 'completion_time': datetime(2017, 4, 2, 19, 39, 6), 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'epoch': '0', 'id_': '3456', 'name': 'slf3j', 'release': '4.el6_3', 'start_time': datetime(2017, 4, 2, 19, 39, 6), 'state': 2, 'version': '1.7.1' })[0] module_build = ModuleKojiBuild.get_or_create({ 'completion_time': datetime(2017, 4, 2, 19, 39, 6), 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'epoch': '0', 'id_': '2345', 'name': '389-ds', 'context': 'a2037af3', 'release': '20180805121332.a2037af3', 'start_time': datetime(2017, 4, 2, 19, 39, 6), 'mbs_id': 1338, 'module_name': '389-ds', 'module_version': '20180805121332', 'module_stream': '1.4' })[0] advisory = Advisory.get_or_create({ 'actual_ship_date': datetime(2017, 8, 1, 15, 43, 51), 'advisory_name': 'RHBA-2017:2251-02', 'content_types': ['docker'], 'created_at': datetime(2017, 4, 3, 14, 47, 23), 'id_': '27825', 'issue_date': datetime(2017, 8, 1, 5, 59, 34), 'product_name': 'Red Hat Enterprise Linux', 'product_short_name': 'RHEL', 'security_impact': 'None', 'state': 'SHIPPED_LIVE', 'status_time': datetime(2017, 8, 1, 15, 43, 51), 'synopsis': 'cifs-utils bug fix update', 'update_date': datetime(2017, 8, 1, 7, 16) })[0] fm_event = FreshmakerEvent.get_or_create({ 'event_type_id': 8, 'id_': '1180', 'message_id': 'ID:messaging-devops-broker01.test', 'state': 2, 'state_name': 'COMPLETE', 'state_reason': 'All container images have been rebuilt.', 'time_created': datetime(2019, 8, 21, 13, 42, 20), 'time_done': datetime(2099, 8, 21, 13, 42, 20) })[0] cb = ContainerKojiBuild.get_or_create({ 'completion_time': datetime(2017, 4, 2, 19, 39, 6), 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'epoch': '0', 'id_': '710', 'name': 'slf4j_2', 'release': '4.el7_4_as', 'start_time': datetime(2017, 4, 2, 19, 39, 6), 'state': 1, 'version': '1.7.4' })[0] cb_two = ContainerKojiBuild.get_or_create({ 'completion_time': datetime(2018, 4, 2, 19, 39, 6), 'creation_time': datetime(2018, 4, 2, 19, 39, 6), 'epoch': '0', 'id_': '811', 'name': 'some_build', 'release': '4.el7_4_as', 'start_time': datetime(2018, 4, 2, 19, 39, 6), 'state': 2, 'version': '1.7.5' })[0] ca = ContainerAdvisory.get_or_create({ 'actual_ship_date': datetime(2017, 8, 1, 15, 43, 51), 'advisory_name': 'RHBA-2017:2251-03', 'content_types': ['docker'], 'created_at': datetime(2017, 4, 3, 14, 47, 23), 'id_': '12327', 'issue_date': datetime(2017, 8, 1, 5, 59, 34), 'product_name': 'Red Hat Enterprise Linux', 'product_short_name': 'RHEL', 'security_impact': 'None', 'state': 'SHIPPED_LIVE', 'status_time': datetime(2017, 8, 1, 15, 43, 51), 'synopsis': 'cifs-utils bug fix update', 'update_date': datetime(2017, 8, 1, 7, 16) })[0] commit.resolved_bugs.connect(bug) commit.koji_builds.connect(build) build.advisories.connect(advisory) build_two.advisories.connect(advisory) fm_event.triggered_by_advisory.connect(advisory) fm_event.successful_koji_builds.connect(cb) fm_event.successful_koji_builds.connect(cb_two) ca.attached_builds.connect(cb) ca.attached_builds.connect(cb_two) module_build.components.connect(build) module_build.components.connect(build_two) module_build.advisories.connect(advisory) url = '/api/v1/siblings/{0}/{1}?story_type=module'.format(resource, uid) if backward_rel: url = '{0}&backward_rel=true'.format(url) rv = client.get(url) assert rv.status_code == 200 assert json.loads(rv.data.decode('utf-8')) == expected
def test_all_stories(client, resource, uid, expected): """Test getting all unique stories for an artifact.""" bug = BugzillaBug.get_or_create({ 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'id_': '12345', 'modified_time': datetime(2018, 2, 7, 19, 30, 47), 'priority': 'high', 'product_name': 'Red Hat Enterprise Linux', 'product_version': '7.5', 'resolution': '', 'severity': 'low', 'short_description': 'Some description', 'status': 'VERIFIED', 'target_milestone': 'rc', })[0] bug_two = BugzillaBug.get_or_create({ 'creation_time': datetime(2017, 4, 1, 17, 41, 4), 'severity': 'medium', 'short_description': 'some description', 'product_version': '7.2', 'priority': 'unspecified', 'product_name': 'Red Hat Enterprise Linux 7', 'resolution': 'DUPLICATE', 'target_milestone': 'rc', 'modified_time': datetime(2018, 3, 14, 5, 53, 19), 'id_': '1245', 'status': 'CLOSED' })[0] commit = DistGitCommit.get_or_create({ 'author_date': datetime(2017, 4, 26, 11, 44, 38), 'commit_date': datetime(2018, 5, 2, 10, 36, 47), 'hash_': '8a63adb248ba633e200067e1ad6dc61931727bad', 'log_message': 'Related: #12345 - fix xyz' })[0] commit_two = DistGitCommit.get_or_create({ 'commit_date': datetime(2018, 3, 14, 5, 52, 19), 'author_date': datetime(2018, 3, 14, 5, 53, 25), 'log_message': 'Repo creation', 'hash_': 'f4dfc64c10a90492303e4f14ad3549a1a2b13575' })[0] build = KojiBuild.get_or_create({ 'completion_time': datetime(2018, 6, 2, 10, 55, 47), 'creation_time': datetime(2018, 6, 2, 10, 36, 47), 'epoch': '0', 'id_': '2345', 'name': 'slf4j', 'release': '4.el7_4', 'start_time': datetime(2018, 6, 2, 10, 36, 47), 'state': 1, 'version': '1.7.4' })[0] advisory = Advisory.get_or_create({ 'actual_ship_date': datetime(2017, 8, 1, 15, 43, 51), 'advisory_name': 'RHBA-2017:2251-02', 'created_at': datetime(2018, 6, 13, 10, 36, 47), 'id_': '27825', 'issue_date': datetime(2017, 8, 1, 5, 59, 34), 'product_name': 'Red Hat Enterprise Linux', 'security_impact': 'None', 'state': 'SHIPPED_LIVE', 'status_time': datetime(2017, 8, 1, 15, 43, 51), 'synopsis': 'cifs-utils bug fix update', 'update_date': datetime(2017, 8, 1, 7, 16) })[0] advisory_two = Advisory.get_or_create({ 'security_impact': 'None', 'created_at': datetime(2018, 4, 21, 19, 36, 47), 'synopsis': 'This is a synopsis of a test advisory.', 'product_name': 'Release End2End Test', 'update_date': datetime(2018, 4, 21, 19, 36, 47), 'advisory_name': 'RHBA-2017:27760-01', 'issue_date': datetime(2018, 3, 14, 5, 53, 25), 'status_time': datetime(2018, 3, 14, 7, 53, 25), 'state': 'DROPPED_NO_SHIP', 'id_': '123456' })[0] fm_event = FreshmakerEvent.get_or_create({ 'id_': '1180', 'state_name': 'COMPLETE', 'state_reason': 'All container images have been rebuilt.', 'time_created': datetime(2018, 8, 13, 10, 36, 47), 'time_done': datetime(2018, 8, 13, 12, 45, 47) })[0] cb = ContainerKojiBuild.get_or_create({ 'completion_time': datetime(2017, 4, 2, 19, 39, 6), 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'epoch': '0', 'id_': '710', 'name': 'slf4j_2', 'release': '4.el7_4_as', 'start_time': datetime(2017, 4, 2, 19, 39, 6), 'state': 1, 'version': '1.7.4' })[0] cb_two = ContainerKojiBuild.get_or_create({ 'completion_time': datetime(2018, 8, 17, 13, 55, 47), 'creation_time': datetime(2018, 8, 17, 8, 32, 47), 'epoch': '0', 'id_': '811', 'name': 'some_build', 'release': '4.el7_4_as', 'start_time': datetime(2018, 8, 17, 8, 32, 47), 'state': 2, 'version': '1.7.5' })[0] # Longest story commit.resolved_bugs.connect(bug) commit.koji_builds.connect(build) build.advisories.connect(advisory, {'time_attached': datetime(2018, 6, 13, 10, 36, 47)}) fm_event.triggered_by_advisory.connect(advisory) fm_event.successful_koji_builds.connect(cb) fm_event.successful_koji_builds.connect(cb_two) # Unique partial stories commit_two.resolved_bugs.connect(bug_two) commit_two.koji_builds.connect(build) build.advisories.connect(advisory_two, {'time_attached': datetime(2018, 4, 21, 19, 36, 47)}) rv = client.get('/api/v1/allstories/{0}/{1}'.format(resource, uid)) assert rv.status_code == 200 assert json.loads(rv.data.decode('utf-8')) == expected
def update_neo4j(self, advisories): """ Update Neo4j with Errata Tool advisories from Teiid. :param list advisories: a list of dictionaries of advisories """ count = 0 for advisory in advisories: count += 1 log.info('Processing advisory {0}/{1}'.format( count, len(advisories))) # The content_types column is a string with YAML in it, so convert it to a list content_types = yaml.safe_load(advisory['content_types']) adv = Advisory.create_or_update({ 'actual_ship_date': advisory['actual_ship_date'], 'advisory_name': advisory['advisory_name'], 'content_types': content_types, 'created_at': advisory['created_at'], 'id_': advisory['id'], 'issue_date': advisory['issue_date'], 'product_name': advisory['product_name'], 'product_short_name': advisory['product_short_name'], 'release_date': advisory['release_date'], 'security_impact': advisory['security_impact'], 'security_sla': advisory['security_sla'], 'state': advisory['state'], 'status_time': advisory['status_time'], 'synopsis': advisory['synopsis'], 'update_date': advisory['update_date'], })[0] container_adv = False for associated_build in self.get_associated_builds(advisory['id']): # Even if a node has two labels in the database, Neo4j returns the node # only with the specific label you asked for. Hence we check for labels # ContainerKojiBuild and KojiBuild separately for the same node. build = ContainerKojiBuild.nodes.get_or_none( id_=associated_build['id_']) if not build: build = KojiBuild.nodes.get_or_none( id_=associated_build['id_']) if build and not container_adv: if build.__label__ == 'ContainerKojiBuild': adv.add_label(ContainerAdvisory.__label__) container_adv = True # If this is set, that means it was once part of the advisory but not anymore. # This relationship needs to be deleted if it exists. if associated_build['removed_index_id']: if build: adv.attached_builds.disconnect(build) else: # Query Teiid and create the entry only if the build is not present in Neo4j if not build: attached_build = self.get_koji_build( associated_build['id_']) if attached_build: if self.is_container_build(attached_build): build = ContainerKojiBuild.get_or_create( {'id_': associated_build['id_']})[0] else: build = KojiBuild.get_or_create( {'id_': associated_build['id_']})[0] # This will happen only if we do not find the build we are looking for in Teiid # which shouldn't usually happen under normal conditions if not build: log.warn( 'The Koji build with ID {} was not found in Teiid!' .format(associated_build['id_'])) continue if adv.__label__ != ContainerAdvisory.__label__ \ and build.__label__ == ContainerKojiBuild.__label__: adv.add_label(ContainerAdvisory.__label__) attached_rel = adv.attached_builds.relationship(build) time_attached = associated_build['time_attached'] if attached_rel: if attached_rel.time_attached != time_attached: adv.attached_builds.replace( build, {'time_attached': time_attached}) else: adv.attached_builds.connect( build, {'time_attached': time_attached}) assigned_to = User.get_or_create( {'username': advisory['assigned_to'].split('@')[0]})[0] adv.conditional_connect(adv.assigned_to, assigned_to) reporter = User.get_or_create( {'username': advisory['reporter'].split('@')[0]})[0] adv.conditional_connect(adv.reporter, reporter) for attached_bug in self.get_attached_bugs(advisory['id']): bug = BugzillaBug.get_or_create(attached_bug)[0] adv.attached_bugs.connect(bug)
def test_get_resources(client, resource, uid, expected): """Test getting a resource from Neo4j with its relationships.""" tbrady = User.get_or_create({ 'email': '*****@*****.**', 'username': '******' })[0] mprahl = User.get_or_create({ 'email': '*****@*****.**', 'username': '******' })[0] jsmith = User.get_or_create({ 'email': '*****@*****.**', 'username': '******' })[0] commit = DistGitCommit.get_or_create({ 'author_date': datetime(2017, 4, 26, 11, 44, 38), 'commit_date': datetime(2017, 4, 26, 11, 44, 38), 'hash_': '8a63adb248ba633e200067e1ad6dc61931727bad', 'log_message': 'Related: #12345 - fix xyz' })[0] commit_two = DistGitCommit.get_or_create({ 'author_date': datetime(2017, 4, 27, 11, 44, 38), 'commit_date': datetime(2017, 4, 27, 11, 44, 38), 'hash_': '1263adb248ba633e205067e1ad6dc61931727c2d', 'log_message': 'Related: #12345 - fix xz' })[0] commit_three = DistGitCommit.get_or_create({ 'author_date': datetime(2017, 4, 27, 11, 44, 38), 'commit_date': datetime(2017, 4, 27, 11, 44, 38), 'hash_': '5663adb248ba633e205067e1ad6dc61931727123', 'log_message': 'Revert: #12345' })[0] bug = BugzillaBug.get_or_create({ 'classification': 'Red Hat', 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'id_': '12345', 'modified_time': datetime(2018, 2, 7, 19, 30, 47), 'priority': 'high', 'product_name': 'Red Hat Enterprise Linux', 'product_version': '7.5', 'resolution': '', 'severity': 'low', 'short_description': 'Some description', 'status': 'VERIFIED', 'target_milestone': 'rc', 'votes': 0 })[0] bug_two = BugzillaBug.get_or_create({ 'classification': 'Red Hat', 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'id_': '67890', 'modified_time': datetime(2018, 2, 7, 19, 30, 47), 'priority': 'medium', 'product_name': 'Red Hat Enterprise Linux', 'product_version': '7.3', 'resolution': '', 'severity': 'low', 'short_description': 'Some description', 'status': 'VERIFIED', 'target_milestone': 'rc', 'votes': 0 })[0] bug_three = BugzillaBug.get_or_create({ 'classification': 'Red Hat', 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'id_': '272895', 'modified_time': datetime(2018, 2, 7, 19, 30, 47), 'priority': 'low', 'product_name': 'Satellite', 'product_version': '3', 'resolution': '', 'severity': 'medium', 'short_description': 'Some description', 'status': 'VERIFIED', 'target_milestone': 'rc', 'votes': 0 })[0] repo = DistGitRepo.get_or_create({ 'name': 'some_repo', 'namespace': 'some_namespace', })[0] branch = DistGitBranch.get_or_create({ 'name': 'some_branch_name', 'repo_name': 'some_repo_name', 'repo_namespace': 'some_repo_namespace' })[0] build = KojiBuild.get_or_create({ 'completion_time': datetime(2017, 4, 2, 19, 39, 6), 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'epoch': '0', 'id_': '2345', 'name': 'slf4j', 'release': '4.el7_4', 'start_time': datetime(2017, 4, 2, 19, 39, 6), 'state': 1, 'version': '1.7.4' })[0] tag = KojiTag.get_or_create({ 'id_': '2702', 'name': 'some_active_tag' })[0] advisory = Advisory.get_or_create({ 'actual_ship_date': datetime(2017, 8, 1, 15, 43, 51), 'advisory_name': 'RHBA-2017:2251-02', 'content_types': ['docker'], 'created_at': datetime(2017, 4, 3, 14, 47, 23), 'id_': '27825', 'issue_date': datetime(2017, 8, 1, 5, 59, 34), 'product_name': 'Red Hat Enterprise Linux', 'product_short_name': 'RHEL', 'security_impact': 'None', 'state': 'SHIPPED_LIVE', 'status_time': datetime(2017, 8, 1, 15, 43, 51), 'synopsis': 'cifs-utils bug fix update', 'update_date': datetime(2017, 8, 1, 7, 16) })[0] fm_event = FreshmakerEvent.get_or_create({ 'event_type_id': 8, 'id_': '1180', 'message_id': 'ID:messaging-devops-broker01.test', 'state': 2, 'state_name': 'COMPLETE', 'state_reason': 'All container images have been rebuilt', 'time_created': datetime(2019, 8, 21, 13, 42, 20), 'time_done': datetime(2099, 8, 21, 13, 42, 20) })[0] fm_build = FreshmakerBuild.get_or_create({ 'id_': 398, 'build_id': 15639305, 'dep_on': "jboss-eap-7-eap70-openshift-docker", 'name': "metrics-hawkular-metrics-docker", 'original_nvr': "metrics-hawkular-metrics-docker-v3.7.23-10", 'rebuilt_nvr': "metrics-hawkular-metrics-docker-v3.7.23-10.1522094767", 'state': 1, 'state_name': "DONE", 'state_reason': "Built successfully.", 'time_completed': datetime(2017, 4, 2, 19, 39, 6), 'time_submitted': datetime(2017, 4, 2, 19, 39, 6), 'type_': 1, 'type_name': "IMAGE", 'url': "/api/1/builds/398" })[0] cb = ContainerKojiBuild.get_or_create({ 'completion_time': datetime(2017, 4, 2, 19, 39, 6), 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'epoch': '0', 'id_': '710', 'name': 'slf4j_2', 'release': '4.el7_4_as', 'start_time': datetime(2017, 4, 2, 19, 39, 6), 'state': 1, 'version': '1.7.4' })[0] if resource == 'bugzillabug': bug.assignee.connect(mprahl) bug.qa_contact.connect(jsmith) bug.reporter.connect(tbrady) commit.resolved_bugs.connect(bug) commit_two.resolved_bugs.connect(bug) commit_three.reverted_bugs.connect(bug) advisory.attached_bugs.connect(bug) if resource == 'distgitcommit': commit.author.connect(tbrady) commit.parent.connect(commit_two) commit_three.parent.connect(commit) commit.related_bugs.connect(bug) commit.related_bugs.connect(bug_three) commit.reverted_bugs.connect(bug_two) repo.commits.connect(commit) branch.commits.connect(commit) commit.resolved_bugs.connect(bug) commit.resolved_bugs.connect(bug_two) if resource == 'kojibuild': build.owner.connect(mprahl) build.commit.connect(commit_two) tag.builds.connect(build) if resource == 'advisory': advisory.assigned_to.connect(mprahl) advisory.reporter.connect(jsmith) advisory.attached_builds.connect(build) advisory.attached_bugs.connect(bug) if resource == 'freshmakerevent': fm_event.triggered_by_advisory.connect(advisory) fm_event.successful_koji_builds.connect(cb) fm_event.requested_builds.connect(fm_build) if resource == 'containerbuild': fm_event.successful_koji_builds.connect(cb) rv = client.get('/api/v1/{0}/{1}'.format(resource, uid)) assert rv.status_code == 200 assert json.loads(rv.data.decode('utf-8')) == expected
def query_api_and_update_neo4j(self): """ Scrape the Freshmaker API and upload the data to Neo4j. :param str start_date: a datetime to start scraping data from """ # Initialize session and url session = retry_session() fm_url = self.freshmaker_url while True: log.debug('Querying {0}'.format(fm_url)) rv_json = session.get(fm_url, timeout=15).json() for fm_event in rv_json['items']: try: int(fm_event['search_key']) except ValueError: # Skip Freshmaker Events that don't have the search_key as the Advisory ID continue event = FreshmakerEvent.create_or_update(dict( id_=fm_event['id'], event_type_id=fm_event['event_type_id'], message_id=fm_event['message_id'], state=fm_event['state'], state_name=fm_event['state_name'], state_reason=fm_event['state_reason'], url=fm_event['url'] ))[0] advisory = Advisory.get_or_create(dict( id_=fm_event['search_key'] ))[0] event.conditional_connect(event.triggered_by_advisory, advisory) for build_dict in fm_event['builds']: # To handle a faulty container build in Freshmaker if not build_dict['build_id'] or int(build_dict['build_id']) < 0: continue # The build ID obtained from Freshmaker API is actually a Koji task ID task_result = self.get_koji_task_result(build_dict['build_id']) if not task_result: continue # Extract the build ID from a task result xml_root = ET.fromstring(task_result) # TODO: Change this if a task can trigger multiple builds try: build_id = xml_root.find(".//*[name='koji_builds'].//string").text except AttributeError: build_id = None if build_id: build = ContainerKojiBuild.get_or_create(dict( id_=build_id, original_nvr=build_dict['original_nvr'] ))[0] event.triggered_container_builds.connect(build) if rv_json['meta'].get('next'): fm_url = rv_json['meta']['next'] else: break
def test_get_stories(client, resource, uid, expected): """Test getting a resource story from Neo4j with its relationships.""" commit = DistGitCommit.get_or_create({ 'author_date': datetime(2017, 4, 26, 11, 44, 38), 'commit_date': datetime(2017, 4, 26, 11, 44, 38), 'hash_': '8a63adb248ba633e200067e1ad6dc61931727bad', 'log_message': 'Related: #12345 - fix xyz' })[0] advisory = Advisory.get_or_create({ 'actual_ship_date': datetime(2017, 8, 1, 15, 43, 51), 'advisory_name': 'RHBA-2017:2251-02', 'content_types': ['docker'], 'created_at': datetime(2017, 4, 3, 14, 47, 23), 'id_': '27825', 'issue_date': datetime(2017, 8, 1, 5, 59, 34), 'product_name': 'Red Hat Enterprise Linux', 'product_short_name': 'RHEL', 'security_impact': 'None', 'state': 'SHIPPED_LIVE', 'status_time': datetime(2017, 8, 1, 15, 43, 51), 'synopsis': 'cifs-utils bug fix update', 'type_': 'RHBA', 'update_date': datetime(2017, 8, 1, 7, 16), 'updated_at': datetime(2017, 8, 1, 15, 43, 51) })[0] bug = BugzillaBug.get_or_create({ 'classification': 'Red Hat', 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'id_': '12345', 'modified_time': datetime(2018, 2, 7, 19, 30, 47), 'priority': 'high', 'product_name': 'Red Hat Enterprise Linux', 'product_version': '7.5', 'resolution': '', 'severity': 'low', 'short_description': 'Some description', 'status': 'VERIFIED', 'target_milestone': 'rc', 'votes': 0 })[0] bug_two = BugzillaBug.get_or_create({ 'classification': 'Red Hat', 'creation_time': datetime(2017, 4, 2, 6, 43, 58), 'id_': '5555', 'modified_time': datetime(2017, 12, 5, 10, 12, 47), 'priority': 'unspecified', 'product_name': 'Red Hat CloudForms Management Engine', 'product_version': '5.7.0', 'resolution': 'WORKSFORME', 'severity': 'unspecified', 'short_description': 'Fail to delete OSP tenant by CFME', 'status': 'CLOSED', 'target_milestone': 'GA', 'votes': 0 })[0] build = KojiBuild.get_or_create({ 'completion_time': datetime(2017, 4, 2, 19, 39, 6), 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'epoch': '0', 'id_': '2345', 'name': 'slf4j', 'release': '4.el7_4', 'start_time': datetime(2017, 4, 2, 19, 39, 6), 'state': 1, 'version': '1.7.4' })[0] fm_event = FreshmakerEvent.get_or_create({ 'event_type_id': 8, 'id_': '1180', 'message_id': 'ID:messaging-devops-broker01.test', 'state': 2, 'state_name': 'COMPLETE', 'state_reason': 'All container images have been rebuilt.', 'url': '/api/1/events/1180' })[0] cb = ContainerKojiBuild.get_or_create({ 'completion_time': datetime(2017, 4, 2, 19, 39, 6), 'creation_time': datetime(2017, 4, 2, 19, 39, 6), 'epoch': '0', 'id_': '710', 'name': 'slf4j_2', 'release': '4.el7_4_as', 'start_time': datetime(2017, 4, 2, 19, 39, 6), 'state': 1, 'version': '1.7.4' })[0] commit.resolved_bugs.connect(bug_two) commit.resolved_bugs.connect(bug) commit.koji_builds.connect(build) build.advisories.connect(advisory) advisory.attached_builds.connect(build) fm_event.triggered_by_advisory.connect(advisory) fm_event.triggered_container_builds.connect(cb) rv = client.get('/api/v1/story/{0}/{1}'.format(resource, uid)) assert rv.status_code == 200 assert json.loads(rv.data.decode('utf-8')) == expected