Adds support of multiple gerrit_ids

Previously only one gerrit_id for user_profile was supported and took
part in record_processing. In case of using multiple Gerrits or multiple
gerrit_ids in one Gerrit, while merging profiles all except one
gerrit_ids were rejected.

This commit adds new user gerrit_ids user_profile key containing all
required mapping between multiple Gerrits and gerrit_ids. Each gerrit_id
acts the same way as old gerrit_id during review record processing, that
potentially increases success rate of record identification and
decreses amount of unnecessary launchpad user queries by storing user
with all gerrit_ids as a primary key instead of one.

Also changes to UI added to represent multiple Gerrit accounts.

Change-Id: Id20c7ed46cd409946b9a5247a94331860895f859
This commit is contained in:
Andrii Ostapenko 2019-03-11 20:29:55 -05:00 committed by Roman Gorshunov
parent 432f4edc08
commit 8b5345b458
6 changed files with 229 additions and 42 deletions

View File

@ -32,8 +32,16 @@
{%if launchpad_id %}
<div>Launchpad: <a href="https://launchpad.net/~${launchpad_id}" target="_blank">${launchpad_id}</a></div>
{%/if%}
{%if gerrit_id %}
<div>Gerrit: <a href="https://review.openstack.org/#/q/owner:${gerrit_id},n,z" target="_blank">${gerrit_id}</a></div>
{%if gerrit_ids %}
<div>Gerrit:</div>
{%each(hostname, ids) gerrit_ids %}
<div style="text-indent: 10px">
${hostname}:
{%each(i, id) ids%}
<a href="http://${hostname}/#/q/owner:${id},n,z" target="_blank">${id}</a>
{%/each%}
</div>
{%/each%}
{%/if%}
{%if github_id %}
<div>Github: <a href="https://github.com/${github_id}" target="_blank">${github_id}</a></div>

View File

@ -139,8 +139,11 @@ def export_data(memcached_inst, fd):
user), fd)
if user.get('launchpad_id'):
pickle.dump(('user:%s' % user['launchpad_id'], user), fd)
if user.get('gerrit_id'):
pickle.dump(('user:gerrit:%s' % user['gerrit_id'], user), fd)
for hostname, ids in user.get('gerrit_ids', {}).items():
for gerrit_id in ids:
pickle.dump(('user:gerrit:%s:%s' % (hostname, gerrit_id),
user),
fd)
if user.get('member_id'):
pickle.dump(('user:member:%s' % user['member_id'], user), fd)
for email in user.get('emails') or []:

View File

@ -122,6 +122,7 @@ def _process_repo_reviews(repo, runtime_storage_inst, record_processor_inst):
rcs_inst.setup(key_filename=repo['key_filename'],
username=repo['ssh_username'],
gerrit_retry=CONF.gerrit_retry)
gerrit_hostname = rcs.get_socket_tuple_from_uri(repo['gerrit_uri'])[0]
for branch in _get_repo_branches(repo):
LOG.info('Processing reviews for repo: %s, branch: %s',
@ -139,7 +140,11 @@ def _process_repo_reviews(repo, runtime_storage_inst, record_processor_inst):
rcs_inst.log(repo, branch, last_retrieval_time, status='abandoned',
grab_comments=True), )
review_iterator_typed = _record_typer(review_iterator, 'review')
review_iterator_with_gerrit = _param_adder(
review_iterator, 'gerrit_hostname', gerrit_hostname
)
review_iterator_typed = _record_typer(review_iterator_with_gerrit,
'review')
processed_review_iterator = record_processor_inst.process(
review_iterator_typed)
@ -153,9 +158,9 @@ def _process_repo_reviews(repo, runtime_storage_inst, record_processor_inst):
def _process_repo_vcs(repo, runtime_storage_inst, record_processor_inst):
vcs_inst = vcs.get_vcs(repo, CONF.sources_root)
vcs_inst.fetch()
gerrit_hostname, _ = rcs.get_socket_tuple_from_uri(
gerrit_hostname = rcs.get_socket_tuple_from_uri(
repo.get('gerrit_uri', CONF.review_uri)
)
)[0]
for branch in _get_repo_branches(repo):
LOG.info('Processing commits in repo: %s, branch: %s',

View File

@ -99,9 +99,11 @@ class RecordProcessor(object):
user_name = lp_user_name
gerrit_id = record.get('gerrit_id')
gerrit_tuple = None
if gerrit_id:
gerrit_tuple = (record['gerrit_hostname'], gerrit_id)
user_g = user_processor.load_user(
self.runtime_storage_inst, gerrit_id=gerrit_id) or {}
self.runtime_storage_inst, gerrit_tuple=gerrit_tuple) or {}
if (self._need_to_fetch_launchpad() and (not user_g) and
(not launchpad_id) and (not user_e.get('launchpad_id'))):
# query LP
@ -135,7 +137,7 @@ class RecordProcessor(object):
return user_e
user = user_processor.create_user(
self.domains_index, launchpad_id, email, gerrit_id, zanata_id,
self.domains_index, launchpad_id, email, gerrit_tuple, zanata_id,
user_name)
if user_e or user_l or user_g or user_z:
@ -262,6 +264,7 @@ class RecordProcessor(object):
or 'Anonymous Coward')
if uploader.get('email'):
patch_record['author_email'] = uploader['email'].lower()
patch_record['gerrit_hostname'] = review['gerrit_hostname']
patch_record['module'] = review['module']
patch_record['branch'] = review['branch']
patch_record['review_id'] = review['id']
@ -286,6 +289,7 @@ class RecordProcessor(object):
mark['branch'] = review['branch']
mark['review_id'] = review['id']
mark['patch'] = int(patch['number'])
mark['gerrit_hostname'] = review['gerrit_hostname']
if reviewer['username'] == patch['uploader'].get('username'):
# reviewer is the same as author of the patch

