Browse Source

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
changes/91/837891/2
Ghanshyam Mann 4 months ago
parent
commit
76b54e9284
  1. 15
      CHAIR.rst
  2. 143
      doc/source/_exts/tc_liaisons.py
  3. 3
      doc/source/_exts/teams.py
  4. 1
      doc/source/conf.py
  5. 3
      openstack_governance/tests/test_governance.py
  6. 1
      reference/index.rst
  7. 121
      reference/projects.yaml
  8. 24
      reference/tc-guide.rst
  9. 9
      reference/tc-liaisons.rst
  10. 95
      tools/assign_liaisons.py

15
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
=======================

143
doc/source/_exts/tc_liaisons.py

@ -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)

3
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(

1
doc/source/conf.py

@ -37,7 +37,6 @@ extensions = [
'members',
'projects',
'teams',
'tc_liaisons',
'badges',
'page_context',
]

3
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

1
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

121
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: []

24
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 </reference/tc-liaisons>`
recommend also setting a notification for a string with your name.
TC Repos
~~~~~~~~~

9
reference/tc-liaisons.rst

@ -1,9 +0,0 @@
===========
TC Liaisons
===========
OpenStack Project Team TC Liasons
=================================
.. liaisonstable::
:datafile: ../reference/projects.yaml

95
tools/assign_liaisons.py

@ -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()
Loading…
Cancel
Save