Exclude projects under the distributed leadership model

Currently there are 2 leadership types "distributed" and the
Default/unspecified which we treat as the long established PTL model.
Projects that have selected to use the "distributed" model do not
require a PTL election and in fact projects under this model should
reject a PTL nomination as the correct process involves a change the
governance repo.

This change updates 'create-directories' to exclude those projects,
and also updates the ci checks to fail PTL nominations for "distributed"
projects.

Change-Id: Ib4a2ce1e4ee74e8e9a49975017e14172b4d1f576
This commit is contained in:
Tony Breeds 2023-06-30 14:00:42 +10:00
parent 671c88aab3
commit eb4636f483
4 changed files with 67 additions and 1 deletions

View File

@ -44,6 +44,21 @@ def validate_filename(filepath):
return is_valid
def validate_project(filepath, projects):
print('Validate the project requires a PTL')
print('-----------------------------------')
project_name = utils.get_project(filepath)
leadership_type = projects.get(project_name, {}).get("leadership_type")
is_valid = leadership_type not in ["distributed"]
print('Project Name: %s [%s]' % (project_name, filepath))
print('Leadership Type: %s %s' % (leadership_type,
{True: 'PASS', False: 'FAIL'}[is_valid]))
print('')
return is_valid
def validate_member(filepath, verbose=0):
print('Validate email address is OSF member')
print('------------------------------------')
@ -148,6 +163,7 @@ def main():
candidate_ok = True
candidate_ok &= validate_filename(filepath)
candidate_ok &= validate_project(filepath, projects)
candidate_ok &= validate_member(filepath, verbose=args.verbose)
if candidate_ok:

View File

@ -22,7 +22,12 @@ def main():
base_dir = "candidates/%s" % utils.conf['release']
projects = utils.get_projects()
project_list = list(projects.keys())
project_list = []
for project_name, project_data in projects.items():
# leadership_type is an optional property and currently (2023-06-29)
# the only valid enumeration is 'distributed'.
if project_data.get("leadership_type", "") not in ["distributed"]:
project_list.append(project_name)
project_list.sort()
for project in project_list + ["TC"]:
dpath = "%s/%s" % (base_dir, utils.name2dir(project))

View File

@ -10,6 +10,10 @@
# License for the specific language governing permissions and limitations
# under the License.
import os
import textwrap
import yaml
from unittest import mock
from openstack_election.cmds import ci_check_all_candidate_files
@ -51,3 +55,39 @@ class TestFindModifiedCandidateFiles(base.ElectionTestCase):
filenames = \
ci_check_all_candidate_files.find_modified_candidate_files()
self.assertEqual(expected_filenames, filenames)
class TestValidateProject(base.ElectionTestCase):
projects_str = textwrap.dedent("""
---
project:
ptl:
name: PTL Name
email: ptl@example.com
irc: ptl_nic
distributed_project:
leadership_type: distributed
""")
fake_projects = yaml.safe_load(projects_str)
def test_ptl_project(self):
file_path = os.path.join("...", utils.CANDIDATE_PATH,
"project/candidate@email")
is_ok = \
ci_check_all_candidate_files.validate_project(file_path,
self.fake_projects)
self.assertTrue(is_ok)
# A project with a "distributed" leadership_type should not have
# candidates
def test_distributed_project(self):
file_path = os.path.join("...", utils.CANDIDATE_PATH,
"distributed_project/candidate@email")
is_ok = \
ci_check_all_candidate_files.validate_project(file_path,
self.fake_projects)
self.assertFalse(is_ok)
# TODO(tonyb): Add more validate_* tests here

View File

@ -176,6 +176,11 @@ def get_email(filepath):
return os.path.basename(filepath)
def get_project(filepath):
path = os.path.dirname(filepath)
return os.path.basename(path)
def get_gerrit_account(email):
accounts = gerrit_query('%s/accounts/' % (GERRIT_BASE),
params={'q': email, 'o': ['DETAILS']})