View File

@ -23,12 +23,12 @@ INDEPENDENT = '*independent'
ROBOTS = '*robots'
def make_user_id(emails=None, launchpad_id=None, gerrit_id=None,
def make_user_id(emails=None, launchpad_id=None, gerrit_tuple=None,
member_id=None, github_id=None, zanata_id=None):
if launchpad_id or emails:
return launchpad_id or emails[0]
if gerrit_id:
return 'gerrit:%s' % gerrit_id
if gerrit_tuple:
return 'gerrit:%s:%s' % gerrit_tuple
if member_id:
return 'member:%s' % member_id
if github_id:
@ -48,9 +48,10 @@ def store_user(runtime_storage_inst, user):
runtime_storage_inst.set_by_key('user:%s' % user['user_id'], user)
if user.get('launchpad_id'):
runtime_storage_inst.set_by_key('user:%s' % user['launchpad_id'], user)
if user.get('gerrit_id'):
runtime_storage_inst.set_by_key('user:gerrit:%s' % user['gerrit_id'],
user)
for hostname, ids in user.get('gerrit_ids', {}).items():
for gerrit_id in ids:
runtime_storage_inst.set_by_key(
'user:gerrit:%s:%s' % (hostname, gerrit_id), user)
if user.get('github_id'):
runtime_storage_inst.set_by_key('user:github:%s' % user['github_id'],
user)
@ -62,10 +63,10 @@ def store_user(runtime_storage_inst, user):
def load_user(runtime_storage_inst, seq=None, user_id=None, email=None,
launchpad_id=None, gerrit_id=None, member_id=None,
launchpad_id=None, gerrit_tuple=None, member_id=None,
github_id=None, zanata_id=None):
key = make_user_id(gerrit_id=gerrit_id, member_id=member_id,
key = make_user_id(gerrit_tuple=gerrit_tuple, member_id=member_id,
github_id=github_id, zanata_id=zanata_id)
if not key:
key = seq or user_id or launchpad_id or email
@ -85,8 +86,14 @@ def update_user_profile(stored_user, user):
if stored_user:
updated_user = copy.deepcopy(stored_user)
updated_user.update(user)
updated_user['emails'] = list(set(stored_user.get('emails', [])) |
set(user.get('emails', [])))
updated_user['emails'] = sorted(
list(set(stored_user.get('emails', [])) |
set(user.get('emails', [])))
)
gerrit_ids = _merge_gerrit_ids([stored_user, user])
if gerrit_ids:
updated_user['gerrit_ids'] = gerrit_ids
else:
updated_user = copy.deepcopy(user)
updated_user['static'] = True
@ -123,14 +130,15 @@ def get_company_by_email(domains_index, email):
return None
def create_user(domains_index, launchpad_id, email, gerrit_id, zanata_id,
def create_user(domains_index, launchpad_id, email, gerrit_tuple, zanata_id,
user_name):
company = get_company_by_email(domains_index, email) or INDEPENDENT
emails = [email] if email else []
user = {
'user_id': make_user_id(
emails=emails, launchpad_id=launchpad_id, gerrit_id=gerrit_id,
emails=emails, launchpad_id=launchpad_id,
gerrit_tuple=gerrit_tuple,
zanata_id=zanata_id),
'launchpad_id': launchpad_id,
'user_name': user_name or '',
@ -141,8 +149,10 @@ def create_user(domains_index, launchpad_id, email, gerrit_id, zanata_id,
'emails': emails,
}
if gerrit_id:
user['gerrit_id'] = gerrit_id
if gerrit_tuple:
user['gerrit_ids'] = {
gerrit_tuple[0]: [gerrit_tuple[1]]
}
if zanata_id:
user['zanata_id'] = zanata_id
@ -170,6 +180,20 @@ def update_user_affiliation(domains_index, user):
break
def _merge_gerrit_ids(users):
gerrit_ids = {}
hostnames = set()
for user in users:
hostnames.update(set(user.get('gerrit_ids', {}).keys()))
for hostname in hostnames:
ids = set()
for user in users:
ids |= set(user.get('gerrit_ids', {}).get(hostname, []))
if ids:
gerrit_ids[hostname] = sorted(list(ids))
return gerrit_ids
def merge_user_profiles(domains_index, user_profiles):
"""Merge user profiles into one
@ -182,23 +206,18 @@ def merge_user_profiles(domains_index, user_profiles):
"""
LOG.debug('Merge profiles: %s', user_profiles)
# check of there are more than 1 launchpad_id nor gerrit_id
# check of there are more than 1 launchpad_id
lp_ids = set(u.get('launchpad_id') for u in user_profiles
if u.get('launchpad_id'))
if len(lp_ids) > 1:
LOG.debug('Ambiguous launchpad ids: %s on profiles: %s',
lp_ids, user_profiles)
g_ids = set(u.get('gerrit_id') for u in user_profiles
if u.get('gerrit_id'))
if len(g_ids) > 1:
LOG.debug('Ambiguous gerrit ids: %s on profiles: %s',
g_ids, user_profiles)
merged_user = {} # merged user profile
# collect ordinary fields
for key in ['seq', 'user_name', 'user_id', 'gerrit_id', 'github_id',
'launchpad_id', 'companies', 'static', 'zanata_id']:
for key in ['seq', 'user_name', 'user_id', 'github_id', 'launchpad_id',
'companies', 'static', 'zanata_id']:
value = next((v.get(key) for v in user_profiles if v.get(key)),
None)
if value:
@ -218,9 +237,12 @@ def merge_user_profiles(domains_index, user_profiles):
for u in user_profiles:
emails |= set(u.get('emails', []))
core_in |= set(u.get('core', []))
merged_user['emails'] = list(emails)
merged_user['emails'] = sorted(list(emails))
if core_in:
merged_user['core'] = list(core_in)
merged_user['core'] = sorted(list(core_in))
gerrit_ids = _merge_gerrit_ids(user_profiles)
if gerrit_ids:
merged_user['gerrit_ids'] = gerrit_ids
# merge companies
merged_companies = merged_user['companies']

View File

@ -398,6 +398,7 @@ class TestRecordProcessor(testtools.TestCase):
processed_review = list(record_processor_inst.process([
{'record_type': 'review',
'id': 'I1045730e47e9e6ad31fcdfbaefdad77e2f3b2c3e',
'gerrit_hostname': 'review.openstack.org',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'John Doe',
'email': 'johndoe@ibm.com',
@ -416,7 +417,8 @@ class TestRecordProcessor(testtools.TestCase):
self.assertRecordsMatch(expected_review, processed_review)
user = user_processor.load_user(
record_processor_inst.runtime_storage_inst, user_id='john_doe')
self.assertEqual('John_Doe', user['gerrit_id'])
self.assertEqual('John_Doe',
user['gerrit_ids']['review.openstack.org'][0])
def test_process_review_without_name(self):
record_processor_inst = self.make_record_processor()
@ -424,6 +426,7 @@ class TestRecordProcessor(testtools.TestCase):
records = list(record_processor_inst.process([
{
'record_type': 'review',
'gerrit_hostname': 'review.openstack.org',
'module': 'sandbox',
"project": "openstack-dev/sandbox",
"branch": "master",
@ -661,6 +664,7 @@ class TestRecordProcessor(testtools.TestCase):
'date_created': 1234567890},
{'record_type': 'review',
'id': 'I1045730e47e9e6ad31fcdfbaefdad77e2f3b2c3e',
'gerrit_hostname': 'review.openstack.org',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'John Doe',
'email': 'john_doe@gmail.com',
@ -687,7 +691,7 @@ class TestRecordProcessor(testtools.TestCase):
user = {'seq': 1,
'user_id': 'john_doe',
'launchpad_id': 'john_doe',
'gerrit_id': 'john_doe',
'gerrit_ids': {'review.openstack.org': ['john_doe']},
'user_name': 'John Doe',
'emails': ['john_doe@gmail.com'],
'companies': [{'company_name': '*independent', 'end_date': 0}]}
@ -757,6 +761,7 @@ class TestRecordProcessor(testtools.TestCase):
processed_records = list(record_processor_inst.process([
{'record_type': 'review',
'id': 'I1045730e47e9e6ad31fcdfbaefdad77e2f3b2c3e',
'gerrit_hostname': 'review.openstack.org',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'John Doe',
'email': 'john_doe@gmail.com',
@ -788,7 +793,7 @@ class TestRecordProcessor(testtools.TestCase):
user = {'seq': 1,
'user_id': 'john_doe',
'launchpad_id': 'john_doe',
'gerrit_id': 'john_doe',
'gerrit_ids': {'review.openstack.org': ['john_doe']},
'user_name': 'John Doe',
'emails': ['john_doe@gmail.com'],
'companies': [{'company_name': '*independent', 'end_date': 0}]}
@ -867,6 +872,7 @@ class TestRecordProcessor(testtools.TestCase):
'date': 1234567890},
{'record_type': 'review',
'id': 'I1045730e47e9e6ad31fcdfbaefdad77e2f3b2c3e',
'gerrit_hostname': 'review.openstack.org',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'John Doe',
'email': 'john_doe@gmail.com',
@ -877,7 +883,7 @@ class TestRecordProcessor(testtools.TestCase):
user = {'seq': 1,
'user_id': 'john_doe@gmail.com',
'gerrit_id': 'john_doe',
'gerrit_ids': {'review.openstack.org': ['john_doe']},
'user_name': 'John Doe',
'emails': ['john_doe@gmail.com'],
'companies': [{'company_name': '*independent', 'end_date': 0}]}
@ -886,7 +892,7 @@ class TestRecordProcessor(testtools.TestCase):
email='john_doe@gmail.com'))
self.assertEqual(user, user_processor.load_user(
record_processor_inst.runtime_storage_inst,
gerrit_id='john_doe'))
gerrit_tuple=('review.openstack.org', 'john_doe')))
def test_process_email_then_review_gerrit_id_same_as_launchpad_id(self):
# it is expected that the user profile will contain email, LP id and
@ -905,6 +911,7 @@ class TestRecordProcessor(testtools.TestCase):
'date': 1234567890},
{'record_type': 'review',
'id': 'I1045730e47e9e6ad31fcdfbaefdad77e2f3b2c3e',
'gerrit_hostname': 'review.openstack.org',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'John Doe',
'email': 'john_doe@gmail.com',
@ -916,7 +923,7 @@ class TestRecordProcessor(testtools.TestCase):
user = {'seq': 1,
'user_id': 'john_doe',
'launchpad_id': 'john_doe',
'gerrit_id': 'john_doe',
'gerrit_ids': {'review.openstack.org': ['john_doe']},
'user_name': 'John Doe',
'emails': ['john_doe@gmail.com'],
'companies': [{'company_name': '*independent', 'end_date': 0}]}
@ -928,7 +935,7 @@ class TestRecordProcessor(testtools.TestCase):
user_id='john_doe'))
self.assertEqual(user, user_processor.load_user(
record_processor_inst.runtime_storage_inst,
gerrit_id='john_doe'))
gerrit_tuple=('review.openstack.org', 'john_doe')))
def test_process_commit_then_review_with_different_email(self):
record_processor_inst = self.make_record_processor(
@ -946,6 +953,7 @@ class TestRecordProcessor(testtools.TestCase):
'release_name': 'havana'},
{'record_type': 'review',
'id': 'I1045730e47e9e6ad31fcdfbaefdad77e2f3b2c3e',
'gerrit_hostname': 'review.openstack.org',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'Bill Smith', 'email': 'bill@smith.to',
'username': 'bsmith'},
@ -966,6 +974,7 @@ class TestRecordProcessor(testtools.TestCase):
user = {'seq': 1,
'user_id': 'john_doe',
'launchpad_id': 'john_doe',
'gerrit_ids': {'review.openstack.org': ['john_doe']},
'user_name': 'John Doe',
'emails': ['john_doe@ibm.com', 'john_doe@gmail.com'],
'companies': [{'company_name': 'IBM', 'end_date': 0}]}
@ -1002,6 +1011,7 @@ class TestRecordProcessor(testtools.TestCase):
'date': 1234567890},
{'record_type': 'review',
'id': 'I1045730e47e9e6ad31fcdfbaefdad77e2f3b2c3e',
'gerrit_hostname': 'review.openstack.org',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'John Doe',
'email': 'john_doe@ibm.com',
@ -1015,7 +1025,7 @@ class TestRecordProcessor(testtools.TestCase):
user = {'seq': 2,
'user_id': 'john_doe',
'launchpad_id': 'john_doe',
'gerrit_id': 'john_doe',
'gerrit_ids': {'review.openstack.org': ['john_doe']},
'user_name': 'John Doe',
'emails': ['john_doe@ibm.com'],
'companies': [{'company_name': 'IBM', 'end_date': 0}]}
@ -1030,7 +1040,138 @@ class TestRecordProcessor(testtools.TestCase):
self.assertEqual(user, user_processor.load_user(
runtime_storage_inst, email='john_doe@ibm.com'))
self.assertEqual(user, user_processor.load_user(
runtime_storage_inst, gerrit_id='john_doe'))
runtime_storage_inst,
gerrit_tuple=('review.openstack.org', 'john_doe')))
# all records should have the same user_id and company name
for record in runtime_storage_inst.get_all_records():
self.assertEqual('john_doe', record['user_id'],
message='Record %s' % record['primary_key'])
self.assertEqual('IBM', record['company_name'],
message='Record %s' % record['primary_key'])
def test_process_reviews_two_gerrits(self):
record_processor_inst = self.make_record_processor(
lp_user_name={
'john_doe': {'name': 'john_doe', 'display_name': 'John Doe'}
},
companies=[{'company_name': 'IBM', 'domains': ['ibm.com']}],
)
runtime_storage_inst = record_processor_inst.runtime_storage_inst
runtime_storage_inst.set_records(record_processor_inst.process([
{'record_type': 'review',
'id': 'I1045730e47e9e6ad31fcdfbaefdad77e2f3b2c3e',
'gerrit_hostname': 'review.openstack.org',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'John Doe',
'email': 'john_doe@ibm.com',
'username': 'john_doe'},
'createdOn': 1379404951,
'module': 'nova', 'branch': 'master'},
{'record_type': 'review',
'id': 'I1045730e47e9e6ad31fcdfbaefdad77e2f3b2c3f',
'gerrit_hostname': 'review.gerrithub.io',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'John Doe',
'email': 'john_doe@ibm.com',
'username': 'john_doe'},
'createdOn': 1379404951,
'module': 'cinder', 'branch': 'master'}
]))
user = {'seq': 1,
'user_id': 'john_doe',
'launchpad_id': 'john_doe',
'gerrit_ids': {
'review.openstack.org': ['john_doe'],
'review.gerrithub.io': ['john_doe'],
},
'user_name': 'John Doe',
'emails': ['john_doe@ibm.com'],
'companies': [{'company_name': 'IBM', 'end_date': 0}]}
runtime_storage_inst = record_processor_inst.runtime_storage_inst
self.assertEqual(user, user_processor.load_user(
runtime_storage_inst, user_id='john_doe'))
self.assertEqual(user, user_processor.load_user(
runtime_storage_inst, email='john_doe@ibm.com'))
self.assertEqual(user, user_processor.load_user(
runtime_storage_inst,
gerrit_tuple=('review.openstack.org', 'john_doe')))
self.assertEqual(user, user_processor.load_user(
runtime_storage_inst,
gerrit_tuple=('review.gerrithub.io', 'john_doe')))
# all records should have the same user_id and company name
for record in runtime_storage_inst.get_all_records():
self.assertEqual('john_doe', record['user_id'],
message='Record %s' % record['primary_key'])
self.assertEqual('IBM', record['company_name'],
message='Record %s' % record['primary_key'])
def test_process_reviews_two_ids_in_one_gerrit(self):
record_processor_inst = self.make_record_processor(
lp_user_name={
'john_doe': {'name': 'john_doe', 'display_name': 'John Doe'}
},
companies=[{'company_name': 'IBM', 'domains': ['ibm.com']}],
)
runtime_storage_inst = record_processor_inst.runtime_storage_inst
runtime_storage_inst.set_records(record_processor_inst.process([
{'record_type': 'review',
'id': 'I1045730e47e9e6ad31fcdfbaefdad77e2f3b2c3e',
'gerrit_hostname': 'review.openstack.org',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'John Doe',
'email': 'john_doe@ibm.com',
'username': 'john_doe'},
'createdOn': 1379404951,
'module': 'nova', 'branch': 'master'},
{'record_type': 'review',
'id': 'I1045730e47e9e6ad31fcdfbaefdad77e2f3b2c3f',
'gerrit_hostname': 'review.openstack.org',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'John Doe',
'email': 'john_doe@ibm.com',
'username': 'johnathan_doe'},
'createdOn': 1379404951,
'module': 'nova', 'branch': 'master'},
{'record_type': 'review',
'id': 'I1045730e47e9e6ad31fcdfbaefdad77e2f3b2c3i',
'gerrit_hostname': 'review.gerrithub.io',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'John Doe',
'email': 'john_doe@ibm.com',
'username': 'johnathan_doe'},
'createdOn': 1379404951,
'module': 'cinder', 'branch': 'master'}
]))
user = {'seq': 1,
'user_id': 'john_doe',
'launchpad_id': 'john_doe',
'gerrit_ids': {
'review.openstack.org': ['john_doe', 'johnathan_doe'],
'review.gerrithub.io': ['johnathan_doe'],
},
'user_name': 'John Doe',
'emails': ['john_doe@ibm.com'],
'companies': [{'company_name': 'IBM', 'end_date': 0}]}
runtime_storage_inst = record_processor_inst.runtime_storage_inst
self.assertEqual(user, user_processor.load_user(
runtime_storage_inst, user_id='john_doe'))
self.assertEqual(user, user_processor.load_user(
runtime_storage_inst, email='john_doe@ibm.com'))
self.assertEqual(user, user_processor.load_user(
runtime_storage_inst,
gerrit_tuple=('review.openstack.org', 'john_doe')))
self.assertEqual(user, user_processor.load_user(
runtime_storage_inst,
gerrit_tuple=('review.openstack.org', 'johnathan_doe')))
self.assertEqual(user, user_processor.load_user(
runtime_storage_inst,
gerrit_tuple=('review.gerrithub.io', 'johnathan_doe')))
# all records should have the same user_id and company name
for record in runtime_storage_inst.get_all_records():
@ -1053,6 +1194,7 @@ class TestRecordProcessor(testtools.TestCase):
runtime_storage_inst.set_records(record_processor_inst.process([
{'record_type': 'review',
'id': 'I1045730e47e9e6ad31fcdfbaefdad77e2f3b2c3e',
'gerrit_hostname': 'review.openstack.org',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'John Doe',
'email': 'john_doe@ibm.com',
@ -1228,6 +1370,7 @@ class TestRecordProcessor(testtools.TestCase):
runtime_storage_inst.set_records(record_processor_inst.process([
{'record_type': 'review',
'id': 'I1045730e47e9e6ad31fcdfbaefdad77e2f3b2c3e',
'gerrit_hostname': 'review.openstack.org',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'John Doe',
'email': 'john_doe@ibm.com',
@ -1328,6 +1471,7 @@ class TestRecordProcessor(testtools.TestCase):
'release_name': 'havana'},
{'record_type': 'review',
'id': 'I104573',
'gerrit_hostname': 'review.openstack.org',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'John Doe',
'email': 'john_doe@gmail.com',
@ -1361,6 +1505,7 @@ class TestRecordProcessor(testtools.TestCase):
'release_name': 'havana'},
{'record_type': 'review',
'id': 'I104573',
'gerrit_hostname': 'review.openstack.org',
'subject': 'Fix AttributeError in Keypair._add_details()',
'owner': {'name': 'John Doe',
'email': 'john_doe@gmail.com',