diff --git a/.gitignore b/.gitignore index b01c1448..ff80b0c3 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ candidates/events.rst .projects*yaml .projects*.pkl .testrepository +doc/source/archive_toc.rst +doc/source/*/*.rst diff --git a/README.rst b/README.rst index 513d087a..d3527c36 100644 --- a/README.rst +++ b/README.rst @@ -1,13 +1,112 @@ +================== +openstack/election +================== + This repository contains OpenStack Elections reference documents -and track candidate lists and elections' results. +and tooling to run elections. -Directory structure: - candidates/ - / e.g mitaka (case matters) - / e.g Nova (case matters) - .txt - TC/ - .txt - results/ - Only edititable by the Election officials +Election officials process +========================== + +Preparation +----------- + +A month before election starts: + +* Prepare new election, e.g.: + * tox -evenv -- new-election.py pike +* Edit elections details (timeline, cycle timeframe): + * edit configuration.yaml +* Update index.rst to include ptl.rst +* Commit to update website + +A couple of weeks before election starts +* Send 'First announce' + + +PTL Candidacy round +------------------- + +When PTL Candidacy start +* Send 'Opening PTL candidacy round' + +During the PTL Candidacy round: +* Validate candidacy, e.g.: + * tox -evenv -- check-new-candidacy, or + * tox -evenv -- check-candidacy change_id +* To +2 a candidate: + * check commit link is indeed valid + * check filename is ircname + * cursory check the candidacy statement +* To +Workflow, checks the previous +2 details, find another commits using --limit 5 (optionals) + +* Check candidate list and fixes badly generated name using the exception.txt file + +A couple of days before the candidacy submission ends: +* Render statistics and send 'Motivation call for PTL candidacy round', e.g.: + * tox -evenv -- render-statistics + +When PTL Candidacy submission ends: +* Send 'PTL nomination ending' + + +PTL Election round +------------------ + +When PreferredEmailDeadLine is reached: +* Generate ATC rolls, e.g.: + * ./tools/generate-rolls.sh + +When PTL Election begins: +* Create CIVS page ( https://wiki.openstack.org/wiki/Election_Officiating_Guidelines#Running_the_election_itself ) +* Upload rolls +* Send 'PTL election opening' + +A couple of days before the PTL Election ends: +* Send 'PTL vote motivation call' + +When PTL Election ends: +* close the election and udpate the results: + * tox -evenv -- close-election ptl + * edit doc/sources/pike/ptl.yaml +* update index.rst to include tc.rst instead of ptl.rst +* Commit the change and review the results +* Send 'PTL results' + + +TC Candidacy round +------------------ + +When TC Candidacy starts: +* Send 'TC Candidacy Opening' + +During the TC Candidacy round: +* To +2 a candidate: + * check candidate profile using http://www.openstack.org/community/members/ + * check filename is ircname + * cursory check the candidacy statement +* To +Workflow, check the previous +2 details + +A couple of days before the candidacy submission ends: +* Send 'Motivation call for TC Candidacy round' + +When TC Candidacy submission ends: +* Send 'TC nomiation ending' + + +TC Election round +----------------- +* Create CIVS page +* Upload rolls +* Send 'TC election opening' + +A couple of days before the TC Election ends: +* Send 'TC vote motivation call' + +When TC Election ends: +* close the election and update the results: + * tox -e venv -- close-election tc + * edit doc/source/pike/tc.yaml +* Commit the change and review the results +* Send 'TC results' diff --git a/doc/source/_exts/candidates.py b/doc/source/_exts/candidates.py index 29f1d618..773a4ae8 100644 --- a/doc/source/_exts/candidates.py +++ b/doc/source/_exts/candidates.py @@ -15,6 +15,7 @@ import os import urllib +import yaml from jinja2 import FileSystemLoader from jinja2.environment import Environment @@ -44,11 +45,54 @@ def render_list(list_type, candidates_list): ) +def build_archive(serie, list_type): + db_file = os.path.join(".", "doc", "source", serie, "%s.yaml" % list_type) + if not os.path.isfile(db_file): + return + db = yaml.safe_load(open(db_file)) + # Check for appointed or incumbent footnote + db['tags'] = {} + for project in db['projects']: + for candidate in db['candidates'][project]: + if candidate['elected'] == 'TC-APPOINTED': + db['tags']['TC-APPOINTED'] = True + elif candidate['elected'] == 'INCUMBENT-PTL': + db['tags']['INCUMBENT-PTL'] = True + output = os.path.join(".", "doc", "source", serie, "%s.rst" % list_type) + template_name = "%s_archive.jinja" % list_type + template_dir = os.path.join(".", "doc", "source", "_exts") + with open(output, "w") as out: + out.write( + render_template( + template_name, + db, + template_dir=template_dir + ).encode('utf-8') + ) + return True + + def build_lists(app): + # Current candidates candidates_list = utils.build_candidates_list() render_list("ptl", candidates_list) render_list("tc", candidates_list) + # Archived elections + previous_toc = [ + ".. toctree::", + " :maxdepth: 1", + " :titlesonly:", + "" + ] + for previous in utils.PAST_ELECTIONS: + if build_archive(previous, "ptl"): + previous_toc.append(" %s/ptl.rst" % previous) + if build_archive(previous, "tc"): + previous_toc.append(" %s/tc.rst" % previous) + toc = os.path.join(".", "doc", "source", "archive_toc.rst") + open(toc, "w").write("\n".join(previous_toc)) + def setup(app): app.info('loading candidates extension') diff --git a/doc/source/_exts/ptl_archive.jinja b/doc/source/_exts/ptl_archive.jinja new file mode 100644 index 00000000..fc8e6302 --- /dev/null +++ b/doc/source/_exts/ptl_archive.jinja @@ -0,0 +1,41 @@ +====================== +{{ election.capitalize() }} PTL +====================== + +{% for project in projects %} +* {{ project.replace('_', ' ') }} + +{% for candidate in candidates[project] %}{% if candidate['elected'] and 'url' in candidate %} + * `{{ candidate['fullname'] }} ({{ candidate['ircname'] }}) <{{ candidate['url'] }}>`_ +{% elif candidate['elected'] %} + * {{ candidate['fullname'] }} ({{ candidate['ircname'] }}) {% if candidate['elected'] == 'INCUMBENT-PTL' %}[#IncumbentPTL]_{% else %}[#TCAppointed]_{% endif %} +{% endif %}{% endfor %} + +{% endfor %} + +{% if 'TC-APPOINTED' in tags %} +.. [#TCAppointed] By TC Appointment +{% endif %} +{% if 'INCUMBENT-PTL' in tags %} +.. [#IncumbentPTL] Incumbent PTL +{% endif %} + +Results +------- +{% for project in projects %}{% if project in elections_results %} + +* `{{ project }} <{{ elections_results[project] }}>`_ +{% endif %}{% endfor %} + + +{{ election.capitalize() }} PTL Candidates +====================== + +{% for project in projects %} +* {{ project.replace('_', ' ') }} + +{% for candidate in candidates[project] %}{% if 'url' in candidate %} + * `{{ candidate['fullname'] }} ({{ candidate['ircname'] }}) <{{ candidate['url'] }}>`_ +{% endif %}{% endfor %} + +{% endfor %} diff --git a/doc/source/_exts/tc_archive.jinja b/doc/source/_exts/tc_archive.jinja new file mode 100644 index 00000000..dcd0083a --- /dev/null +++ b/doc/source/_exts/tc_archive.jinja @@ -0,0 +1,16 @@ +====================== +{{ election.capitalize() }} elected TC members +====================== +{% for candidate in candidates['TC'] %}{% if candidate['elected'] %} +* `{{ candidate['fullname'] }} ({{ candidate['ircname'] }}) <{{ candidate['url'] }}>`_ +{% endif %}{% endfor %} + +Results +------- +* `TC <{{ elections_results['TC'] }}>`_ + +{{ election.capitalize() }} TC Candidates +====================== +{% for candidate in candidates['TC'] %} +* `{{ candidate['fullname'] }} ({{ candidate['ircname'] }}) <{{ candidate['url'] }}>`_ +{% endfor %} diff --git a/doc/source/index.rst b/doc/source/index.rst index 577e4f79..24464c7b 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -17,10 +17,12 @@ Below is the official list of candidates for the current round. .. TODO: Change from ptl.rst to tc.rst when TC rounds starts .. include:: ../../candidates/tc.rst -.. include:: ocata_ptl_results.rst -.. TODO: Adds TC Results and a link to `TC Candidates list`_ when TC candidacies are over -.. TODO: Adds PTL Results and a link to `PTL Candidates list`_ when PTL candidacies are over +Previous elections +================== + +.. include:: archive_toc.rst + Election Officials ================== @@ -149,9 +151,6 @@ The candidacy is then confirmed by elections officials through gerrit vote. See above `How to submit a candidacy`_ documentation. -.. include:: ocata_ptl_candidates.rst -.. TODO: add TC Candidates list when TC elections are over - .. seealso:: See the `Election Officiating Guidelines`_ page in the wiki for details on the diff --git a/doc/source/ocata/ptl.yaml b/doc/source/ocata/ptl.yaml new file mode 100644 index 00000000..0df4f853 --- /dev/null +++ b/doc/source/ocata/ptl.yaml @@ -0,0 +1,449 @@ +candidates: + Astara: + - email: ryan.petrello@dreamhost.com + fullname: Ryan Petrello + ircname: ryanpetrello + elected: INCUMBENT-PTL + Barbican: + - elected: true + email: dmccowan@cisco.com + fullname: Dave Mccowan + ircname: dave-mccowan + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Barbican/dave-mccowan.txt + Chef_OpenStack: + - elected: true + email: s@cassiba.com + fullname: Samuel Cassiba + ircname: sc\` + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Chef_OpenStack/sc%60.txt + Cinder: + - elected: true + email: sean_mcginnis@dell.com + fullname: Sean McGinnis + ircname: smcginnis + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Cinder/smcginnis.txt + Cloudkitty: + - elected: true + email: christophe.sauthier@objectif-libre.com + fullname: Christophe Sauthier + ircname: huats + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Cloudkitty/huats.txt + Community_App_Catalog: + - elected: true + email: doc@aedo.net + fullname: Christopher Aedo + ircname: docaedo + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Community_App_Catalog/docaedo.txt + Congress: + - elected: true + email: ekcs.openstack@gmail.com + fullname: Eric Kao + ircname: ekcs + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Congress/ekcs.txt + Designate: + - elected: true + email: graham.hayes@hpe.com + fullname: Graham Hayes + ircname: mugsie + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Designate/mugsie.txt + Documentation: + - elected: true + email: openstack@lanabrindley.com + fullname: Lana Brindley + ircname: loquacities + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Documentation/loquacities.txt + Dragonflow: + - elected: true + email: omer.anson@toganetworks.com + fullname: Omer Anson + ircname: oanson + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Dragonflow/oanson.txt + Ec2_Api: + - elected: true + email: alexandrelevine@gmail.com + fullname: Alexandre Levine + ircname: alexandrelevine + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Ec2_Api/alexandrelevine.txt + Freezer: + - elected: false + email: deklan.dieterly@hpe.com + fullname: Deklan Dieterly + ircname: ddieterly + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Freezer/ddieterly.txt + - elected: true + email: pi3rra@root.gg + fullname: Pierre Mathieu + ircname: slashme + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Freezer/slashme.txt + Fuel: + - elected: true + email: ashtokolov@mirantis.com + fullname: Alexey Shtokolov + ircname: ashtokolov + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Fuel/ashtokolov.txt + Glance: + - elected: true + email: brian.rosmaita@rackspace.com + fullname: Brian Rosmaita + ircname: rosmaita + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Glance/rosmaita.txt + Heat: + - elected: true + email: ramishra@redhat.com + fullname: Rabi Mishra + ircname: ramishra + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Heat/ramishra.txt + Horizon: + - elected: true + email: r1chardj0n3s@gmail.com + fullname: Richard Jones + ircname: r1chardj0n3s + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Horizon/r1chardj0n3s.txt + I18n: + - elected: true + email: ianyrchoi@gmail.com + fullname: Ian Y. Choi + ircname: ianychoi + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/I18n/ianychoi.txt + Infrastructure: + - elected: true + email: fungi@yuggoth.org + fullname: Jeremy Stanley + ircname: fungi + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Infrastructure/fungi.txt + Ironic: + - elected: false + email: dtantsur@redhat.com + fullname: Dmitry Tantsur + ircname: dtantsur + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Ironic/dtantsur.txt + - elected: true + email: jim@jimrollenhagen.com + fullname: Jim Rollenhagen + ircname: jroll + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Ironic/jroll.txt + Karbor: + - elected: true + email: ficoos@gmail.com + fullname: Saggi Mizrahi + ircname: saggi + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Karbor/saggi.txt + Keystone: + - elected: false + email: samueldmq@gmail.com + fullname: Samuel de Medeiros Queiroz + ircname: samueldmq + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Keystone/samueldmq.txt + - elected: true + email: s.martinelli@gmail.com + fullname: Steve Martinelli + ircname: stevemar + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Keystone/stevemar.txt + Kolla: + - elected: false + email: zhang.lei.fly@gmail.com + fullname: Jeffrey Zhang + ircname: jeffrey4l + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Kolla/jeffrey4l.txt + - elected: true + email: inc007@gmail.com + fullname: Michal Jastrzebski + ircname: inc0 + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Kolla/inc0.txt + Kuryr: + - elected: true + email: antonisp@celebdor.com + fullname: Antoni Segura Puimedon + ircname: apuimedo + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Kuryr/apuimedo.txt + Magnum: + - elected: true + email: adrian.otto@rackspace.com + fullname: Adrian Otto + ircname: Adrian_Otto + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Magnum/Adrian_Otto.txt + - elected: false + email: hongbin.lu@huawei.com + fullname: Hongbin Lu + ircname: hongbin + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Magnum/hongbin.txt + Manila: + - elected: true + email: ben@swartzlander.org + fullname: Ben Swartzlander + ircname: bswartz + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Manila/bswartz.txt + Mistral: + - elected: true + email: renat.akhmerov@gmail.com + fullname: Renat Akhmerov + ircname: rakhmerov + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Mistral/rakhmerov.txt + Monasca: + - elected: true + email: roland.hochmuth@hp.com + fullname: Roland Hochmuth + ircname: rhochmuth + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Monasca/Roland_Hochmuth.txt + Murano: + - elected: true + email: k.zaitsev@me.com + fullname: Kirill Zaitsev + ircname: kzaitsev_mb + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Murano/kzaitsev_mb.txt + Neutron: + - elected: true + email: armamig@gmail.com + fullname: Armando Migliaccio + ircname: armax + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Neutron/armax.txt + Nova: + - elected: true + email: mriedem@us.ibm.com + fullname: Matt Riedemann + ircname: mriedem + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Nova/mriedem.txt + OpenStackAnsible: + - elected: true + email: andy.mccrae@gmail.com + fullname: Andy Mccrae + ircname: andymccr + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/OpenStackAnsible/andymccr.txt + OpenStackClient: + - elected: true + email: dtroyer@gmail.com + fullname: Dean Troyer + ircname: dtroyer + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/OpenStackClient/dtroyer.txt + OpenStackSalt: + - email: ales.komarek@tcpcloud.eu + fullname: Ales Komarek + ircname: cznewt + elected: INCUMBENT-PTL + OpenStack_Charms: + - elected: true + email: james.page@ubuntu.com + fullname: James Page + ircname: jamespage + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/OpenStack_Charms/jamespage.txt + OpenStack_UX: + - email: pkruithofjr@gmail.com + fullname: Piet Kruithof + ircname: Piet + elected: TC-APPOINTED + Oslo: + - elected: true + email: jxharlow@godaddy.com + fullname: Joshua Harlow + ircname: harlowja + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Oslo/harlowja.txt + Packaging_Deb: + - elected: true + email: zigo@debian.org + fullname: Thomas Goirand + ircname: zigo + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Packaging_Deb/zigo.txt + Packaging_Rpm: + - elected: true + email: hguemar@fedoraproject.org + fullname: "Ha\xEFkel Gu\xE9mar" + ircname: hguemar + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Packaging_Rpm/hguemar.txt + Puppet_OpenStack: + - elected: true + email: aschultz@redhat.com + fullname: Alex Schultz + ircname: mwhahaha + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Puppet_OpenStack/mwhahaha.txt + Quality_Assurance: + - elected: true + email: ken-oomichi@wx.jp.nec.com + fullname: Ken'ichi Ohmichi + ircname: oomichi + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Quality_Assurance/oomichi.txt + - elected: false + email: masayuki@igawa.me + fullname: Masayuki Igawa + ircname: masayukig + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Quality_Assurance/masayukig.txt + Rally: + - elected: true + email: akurilin@mirantis.com + fullname: Andrey Kurilin + ircname: andreykurilin + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Rally/andreykurilin.txt + RefStack: + - elected: true + email: cdiep@us.ibm.com + fullname: Catherine Diep + ircname: catherineD + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/RefStack/catherineD.txt + Release_Management: + - elected: true + email: doug@doughellmann.com + fullname: Doug Hellmann + ircname: dhellmann + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Release_Management/dhellmann.txt + Requirements: + - elected: true + email: tony@bakeyournoodle.com + fullname: Tony Breeds + ircname: tonyb + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Requirements/tonyb.txt + Sahara: + - elected: true + email: vgridnev@mirantis.com + fullname: Vitaly Gridnev + ircname: vgridnev + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Sahara/vgridnev.txt + Searchlight: + - elected: true + email: steven.j.mclellan@gmail.com + fullname: Steve Mclellan + ircname: sjmc7 + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Searchlight/sjmc7.txt + Security: + - email: hyakuhei@gmail.com + fullname: Robert Clark + ircname: hyakuhei + elected: TC-APPOINTED + Senlin: + - elected: true + email: yanyanhu@cn.ibm.com + fullname: Yanyan Hu + ircname: yanyanhu + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Senlin/yanyanhu.txt + Solum: + - elected: true + email: kulkarni.devdatta@gmail.com + fullname: Devdatta Kulkarni + ircname: devkulkarni + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Solum/devkulkarni.txt + Stable_Branch_Maintenance: + - elected: true + email: tony@bakeyournoodle.com + fullname: Tony Breeds + ircname: tonyb + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Stable_Branch_Maintenance/tonyb.txt + Swift: + - elected: true + email: me@not.mn + fullname: John Dickinson + ircname: notmyname + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Swift/notmyname.txt + Tacker: + - elected: true + email: srics.r@gmail.com + fullname: Sridhar Ramaswamy + ircname: sridhar_ram + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Tacker/sridhar_ram.txt + Telemetry: + - elected: true + email: julien@danjou.info + fullname: Julien Danjou + ircname: jd__ + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Telemetry/jd__.txt + Tripleo: + - elected: true + email: emilien@redhat.com + fullname: Emilien Macchi + ircname: emilienm + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Tripleo/emilienm.txt + Trove: + - elected: true + email: amrith@tesora.com + fullname: Amrith Kumar + ircname: amrith + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Trove/amrith.txt + Vitrage: + - elected: true + email: ifat.afek@nokia.com + fullname: Ifat Afek + ircname: ifat_afek + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Vitrage/ifat_afek.txt + Watcher: + - elected: true + email: antoine.cabot@b-com.com + fullname: Antoine Cabot + ircname: acabot + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Watcher/acabot.txt + Winstackers: + - elected: true + email: cbelu@cloudbasesolutions.com + fullname: Claudiu Belu + ircname: claudiub + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Winstackers/claudiub.txt + Zaqar: + - elected: true + email: flwang@catalyst.net.nz + fullname: Fei Long Wang + ircname: flwang + url: https://git.openstack.org/cgit/openstack/election/plain/candidates/ocata/Zaqar/flwang.txt +election: ocata +elections_results: + Freezer: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_662fe1dfea3b2980 + Ironic: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_5bbba65c5879783c + Keystone: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_f0432662b678f99f + Kolla: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_9fa13adc6f6e7148 + Magnum: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_2fd00175baa579a6 + Quality_Assurance: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_745c895dcf12c405 +projects: +- Astara +- Barbican +- Chef_OpenStack +- Cinder +- Cloudkitty +- Community_App_Catalog +- Congress +- Designate +- Documentation +- Dragonflow +- Ec2_Api +- Freezer +- Fuel +- Glance +- Heat +- Horizon +- I18n +- Infrastructure +- Ironic +- Karbor +- Keystone +- Kolla +- Kuryr +- Magnum +- Manila +- Mistral +- Monasca +- Murano +- Neutron +- Nova +- OpenStackAnsible +- OpenStackClient +- OpenStackSalt +- OpenStack_Charms +- OpenStack_UX +- Oslo +- Packaging_Deb +- Packaging_Rpm +- Puppet_OpenStack +- Quality_Assurance +- Rally +- RefStack +- Release_Management +- Requirements +- Sahara +- Searchlight +- Security +- Senlin +- Solum +- Stable_Branch_Maintenance +- Swift +- Tacker +- Telemetry +- Tripleo +- Trove +- Vitrage +- Watcher +- Winstackers +- Zaqar diff --git a/doc/source/ocata_ptl_candidates.rst b/doc/source/ocata_ptl_candidates.rst deleted file mode 100644 index 14e2e3e6..00000000 --- a/doc/source/ocata_ptl_candidates.rst +++ /dev/null @@ -1,240 +0,0 @@ -Ocata PTL Candidates -====================== -* Astara - - -* Barbican - - * `Dave Mccowan (dave-mccowan) `_ - -* Chef OpenStack - - * `Samuel Cassiba (sc\`) `_ - -* Cinder - - * `Sean McGinnis (smcginnis) `_ - -* Cloudkitty - - * `Christophe Sauthier (huats) `_ - -* Community App Catalog - - * `Christopher Aedo (docaedo) `_ - -* Congress - - * `Eric Kao (ekcs) `_ - -* Designate - - * `Graham Hayes (mugsie) `_ - -* Documentation - - * `Lana Brindley (loquacities) `_ - -* Dragonflow - - * `Omer Anson (oanson) `_ - -* Ec2 Api - - * `Alexandre Levine (alexandrelevine) `_ - -* Freezer - - * `Deklan Dieterly (ddieterly) `_ - * `Pierre Mathieu (slashme) `_ - -* Fuel - - * `Alexey Shtokolov (ashtokolov) `_ - -* Glance - - * `Brian Rosmaita (rosmaita) `_ - -* Heat - - * `Rabi Mishra (ramishra) `_ - -* Horizon - - * `Richard Jones (r1chardj0n3s) `_ - -* I18n - - * `Ian Y. Choi (ianychoi) `_ - -* Infrastructure - - * `Jeremy Stanley (fungi) `_ - -* Ironic - - * `Dmitry Tantsur (dtantsur) `_ - * `Jim Rollenhagen (jroll) `_ - -* Karbor - - * `Saggi Mizrahi (saggi) `_ - -* Keystone - - * `Samuel de Medeiros Queiroz (samueldmq) `_ - * `Steve Martinelli (stevemar) `_ - -* Kolla - - * `Jeffrey Zhang (jeffrey4l) `_ - * `Michal Jastrzebski (inc0) `_ - -* Kuryr - - * `Antoni Segura Puimedon (apuimedo) `_ - -* Magnum - - * `Adrian Otto (Adrian_Otto) `_ - * `Hongbin Lu (hongbin) `_ - -* Manila - - * `Ben Swartzlander (bswartz) `_ - -* Mistral - - * `Renat Akhmerov (rakhmerov) `_ - -* Monasca - - * `Roland Hochmuth (rhochmuth) `_ - -* Murano - - * `Kirill Zaitsev (kzaitsev_mb) `_ - -* Neutron - - * `Armando Migliaccio (armax) `_ - -* Nova - - * `Matt Riedemann (mriedem) `_ - -* OpenStackAnsible - - * `Andy Mccrae (andymccr) `_ - -* OpenStackClient - - * `Dean Troyer (dtroyer) `_ - -* OpenStackSalt - - -* OpenStack Charms - - * `James Page (jamespage) `_ - -* OpenStack UX - - -* Oslo - - * `Joshua Harlow (harlowja) `_ - -* Packaging Deb - - * `Thomas Goirand (zigo) `_ - -* Packaging Rpm - - * `Haïkel Guémar (hguemar) `_ - -* Puppet OpenStack - - * `Alex Schultz (mwhahaha) `_ - -* Quality Assurance - - * `Ken'ichi Ohmichi (oomichi) `_ - * `Masayuki Igawa (masayukig) `_ - -* Rally - - * `Andrey Kurilin (andreykurilin) `_ - -* RefStack - - * `Catherine Diep (catherineD) `_ - -* Release Management - - * `Doug Hellmann (dhellmann) `_ - -* Requirements - - * `Tony Breeds (tonyb) `_ - -* Sahara - - * `Vitaly Gridnev (vgridnev) `_ - -* Searchlight - - * `Steve Mclellan (sjmc7) `_ - -* Security - - -* Senlin - - * `Yanyan Hu (yanyanhu) `_ - -* Solum - - * `Devdatta Kulkarni (devkulkarni) `_ - -* Stable Branch Maintenance - - * `Tony Breeds (tonyb) `_ - -* Swift - - * `John Dickinson (notmyname) `_ - -* Tacker - - * `Sridhar Ramaswamy (sridhar_ram) `_ - -* Telemetry - - * `Julien Danjou (jd__) `_ - -* Tripleo - - * `Emilien Macchi (emilienm) `_ - -* Trove - - * `Amrith Kumar (amrith) `_ - -* Vitrage - - * `Ifat Afek (ifat_afek) `_ - -* Watcher - - * `Antoine Cabot (acabot) `_ - -* Winstackers - - * `Claudiu Belu (claudiub) `_ - -* Zaqar - - * `Fei Long Wang (flwang) `_ - diff --git a/doc/source/ocata_ptl_results.rst b/doc/source/ocata_ptl_results.rst deleted file mode 100644 index 70f6cab5..00000000 --- a/doc/source/ocata_ptl_results.rst +++ /dev/null @@ -1,251 +0,0 @@ -Ocata PTL -========= - -* Astara - - * Ryan Petrello [#IncumbentPTL]_ - -* Barbican - - * `Dave Mccowan (dave-mccowan) `_ - -* Chef OpenStack - - * `Samuel Cassiba (sc\`) `_ - -* Cinder - - * `Sean McGinnis (smcginnis) `_ - -* Cloudkitty - - * `Christophe Sauthier (huats) `_ - -* Community App Catalog - - * `Christopher Aedo (docaedo) `_ - -* Congress - - * `Eric Kao (ekcs) `_ - -* Designate - - * `Graham Hayes (mugsie) `_ - -* Documentation - - * `Lana Brindley (loquacities) `_ - -* Dragonflow - - * `Omer Anson (oanson) `_ - -* Ec2 Api - - * `Alexandre Levine (alexandrelevine) `_ - -* Freezer - - * `Pierre Mathieu (slashme) `_ - -* Fuel - - * `Alexey Shtokolov (ashtokolov) `_ - -* Glance - - * `Brian Rosmaita (rosmaita) `_ - -* Heat - - * `Rabi Mishra (ramishra) `_ - -* Horizon - - * `Richard Jones (r1chardj0n3s) `_ - -* I18n - - * `Ian Y. Choi (ianychoi) `_ - -* Infrastructure - - * `Jeremy Stanley (fungi) `_ - -* Ironic - - * `Jim Rollenhagen (jroll) `_ - -* Karbor - - * `Saggi Mizrahi (saggi) `_ - -* Keystone - - * `Steve Martinelli (stevemar) `_ - -* Kolla - - * `Michal Jastrzebski (inc0) `_ - -* Kuryr - - * `Antoni Segura Puimedon (apuimedo) `_ - -* Magnum - - * `Adrian Otto (Adrian_Otto) `_ - -* Manila - - * `Ben Swartzlander (bswartz) `_ - -* Mistral - - * `Renat Akhmerov (rakhmerov) `_ - -* Monasca - - * `Roland Hochmuth (rhochmuth) `_ - -* Murano - - * `Kirill Zaitsev (kzaitsev_mb) `_ - -* Neutron - - * `Armando Migliaccio (armax) `_ - -* Nova - - * `Matt Riedemann (mriedem) `_ - -* OpenStackAnsible - - * `Andy Mccrae (andymccr) `_ - -* OpenStackClient - - * `Dean Troyer (dtroyer) `_ - -* OpenStackSalt - - * Ales Komarek [#IncumbentPTL]_ - -* OpenStack Charms - - * `James Page (jamespage) `_ - -* OpenStack UX - - * Piet Kruithof [#TCAppointed]_ - -* Oslo - - * `Joshua Harlow (harlowja) `_ - -* Packaging Deb - - * `Thomas Goirand (zigo) `_ - -* Packaging Rpm - - * `Haïkel Guémar (hguemar) `_ - -* Puppet OpenStack - - * `Alex Schultz (mwhahaha) `_ - -* Quality Assurance - - * `Ken'ichi Ohmichi (oomichi) `_ - -* Rally - - * `Andrey Kurilin (andreykurilin) `_ - -* RefStack - - * `Catherine Diep (catherineD) `_ - -* Release Management - - * `Doug Hellmann (dhellmann) `_ - -* Requirements - - * `Tony Breeds (tonyb) `_ - -* Sahara - - * `Vitaly Gridnev (vgridnev) `_ - -* Searchlight - - * `Steve Mclellan (sjmc7) `_ - -* Security - - * Robert Clark [#TCAppointed]_ - -* Senlin - - * `Yanyan Hu (yanyanhu) `_ - -* Solum - - * `Devdatta Kulkarni (devkulkarni) `_ - -* Stable Branch Maintenance - - * `Tony Breeds (tonyb) `_ - -* Swift - - * `John Dickinson (notmyname) `_ - -* Tacker - - * `Sridhar Ramaswamy (sridhar_ram) `_ - -* Telemetry - - * `Julien Danjou (jd__) `_ - -* Tripleo - - * `Emilien Macchi (emilienm) `_ - -* Trove - - * `Amrith Kumar (amrith) `_ - -* Vitrage - - * `Ifat Afek (ifat_afek) `_ - -* Watcher - - * `Antoine Cabot (acabot) `_ - -* Winstackers - - * `Claudiu Belu (claudiub) `_ - -* Zaqar - - * `Fei Long Wang (flwang) `_ - -.. [#TCAppointed] By TC Appointment -.. [#IncumbentPTL] Incumbent PTL - -Elections results ------------------ - -* `Freezer `_ -* `Ironic `_ -* `Keystone `_ -* `Kolla `_ -* `Magnum `_ -* `Quality Assurance `_ diff --git a/openstack_election/cmds/close_election.py b/openstack_election/cmds/close_election.py new file mode 100755 index 00000000..12c336fe --- /dev/null +++ b/openstack_election/cmds/close_election.py @@ -0,0 +1,102 @@ +# 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. + +from __future__ import absolute_import +from __future__ import print_function +from __future__ import unicode_literals + +import argparse +import os +import yaml + +from openstack_election import utils + + +def check_elected_candidate(candidates): + for candidate in candidates: + if candidate.get('elected'): + return True + return False + + +def process(db, round): + dirty = False + + # Remove un-needed project + if round == 'tc' and len(db['projects']) != 1: + dirty = True + db['projects'] = ['TC'] + db['candidates'] = {'TC': db['candidates']['TC']} + if round == 'ptl' and 'TC' in db['projects']: + dirty = True + db['projects'].remove('TC') + del db['candidates']['TC'] + + # Check for missing and elected candidates + for project in db['projects']: + candidates = db['candidates'][project] + if len(candidates) == 0: + print("[W] Appoints candidate for %s" % project) + candidates.append({ + 'ircname': 'INSERT_IRCNAME', + 'email': 'INSERT_EMAIL', + 'fullname': 'INSERT_FULLNAME', + 'elected': 'TC-APPOINTED_OR_INCUMBENT-PTL', + }) + dirty = True + elif len(candidates) > 1: + if not check_elected_candidate(candidates): + print("[W] Set elected attribute for winner of %s" % project) + for candidate in candidates: + candidate['elected'] = False + dirty = True + if project not in db.setdefault('elections_results', {}): + print("[W] Set election id for %s" % project) + db['elections_results'][project] = 'INSERT-RESULT-LINK' + dirty = True + elif not candidates[0].get('elected'): + candidates[0]['elected'] = True + dirty = True + return dirty + + +def main(): + desc = 'Generate or update an election archive for site rendering' + parser = argparse.ArgumentParser(description=desc) + parser.add_argument('-v', '--verbose', action="count", default=0, + help='Increase program verbosity') + parser.add_argument('-r', '--release', default=utils.SERIES_NAME, + help='Which nominations to look at') + parser.add_argument('-b', '--basedir', + default=os.getcwd(), + help='Path to git clone of openstack/election') + parser.add_argument('round', choices=('ptl', 'tc')) + + args = parser.parse_args() + + args.outputdir = os.path.join(args.basedir, 'doc', 'source', args.release) + args.outputdir = os.path.expanduser(args.outputdir) + + if not os.path.isdir(args.outputdir): + os.mkdir(args.outputdir, 0755) + + db_file = os.path.join(args.outputdir, "%s.yaml" % args.round) + + if os.path.isfile(db_file): + print("[+] Reloading candidate list %s" % db_file) + db = yaml.safe_load(open(db_file)) + else: + db = utils.build_candidates_list(args.release) + + if process(db, args.round): + open(db_file, "w").write(yaml.safe_dump(db, default_flow_style=False)) + print("[W] Proceed to manual update of %s" % db_file) diff --git a/openstack_election/utils.py b/openstack_election/utils.py index 0c7b6655..21ffbf8e 100644 --- a/openstack_election/utils.py +++ b/openstack_election/utils.py @@ -43,6 +43,8 @@ CGIT_URL = 'https://git.openstack.org/cgit' PROJECTS_URL = ('%s/openstack/governance/plain/reference/projects.yaml' % (CGIT_URL)) +PAST_ELECTIONS = ['ocata'] + conf = yaml.load(open('configuration.yaml')) exceptions = None diff --git a/setup.cfg b/setup.cfg index 71c0bc51..73562ee7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -24,6 +24,8 @@ console_scripts = check-candidacy = openstack_election.cmds.check_candidacy:main check-candidacy-manual = openstack_election.cmds.check_manual:main render-statistics = openstack_election.cmds.render_statistics:main + update-governance = openstack_election.cmds.update_governance:main + close-election = openstack_election.cmds.close_election:main [build_sphinx] all_files = 1