From 76b54e92840d7253784e99be434eadedd2e950cb Mon Sep 17 00:00:00 2001 From: Ghanshyam Mann Date: Thu, 14 Apr 2022 10:19:56 -0500 Subject: [PATCH] Remove TC Liaisons framework TC is more connected with project teams with the weekly meeting and PTG TC+Leadership interaction sessions. Also, TC liaisons did not work the way we expected it. In Zed PTG, we decided to remove it. - https://etherpad.opendev.org/p/tc-zed-ptg Change-Id: I08702b015245df35d40e08fa08a3269cc6bb1cac --- CHAIR.rst | 15 -- doc/source/_exts/tc_liaisons.py | 143 ------------------ doc/source/_exts/teams.py | 3 - doc/source/conf.py | 1 - openstack_governance/tests/test_governance.py | 3 - reference/index.rst | 1 - reference/projects.yaml | 121 --------------- reference/tc-guide.rst | 24 +-- reference/tc-liaisons.rst | 9 -- tools/assign_liaisons.py | 95 ------------ 10 files changed, 1 insertion(+), 414 deletions(-) delete mode 100644 doc/source/_exts/tc_liaisons.py delete mode 100644 reference/tc-liaisons.rst delete mode 100644 tools/assign_liaisons.py diff --git a/CHAIR.rst b/CHAIR.rst index 66450019d..dd9a295d0 100644 --- a/CHAIR.rst +++ b/CHAIR.rst @@ -70,8 +70,6 @@ When the election results are available, the outgoing chair should: * encourage all TC members to include the "[tc]" topic in their filter list for the openstack-discuss mailing list * propose a patch to remove current chair and vice chair -* propose a patch to remove liaisons assigned to previous members - (``python ./tools/assign_liaisons.py --remove-all``) After the election results are confirmed, the outgoing chair should: @@ -90,21 +88,8 @@ After the election results are confirmed, the outgoing chair should: After the chair status is confirmed, the incoming chair should: -* start the liaison assignment process (see below) * propose a patch to appoint a vice chair -Project Team Liaisons -===================== - -Each term of the TC we designate 2 members to be liaisons to each -project team - - -* encourage TC members to volunteer to act as liaisons for the project - teams they want (set a deadline, ~1 week) -* Run ``python ./tools/assign_liaisons.py`` to randomly assign the remaining - members. - Governance Repo Patches ======================= diff --git a/doc/source/_exts/tc_liaisons.py b/doc/source/_exts/tc_liaisons.py deleted file mode 100644 index a2d32060a..000000000 --- a/doc/source/_exts/tc_liaisons.py +++ /dev/null @@ -1,143 +0,0 @@ -# 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. - -"""Build a table of the current members of the TC. -""" - -from docutils import nodes -from docutils.parsers.rst import directives -from docutils.parsers.rst.directives import tables -from docutils.utils import SystemMessagePropagation -from sphinx.util import logging - -from openstack_governance import projects - -LOG = logging.getLogger(__name__) - - -class TCLiaisonsTable(tables.Table): - """Insert the members table using the referenced file as source. - """ - - HEADERS = ('TC Member', 'Projects') - - option_spec = {'class': directives.class_option, - 'name': directives.unchanged, - 'datafile': directives.unchanged, - } - - has_content = False - - def run(self): - env = self.state.document.settings.env - - # The required argument to the directive is the name of the - # file to parse. - datafile = self.options.get('datafile') - if not datafile: - error = self.state_machine.reporter.error( - 'No filename in membertable directive', - nodes.literal_block(self.block_text, self.block_text), - line=self.lineno) - return [error] - - # Handle the width settings and title - try: - col_widths = self.get_column_widths(len(self.HEADERS)) - title, messages = self.make_title() - except SystemMessagePropagation as detail: - return [detail.args[0]] - except Exception as err: - error = self.state_machine.reporter.error( - 'Error processing memberstable directive:\n%s' % err, - nodes.literal_block(self.block_text, self.block_text), - line=self.lineno, - ) - return [error] - - # Now find the real path to the file, relative to where we are. - rel_filename, filename = env.relfn2path(datafile) - - # Build the table node using the parsed file - data_iter = projects.load_project_file(filename) - liaisons = {} - for project_name, project in data_iter.items(): - proj_liaisons = project.get('liaisons', {}) - - for liaison in proj_liaisons.get('tc_members', []): - try: - liaisons[liaison].extend([project_name]) - except KeyError: - liaisons[liaison] = [] - liaisons[liaison].extend([project_name]) - - table_node = self.build_table( - liaisons, - col_widths, - ) - table_node['classes'] += self.options.get('class', []) - self.add_name(table_node) - - if title: - table_node.insert(0, title) - - return [table_node] + messages - - def build_table(self, table_data, col_widths): - table = nodes.table() - - # Set up the column specifications - # based on the widths. - tgroup = nodes.tgroup(cols=len(col_widths)) - table += tgroup - tgroup.extend(nodes.colspec(colwidth=col_width) - for col_width in col_widths) - - # Set the headers - thead = nodes.thead() - tgroup += thead - row_node = nodes.row() - thead += row_node - row_node.extend( - nodes.entry(h, nodes.paragraph(text=h)) - for h in self.HEADERS - ) - - # The body of the table is made up of rows. - # Each row contains a series of entries, - # and each entry contains a paragraph of text. - tbody = nodes.tbody() - tgroup += tbody - rows = [] - for member, tc_projects in table_data.items(): - trow = nodes.row() - # Iterate over the headers in the same order every time. - name = nodes.entry() - name += nodes.paragraph(text=str(member)) - trow += name - project = nodes.entry() - project_list = nodes.paragraph() - for proj in tc_projects: - project_list += nodes.reference( - proj, proj, refuri="projects/%s.html" % proj) - project_list += nodes.Text(", ") - project += project_list - trow += project - rows.append(trow) - tbody.extend(rows) - - return table - - -def setup(app): - LOG.info('loading tc liaisons extension') - app.add_directive('liaisonstable', TCLiaisonsTable) diff --git a/doc/source/_exts/teams.py b/doc/source/_exts/teams.py index d9516d3ac..f5fb0df7e 100644 --- a/doc/source/_exts/teams.py +++ b/doc/source/_exts/teams.py @@ -58,9 +58,6 @@ def _team_to_rst(name, info): liaisons = info.get('liaisons') if liaisons: contact_format = {'name': '', 'irc': '', 'email': ''} - tc_members = liaisons.get('tc_members') - if tc_members: - yield ':TC Members Liaisons: ' + ", ".join(tc_members) release = liaisons.get('release', contact_format) if release != contact_format: yield ':Release Liaisons: ' + ', '.join( diff --git a/doc/source/conf.py b/doc/source/conf.py index 4e1a0f5a0..01e2a0603 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -37,7 +37,6 @@ extensions = [ 'members', 'projects', 'teams', - 'tc_liaisons', 'badges', 'page_context', ] diff --git a/openstack_governance/tests/test_governance.py b/openstack_governance/tests/test_governance.py index ca1b85759..90f644c4f 100644 --- a/openstack_governance/tests/test_governance.py +++ b/openstack_governance/tests/test_governance.py @@ -32,9 +32,6 @@ Release Management: their own releases. url: https://wiki.openstack.org/wiki/Release_Management liaisons: - tc_members: - - zaneb - - ttx release: - name: Hervé Beraud irc: hberaud diff --git a/reference/index.rst b/reference/index.rst index 63890cad3..10aff9ca2 100644 --- a/reference/index.rst +++ b/reference/index.rst @@ -11,7 +11,6 @@ Reference documents which need to be revised over time. principles charter projects/index - tc-liaisons popup-teams technical-vision upstream-investment-opportunities/index diff --git a/reference/projects.yaml b/reference/projects.yaml index 997d15b76..cdec8014b 100644 --- a/reference/projects.yaml +++ b/reference/projects.yaml @@ -24,8 +24,6 @@ adjutant: python-adjutantclient: repos: - openstack/python-adjutantclient - liaisons: - tc_members: [] barbican: ptl: name: Douglas Mendizábal @@ -66,8 +64,6 @@ barbican: python-barbicanclient: repos: - openstack/python-barbicanclient - liaisons: - tc_members: [] blazar: ptl: name: Pierre Riteau @@ -101,8 +97,6 @@ blazar: python-blazarclient: repos: - openstack/python-blazarclient - liaisons: - tc_members: [] cinder: ptl: name: Rajat Dhasmana @@ -141,8 +135,6 @@ cinder: rbd-iscsi-client: repos: - openstack/rbd-iscsi-client - liaisons: - tc_members: [] cloudkitty: ptl: name: Rafael Weingartner @@ -176,8 +168,6 @@ cloudkitty: cloudkitty-tempest-plugin: repos: - openstack/cloudkitty-tempest-plugin - liaisons: - tc_members: [] cyborg: ptl: name: Bailin Zhang @@ -206,8 +196,6 @@ cyborg: cyborg-tempest-plugin: repos: - openstack/cyborg-tempest-plugin - liaisons: - tc_members: [] designate: ptl: name: Michael Johnson @@ -238,8 +226,6 @@ designate: python-designateclient: repos: - openstack/python-designateclient - liaisons: - tc_members: [] ec2-api: ptl: name: Andrey Pavlov @@ -257,8 +243,6 @@ ec2-api: ec2api-tempest-plugin: repos: - openstack/ec2api-tempest-plugin - liaisons: - tc_members: [] freezer: ptl: name: ge cong @@ -293,8 +277,6 @@ freezer: python-freezerclient: repos: - openstack/python-freezerclient - liaisons: - tc_members: [] glance: ptl: name: Abhishek Kekane @@ -324,8 +306,6 @@ glance: python-glanceclient: repos: - openstack/python-glanceclient - liaisons: - tc_members: [] heat: ptl: name: Rico Lin @@ -377,8 +357,6 @@ heat: tosca-parser: repos: - openstack/tosca-parser - liaisons: - tc_members: [] horizon: ptl: name: Vishal Manchanda @@ -482,8 +460,6 @@ horizon: xstatic-spin: repos: - openstack/xstatic-spin - liaisons: - tc_members: [] ironic: ptl: name: Iury Gregory Melo Ferreira @@ -563,9 +539,6 @@ ironic: virtualbmc: repos: - openstack/virtualbmc - liaisons: - tc_members: [] - keystone: ptl: name: Douglas Mendizábal @@ -604,7 +577,6 @@ keystone: repos: - openstack/ldappool liaisons: - tc_members: [] release: - name: Gage Hugo irc: gagehugo @@ -649,8 +621,6 @@ kolla: - openstack/kayobe - openstack/kayobe-config - openstack/kayobe-config-dev - liaisons: - tc_members: [] kuryr: ptl: name: Maysa de Macedo Souza @@ -675,8 +645,6 @@ kuryr: kuryr-tempest-plugin: repos: - openstack/kuryr-tempest-plugin - liaisons: - tc_members: [] magnum: ptl: name: Spyros Trigazis @@ -707,8 +675,6 @@ magnum: python-magnumclient: repos: - openstack/python-magnumclient - liaisons: - tc_members: [] manila: ptl: name: Carlos Silva @@ -745,8 +711,6 @@ manila: python-manilaclient: repos: - openstack/python-manilaclient - liaisons: - tc_members: [] masakari: ptl: name: suzhengwei @@ -778,8 +742,6 @@ masakari: masakari-dashboard: repos: - openstack/masakari-dashboard - liaisons: - tc_members: [] mistral: leadership_type: distributed irc-channel: openstack-mistral @@ -814,7 +776,6 @@ mistral: repos: - openstack/mistral-extra liaisons: - tc_members: [] release: - name: Renat Akhmerov irc: rakhmerov @@ -910,8 +871,6 @@ monasca: monasca-kibana-plugin: repos: - openstack/monasca-kibana-plugin - liaisons: - tc_members: [] murano: ptl: name: Rong Zhu @@ -956,8 +915,6 @@ murano: murano-tempest-plugin: repos: - openstack/murano-tempest-plugin - liaisons: - tc_members: [] neutron: ptl: name: Lajos Katona @@ -1035,8 +992,6 @@ neutron: tap-as-a-service: repos: - openstack/tap-as-a-service - liaisons: - tc_members: [] nova: ptl: name: Sylvain Bauza @@ -1075,8 +1030,6 @@ nova: os-resource-classes: repos: - openstack/os-resource-classes - liaisons: - tc_members: [] octavia: ptl: name: Gregory Thiemonge @@ -1106,8 +1059,6 @@ octavia: octavia-lib: repos: - openstack/octavia-lib - liaisons: - tc_members: [] OpenStack Charms: ptl: name: Alex Kavanagh @@ -1695,8 +1646,6 @@ OpenStack Charms: release-management: external repos: - openstack/charm-watcher-dashboard - liaisons: - tc_members: [] openstack-chef: ptl: name: Lance Albertson @@ -1791,8 +1740,6 @@ openstack-chef: release-management: none repos: - openstack/openstack-chef-specs - liaisons: - tc_members: [] OpenStack-Helm: ptl: name: Gage Hugo @@ -1835,8 +1782,6 @@ OpenStack-Helm: release-management: none repos: - openstack/loci - liaisons: - tc_members: [] OpenStackAnsible: ptl: name: Dmitriy Rabotyagov @@ -1945,8 +1890,6 @@ OpenStackAnsible: release-management: none repos: - openstack/openstack-ansible-specs - liaisons: - tc_members: [] OpenStackSDK: ptl: name: Artem Goncharov @@ -1993,8 +1936,6 @@ OpenStackSDK: shade: repos: - openstack/shade - liaisons: - tc_members: [] oslo: leadership_type: distributed irc-channel: openstack-oslo @@ -2145,7 +2086,6 @@ oslo: - openstack/whereto liaisons: - tc_members: [] release: - name: Hervé Beraud irc: hberaud @@ -2307,9 +2247,6 @@ Puppet OpenStack: puppet-zaqar: repos: - openstack/puppet-zaqar - - liaisons: - tc_members: [] Quality Assurance: ptl: name: Martin Kopec @@ -2406,8 +2343,6 @@ Quality Assurance: release-management: none repos: - openstack/whitebox-tempest-plugin - liaisons: - tc_members: [] rally: ptl: name: Andrey Kurilin @@ -2433,9 +2368,6 @@ rally: release-management: none repos: - openstack/performance-docs - - liaisons: - tc_members: [] Release Management: ptl: name: Elod Illes @@ -2463,8 +2395,6 @@ Release Management: release-management: none repos: - openstack/specs-cookiecutter - liaisons: - tc_members: [] requirements: ptl: name: Matthew Thode @@ -2481,8 +2411,6 @@ requirements: requirements: repos: - openstack/requirements - liaisons: - tc_members: [] sahara: ptl: name: Fossen Qiu @@ -2537,9 +2465,6 @@ sahara: release-management: none repos: - openstack/sahara-specs - - liaisons: - tc_members: [] senlin: ptl: name: XueFeng Liu @@ -2568,10 +2493,6 @@ senlin: senlin-tempest-plugin: repos: - openstack/senlin-tempest-plugin - - liaisons: - tc_members: [] - skyline: ptl: name: Wenxiang Wu @@ -2594,9 +2515,6 @@ skyline: skyline-console: repos: - openstack/skyline-console - - liaisons: - tc_members: [] solum: ptl: name: Rong Zhu @@ -2628,9 +2546,6 @@ solum: solum-tempest-plugin: repos: - openstack/solum-tempest-plugin - - liaisons: - tc_members: [] storlets: ptl: name: Takashi Kajinami @@ -2647,9 +2562,6 @@ storlets: storlets: repos: - openstack/storlets - - liaisons: - tc_members: [] swift: ptl: name: Tim Burke @@ -2682,9 +2594,6 @@ swift: swift-bench: repos: - openstack/swift-bench - - liaisons: - tc_members: [] tacker: ptl: name: Yasufumi Ogawa @@ -2713,9 +2622,6 @@ tacker: release-management: none repos: - openstack/tacker-specs - - liaisons: - tc_members: [] Telemetry: ptl: name: Matthias Runge @@ -2759,9 +2665,6 @@ Telemetry: telemetry-tempest-plugin: repos: - openstack/telemetry-tempest-plugin - - liaisons: - tc_members: [] tripleo: ptl: name: James Slagle @@ -2891,9 +2794,6 @@ tripleo: release-management: none repos: - openstack/tripleo-ha-utils - - liaisons: - tc_members: [] trove: ptl: name: Wu Chunyang @@ -2926,9 +2826,6 @@ trove: trove-tempest-plugin: repos: - openstack/trove-tempest-plugin - - liaisons: - tc_members: [] venus: ptl: name: Liye Pang @@ -2962,10 +2859,6 @@ venus: venus-tempest-plugin: repos: - openstack/venus-tempest-plugin - - liaisons: - tc_members: [] - vitrage: ptl: name: Eyal Bar-Ilan @@ -3013,9 +2906,6 @@ vitrage: xstatic-moment-timezone: repos: - openstack/xstatic-moment-timezone - - liaisons: - tc_members: [] watcher: ptl: name: chen ke @@ -3046,9 +2936,6 @@ watcher: watcher-dashboard: repos: - openstack/watcher-dashboard - - liaisons: - tc_members: [] winstackers: ptl: name: Lucian Petrut @@ -3077,9 +2964,6 @@ winstackers: compute-hyperv: repos: - openstack/compute-hyperv - - liaisons: - tc_members: [] zaqar: ptl: name: wang hao @@ -3115,9 +2999,6 @@ zaqar: zaqar-ui: repos: - openstack/zaqar-ui - - liaisons: - tc_members: [] zun: ptl: name: Feng Shengqin @@ -3146,5 +3027,3 @@ zun: zun-ui: repos: - openstack/zun-ui - liaisons: - tc_members: [] diff --git a/reference/tc-guide.rst b/reference/tc-guide.rst index af66148d4..e49af5859 100644 --- a/reference/tc-guide.rst +++ b/reference/tc-guide.rst @@ -64,29 +64,7 @@ As a TC member, we have two primary ways of communicating. #. IRC channel: Please also join the ``#openstack-tc`` channel on IRC, and set a notification for the string ``tc-members``. There is no requirement to do this, but we - recommend also setting a notification for a string with your name. This - is also helpful for mentions in other channels if you are the ``tc-liaison`` - to a specific project. - -TC Project Liasions -~~~~~~~~~~~~~~~~~~~~ - -Each project under OpenStack governance is assigned two TC members to act as -liaisons. These liaisons should act as a bridge between that project and the -TC, helping the project with governance concerns. You will be assigned a list -of projects based on random selection if you don't set them yourself. You can -pick your preferred projects yourself after you are seated by submitting a -patch. This mechanical assignment of tc members as liaisons looks something -like this: https://review.opendev.org/#/c/680386/. - -Once you have been assigned your projects, the first work item for new and returning -members is to talk to the projects for which you are a liaison. We recommend -introducing yourself to the PTL in an email or during a team meeting if you're -able to attend them, a greeting to the project team to ensure they know someone -to talk to, making sure the TC is an accessible community. - -You can see the assigned list of projects per TC member in -:doc:`TC Liaisons ` + recommend also setting a notification for a string with your name. TC Repos ~~~~~~~~~ diff --git a/reference/tc-liaisons.rst b/reference/tc-liaisons.rst deleted file mode 100644 index ef401eb45..000000000 --- a/reference/tc-liaisons.rst +++ /dev/null @@ -1,9 +0,0 @@ -=========== -TC Liaisons -=========== - -OpenStack Project Team TC Liasons -================================= - -.. liaisonstable:: - :datafile: ../reference/projects.yaml \ No newline at end of file diff --git a/tools/assign_liaisons.py b/tools/assign_liaisons.py deleted file mode 100644 index e8e9c00d4..000000000 --- a/tools/assign_liaisons.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/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 liaisons (%(default)s)', - ) - parser.add_argument( - '--remove-all', - action='store_true', - help='Remove all assigned liaisons (%(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 - }) - - if not args.replace_all: - for _, team in project_data.items(): - proj_liaisons = team.get('liaisons', {}) - for member in proj_liaisons.get('tc_members', []): - 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(): - proj_liaisons = team.get('liaisons', {}) - liaisons = proj_liaisons.get('tc_members', []) - if args.remove_all: - team['liaisons']['tc_members'] = [] - continue - if args.replace_all: - liaisons = [] - while len(liaisons) < 2: - random.shuffle(choices) - next_choice = choices.pop() - while next_choice in liaisons: - choices.insert(0, next_choice) - next_choice = choices.pop() - liaisons.append(next_choice) - team['liaisons']['tc_members'] = liaisons - - projects.write_project_file(project_data, args.projects_file) - - -if __name__ == '__main__': - main()