Yuvipanda has uploaded a new change for review. https://gerrit.wikimedia.org/r/303954
Change subject: labspuppetbackend: Switch from json to yaml ...................................................................... labspuppetbackend: Switch from json to yaml Since we're using YAML to be human editable, use YAML everywhere. This also preserves comments in the YAML for hiera (not for roles, however) Change-Id: Ic982435672957646237fe9f850fe1176398b6ed3 --- M modules/labspuppetbackend/files/labspuppetbackend.py 1 file changed, 58 insertions(+), 24 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/operations/puppet refs/changes/54/303954/1 diff --git a/modules/labspuppetbackend/files/labspuppetbackend.py b/modules/labspuppetbackend/files/labspuppetbackend.py index 6e63ed0..8fb3677 100644 --- a/modules/labspuppetbackend/files/labspuppetbackend.py +++ b/modules/labspuppetbackend/files/labspuppetbackend.py @@ -2,7 +2,7 @@ from statsd.defaults.env import statsd import pymysql import os -import json +import yaml app = Flask(__name__) # Propogate exceptions to the uwsgi log @@ -39,14 +39,14 @@ roles = [r[0] for r in cur.fetchall()] if len(roles) == 0: return Response( - json.dumps({'status': 'notfound'}), + yaml.dump({'status': 'notfound'}), status=404, - mimetype='application/json' + mimetype='application/x-yaml' ) return Response( - json.dumps({'roles': roles}), + yaml.dump({'roles': roles}), status=200, - mimetype='application/json' + mimetype='application/x-yaml' ) finally: cur.close() @@ -55,9 +55,26 @@ @statsd.timer('set_roles') @app.route('/v1/<string:project>/prefix/<string:prefix>/roles', methods=['POST']) def set_roles(project, prefix): - roles = request.get_json() + try: + roles = yaml.safe_load(request.data) + except yaml.YAMLError: + return Response( + yaml.dump({ + 'status': 'fail', + 'message': 'Unable to parse input provided as YAML' + }), + status=400, + mimetype='application/x-yaml' + ) if type(roles) is not list: - return "Body should be a JSON array of roles to set", 400 + return Response( + yaml.dump({ + 'status': 'fail', + 'message': 'Provided YAML should be a list' + }), + status=400, + mimetype='application/x-yaml' + ) # TODO: Add more validation for roles? cur = g.db.cursor() try: @@ -83,9 +100,9 @@ finally: cur.close() return Response( - json.dumps({'status': 'ok'}), + yaml.dump({'status': 'ok'}), status=200, - mimetype='application/json' + mimetype='application/x-yaml' ) @@ -102,14 +119,14 @@ row = cur.fetchone() if row is None: return Response( - json.dumps({'status': 'notfound'}), + yaml.dump({'status': 'notfound'}), status=404, - mimetype='application/json' + mimetype='application/x-yaml' ) return Response( - json.dumps({'hiera': row[0]}), + yaml.dump({'hiera': row[0]}), status=200, - mimetype='application/json' + mimetype='application/x-yaml' ) finally: cur.close() @@ -118,9 +135,26 @@ @statsd.timer('set_hiera') @app.route('/v1/<string:project>/prefix/<string:prefix>/hiera', methods=['POST']) def set_hiera(project, prefix): - hiera = request.get_json() + try: + hiera = yaml.safe_load(request.data) + except yaml.YAMLError: + return Response( + yaml.dump({ + 'status': 'fail', + 'message': 'Unable to parse input provided as YAML' + }), + status=400, + mimetype='application/x-yaml' + ) if type(hiera) is not dict: - return "Body should be a JSON dict of hiera to set", 400 + return Response( + yaml.dump({ + 'status': 'fail', + 'message': 'Provided YAML should be a dictionary' + }), + status=400, + mimetype='application/x-yaml' + ) # TODO: Add more validation for hiera? cur = g.db.cursor() try: @@ -141,9 +175,9 @@ finally: cur.close() return Response( - json.dumps({'status': 'ok'}), + yaml.safe_dump({'status': 'ok'}), status=200, - mimetype='application/json' + mimetype='application/x-yaml' ) @@ -179,13 +213,13 @@ """, (project, fqdn)) hiera = {} for row in cur.fetchall(): - hiera.update(json.loads(row[1])) + hiera.update(yaml.loads(row[1])) finally: cur.close() return Response( - json.dumps({'roles': roles, 'hiera': hiera}), + yaml.safe_dump({'roles': roles, 'hiera': hiera}), status=200, - mimetype='application/json' + mimetype='application/x-yaml' ) @@ -198,9 +232,9 @@ SELECT prefix FROM prefix WHERE project = %s """, (project, )) return Response( - json.dumps({'prefixes': [r[0] for r in cur.fetchall()]}), + yaml.safe_dump({'prefixes': [r[0] for r in cur.fetchall()]}), status=200, - mimetype='application/json' + mimetype='application/x-yaml' ) finally: cur.close() @@ -219,9 +253,9 @@ """) cur.fetchall() return Response( - json.dumps({'status': 'ok'}), + yaml.safe_dump({'status': 'ok'}), status=200, - mimetype='application/json' + mimetype='application/x-yaml' ) finally: cur.close() -- To view, visit https://gerrit.wikimedia.org/r/303954 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ic982435672957646237fe9f850fe1176398b6ed3 Gerrit-PatchSet: 1 Gerrit-Project: operations/puppet Gerrit-Branch: production Gerrit-Owner: Yuvipanda <yuvipa...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits