Check change owners against OSF Individual Members

According to the Bylaws of the OpenStack Foundation Appendix 4
Technical Committee Member Policy §3.b[1] along with the OpenStack
Technical Committee Charter definitions for APC[2] and ATC[3], we
limit the voter rolls for technical elections to Foundation
Individual Members.

Use the OpenStack Foundation's member directory lookup API to record
the member ID of each change owner. If an owner does not have any
E-mail address in Gerrit which matches at least one E-mail address
of an OSF Individual Membership record, then exclude them from CIVS
ballots and event discount invitations.

[1] https://www.openstack.org/legal/technical-committee-member-policy/
[2] https://governance.openstack.org/tc/reference/charter.html#voters-for-ptl-seats-apc
[3] https://governance.openstack.org/tc/reference/charter.html#voters-for-tc-seats-atc

Change-Id: I920e1bc134d1283e2019f4389a5491e9b746cca0
Story: #2001094
Task: #4813
This commit is contained in:
Jeremy Stanley 2017-07-14 15:40:52 +00:00
parent 5b8df42959
commit fb3e76576b

View File

@ -204,6 +204,25 @@ def query_gerrit(method, params={}):
return decode_json(raw)
def lookup_member(email):
"""A requests wrapper to querying the OSF member directory API"""
# The OpenStack foundation member directory lookup API endpoint
MEMBER_LOOKUP_URL = 'https://openstackid-resources.openstack.org/'
# URL pattern for querying foundation members by E-mail address
raw = requester(
MEMBER_LOOKUP_URL + '/api/public/v1/members',
params={'filter[]': [
'group_slug==foundation-members',
'email==' + email,
]},
headers={'Accept': 'application/json'},
)
return decode_json(raw)
def usage(argv):
"""Parse command line argument"""
parser = argparse.ArgumentParser(
@ -606,12 +625,18 @@ def main(argv=sys.argv):
'SKIPPING MALFORMED OWNER: no preferred or extra '
'addresses found for account %s' % owner, file=sys.stderr)
continue
for email in [owners[owner]['preferred']] + owners[owner]['extra']:
member = lookup_member(email)
if member['data']:
owners[owner]['member'] = member['data'][0]['id']
continue
invite.append(owners[owner]['preferred'])
invite += owners[owner]['extra']
invites.append(invite)
# Append preferred addresses to the TC electorate
electorate.append(owners[owner]['preferred'] + '\n')
# Append preferred addresses to the TC electorate for members only
if 'member' in owners[owner]:
electorate.append(owners[owner]['preferred'] + '\n')
# Write out a YAML file covering all change owners
fd = open(os.path.join(outdir, '_all_owners.yaml'), 'w')