governance/tools/assign_liaisons.py

92 lines
2.7 KiB
Python

#!/usr/bin/env python3
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import argparse
import collections
import random
from openstack_governance import members
from openstack_governance import projects
def main():
parser = argparse.ArgumentParser()
parser.add_argument(
'--member-file',
default='reference/members.yaml',
help='location of members file, (%(default)s)',
)
parser.add_argument(
'--projects-file',
default='reference/projects.yaml',
help='location of projects.yaml, (%(default)s)',
)
parser.add_argument(
'--replace-all',
action='store_true',
help='Replace all assigned liasons (%(default)s)',
)
parser.add_argument(
'--remove-all',
action='store_true',
help='Remove all assigned liasons (%(default)s)',
)
args = parser.parse_args()
member_nics = [
m['irc']
for m in members.parse_members_file(args.member_file)
]
project_data = projects.load_project_file(args.projects_file)
num_teams = len(project_data)
assignments_per = num_teams // (len(member_nics) // 2)
member_counts = collections.Counter({
nic: 0
for nic in member_nics
})
for _, team in project_data.items():
for member in team.get('liasons', []):
member_counts.update({member: 1})
choices = []
for member, count in sorted(member_counts.items()):
choices.extend([member] * (assignments_per - count))
# Make sure we have a list in order that isn't assigning the same
# person to a team twice.
for name, team in project_data.items():
liasons = team.get('liasons', [])
if args.remove_all:
team['liasons'] = []
continue
if args.replace_all:
liasons = []
while len(liasons) < 2:
random.shuffle(choices)
next_choice = choices.pop()
while next_choice in liasons:
choices.insert(0, next_choice)
next_choice = choices.pop()
liasons.append(next_choice)
team['liasons'] = liasons
projects.write_project_file(project_data, args.projects_file)
if __name__ == '__main__':
main()