pysteve/cli/load_election.py (64 lines of code) (raw):

#!/usr/bin/env python3 # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You 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. # # # Load/create an election with a set of issues specified in a .yaml file # ### NOTE: # relies on using .netrc for user/pass. Cuz not gonna bother doing better. # import sys import logging import yaml # pip install PyYAML import requests # pip install requests import easydict LOGGER = logging.getLogger(__name__) def main(y_fname): cfg = easydict.EasyDict(yaml.safe_load(open(y_fname))) s = requests.Session() eid = cfg.election.eid LOGGER.info(f'ELECTION: {eid}') issues = ensure_election(s, cfg) # Remove all the issues, so we can load the new/current set. for issue in issues: iid = issue['id'] print(f'DELETING: {iid}') r = s.get(f'{cfg.config.endpoint}/delete/{eid}/{iid}') if r.status_code != 200: # Something is wrong. LOGGER.error(f'UNKNOWN: {r.status_code}') LOGGER.debug(f'BODY: {r.text}') raise Exception # Load all the defined issues. for idx, issue in enumerate(cfg['issues']): iid = f'issue-{idx}' print(f'CREATING: {iid}: {issue}') payload = { 'title': issue['title'], 'description': issue['description'], 'type': issue['type'], ### not needed for YNA. fix as needed #'candidates': [ ], } r = s.post(f'{cfg.config.endpoint}/create/{eid}/{iid}', data=payload) if r.status_code != 201: # Something is wrong. LOGGER.error(f'UNKNOWN: {r.status_code}') LOGGER.debug(f'BODY: {r.text}') raise Exception LOGGER.debug(r.json()) def ensure_election(s, cfg): eid = cfg.election.eid r = s.get(f'{cfg.config.endpoint}/view/{eid}') LOGGER.debug(f'HEADERS: {r.request.headers}') if r.status_code == 200: # The election has already been created, so return its issues. j = r.json() LOGGER.debug(f'BODY: {j}') return j['issues'] if r.status_code != 404: # Something is wrong. LOGGER.error(f'UNKNOWN: {r.status_code}') LOGGER.debug(f'BODY: {r.text}') raise Exception # Got a 404 saying the election doesn't exist. So create it. payload = { 'title': cfg.election.title, 'owner': cfg.config.user, 'monitors': ','.join(cfg.election.monitors), ### Below are optional. Skip for now. #'starts': d, #'ends': e, #'open': f } ### use a PreparedRequest so we can debug the URL used url = f'{cfg.config.endpoint}/setup/{eid}' #req = requests.Request('POST', url, data=payload) #prepped = req.prepare() #LOGGER.debug(f'HEADERS: {prepped.headers}') r = s.post(url, data=payload) LOGGER.debug(f'HEADERS: {r.request.headers}') if r.status_code != 201: # Something is wrong. LOGGER.error(f'UNKNOWN: {r.status_code}') LOGGER.debug(f'BODY: {r.text}') raise Exception LOGGER.debug(r.json()) # We created a new election. It has no issues. return [ ] if __name__ == '__main__': ### TODO: fancy arg parsing logging.basicConfig(level=logging.DEBUG) main(sys.argv[1])