)]}'
{"README.md":[{"author":{"_account_id":30561,"name":"Peter Matulis","email":"peter.matulis@canonical.com","username":"pmatulis"},"change_message_id":"a8786da14b381c56a4e6a487afe23ef6a9fe8f59","unresolved":true,"context_lines":[{"line_number":247,"context_line":"* `start`"},{"line_number":248,"context_line":"* `stop`"},{"line_number":249,"context_line":"* `zap-disk`"},{"line_number":250,"context_line":"* `get-availibility-zone`"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"## Working with OSDs"},{"line_number":253,"context_line":""}],"source_content_type":"text/x-gfm","patch_set":6,"id":"aa92839e_3c33e45b","line":250,"updated":"2021-06-08 17:06:00.000000000","message":"Can we put this in alphabetical order?","commit_id":"e917f8ddd798cf7443bddd5e868947a91d718d92"},{"author":{"_account_id":31289,"name":"Aurelien Lourot","email":"aurelien.lourot@gmail.com","username":"lourot"},"change_message_id":"00245f27609e550ab84ea9f70a7cb51faa988ae9","unresolved":true,"context_lines":[{"line_number":247,"context_line":"* `start`"},{"line_number":248,"context_line":"* `stop`"},{"line_number":249,"context_line":"* `zap-disk`"},{"line_number":250,"context_line":"* `get-availibility-zone`"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"## Working with OSDs"},{"line_number":253,"context_line":""}],"source_content_type":"text/x-gfm","patch_set":7,"id":"ec4a2e09_b872f846","line":250,"updated":"2021-08-31 12:09:29.000000000","message":"Unaddressed comment from Peter Matulis:\n\n    Can we put this in alphabetical order?","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":32363,"name":"Robert Gildein","email":"robert.gildein@canonical.com","username":"rgildein"},"change_message_id":"865906d09dd0aca87357604d6290ef67f6a33e65","unresolved":false,"context_lines":[{"line_number":247,"context_line":"* `start`"},{"line_number":248,"context_line":"* `stop`"},{"line_number":249,"context_line":"* `zap-disk`"},{"line_number":250,"context_line":"* `get-availibility-zone`"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"## Working with OSDs"},{"line_number":253,"context_line":""}],"source_content_type":"text/x-gfm","patch_set":7,"id":"acfeaa0c_3a0a072d","line":250,"in_reply_to":"ec4a2e09_b872f846","updated":"2021-08-31 15:11:38.000000000","message":"Ack","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"}],"actions/get_availability_zone.py":[{"author":{"_account_id":20634,"name":"Chris MacNaughton","email":"chris.macnaughton@canonical.com","username":"Chris.MacNaughton"},"change_message_id":"7a4d46f9e6886cd7611423051a4d520b9df158d7","unresolved":true,"context_lines":[{"line_number":95,"context_line":"            hookenv.function_fail(\"Availability zone information not found.\")"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        hookenv.function_set("},{"line_number":98,"context_line":"            {\"availability-zone\": json.dumps(availability_zone)})"},{"line_number":99,"context_line":"    except Exception as error:"},{"line_number":100,"context_line":"        hookenv.function_fail(\"Action failed: {}\".format(str(error)))"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"79875102_b93b802c","line":98,"updated":"2021-06-08 07:03:28.000000000","message":"This should take a format argument and be able to return JSON formatted data _or_ human readable data","commit_id":"e7d6429a0107f4c225e73d81883850ab4b87cd30"},{"author":{"_account_id":32363,"name":"Robert Gildein","email":"robert.gildein@canonical.com","username":"rgildein"},"change_message_id":"56fdd57ed0c4eb10b6160d03f4b5e1425800970a","unresolved":true,"context_lines":[{"line_number":95,"context_line":"            hookenv.function_fail(\"Availability zone information not found.\")"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        hookenv.function_set("},{"line_number":98,"context_line":"            {\"availability-zone\": json.dumps(availability_zone)})"},{"line_number":99,"context_line":"    except Exception as error:"},{"line_number":100,"context_line":"        hookenv.function_fail(\"Action failed: {}\".format(str(error)))"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"667d0c6d_5f487e92","line":98,"in_reply_to":"79875102_b93b802c","updated":"2021-06-08 16:44:12.000000000","message":"I used same approach as i did in other charms. I used the `format` parameter with the default value \"text\" (json dump w/ indent) and optional value \"json\".","commit_id":"e7d6429a0107f4c225e73d81883850ab4b87cd30"},{"author":{"_account_id":8992,"name":"Billy Olsen","email":"billy.olsen@canonical.com","username":"billy-olsen"},"change_message_id":"8761afa950f458898d8d7e56feff4aeb5a320048","unresolved":true,"context_lines":[{"line_number":90,"context_line":"def main():"},{"line_number":91,"context_line":"    try:"},{"line_number":92,"context_line":"        show_all \u003d hookenv.function_get(\"show-all\")"},{"line_number":93,"context_line":"        indent \u003d 2 if hookenv.function_get(\"format\") \u003d\u003d \"text\" else None"},{"line_number":94,"context_line":"        availability_zone \u003d get_availability_zone(show_all)"},{"line_number":95,"context_line":"        if not availability_zone[\"unit\"]:"},{"line_number":96,"context_line":"            hookenv.function_fail(\"Availability zone information not found.\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"bae7640d_3a294c34","line":93,"updated":"2021-06-09 03:25:12.000000000","message":"I know you state that this is inline with other charms, but I would argue that json isn\u0027t really human friendly. It\u0027s *more* user friendly in this case, but throwing an indentation level in is hardly making it user friendly.\n\nIn a recent meeting, I was one of the members who raised the issue about human formatting vs machine formatting and we should favor a readable and consistent human-friendly formatted output for the information provided (table maybe?) and a consistent machine formatted output (json is fine).","commit_id":"e917f8ddd798cf7443bddd5e868947a91d718d92"},{"author":{"_account_id":32363,"name":"Robert Gildein","email":"robert.gildein@canonical.com","username":"rgildein"},"change_message_id":"17d74a07144163d6185d174c54b7b7dd6f50f1fe","unresolved":true,"context_lines":[{"line_number":90,"context_line":"def main():"},{"line_number":91,"context_line":"    try:"},{"line_number":92,"context_line":"        show_all \u003d hookenv.function_get(\"show-all\")"},{"line_number":93,"context_line":"        indent \u003d 2 if hookenv.function_get(\"format\") \u003d\u003d \"text\" else None"},{"line_number":94,"context_line":"        availability_zone \u003d get_availability_zone(show_all)"},{"line_number":95,"context_line":"        if not availability_zone[\"unit\"]:"},{"line_number":96,"context_line":"            hookenv.function_fail(\"Availability zone information not found.\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"da33db8f_04bd8c86","line":93,"in_reply_to":"bae7640d_3a294c34","updated":"2021-06-11 08:55:21.000000000","message":"Okay, I see your point and I agree. I played around a bit and created an output [1] or without dropping empty columns [2]. What do you think?\n\nI think that the output-creating function like the one I mentioned (or other) should be a part of charmhelpers and at the same time some standard format of action outputs should be defined. e.g. using the `--format` parameter, which should have at least the following options \"text\" (human readable) and \"json \".\n\n---\n[1]: https://pastebin.ubuntu.com/p/vvjT8bjHMd/\n[2]: https://pastebin.ubuntu.com/p/XSBTJK6Wg9/","commit_id":"e917f8ddd798cf7443bddd5e868947a91d718d92"},{"author":{"_account_id":31289,"name":"Aurelien Lourot","email":"aurelien.lourot@gmail.com","username":"lourot"},"change_message_id":"9585c56809aa086630f6b80d9cbdc9998065a2b0","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    :returns: table"},{"line_number":68,"context_line":"    :rtype: str"},{"line_number":69,"context_line":"    \"\"\""},{"line_number":70,"context_line":"    # get columns size from values"},{"line_number":71,"context_line":"    style \u003d [(column, max([len(str(row.get(column, \"\"))) for row in data]))"},{"line_number":72,"context_line":"             for column in columns]"},{"line_number":73,"context_line":"    if drop_empty:"}],"source_content_type":"text/x-python","patch_set":7,"id":"41d8517b_79c9380c","line":70,"updated":"2021-08-30 15:28:09.000000000","message":"Are we reinventing https://pypi.org/project/tabulate/ ?","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":32363,"name":"Robert Gildein","email":"robert.gildein@canonical.com","username":"rgildein"},"change_message_id":"865906d09dd0aca87357604d6290ef67f6a33e65","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    :returns: table"},{"line_number":68,"context_line":"    :rtype: str"},{"line_number":69,"context_line":"    \"\"\""},{"line_number":70,"context_line":"    # get columns size from values"},{"line_number":71,"context_line":"    style \u003d [(column, max([len(str(row.get(column, \"\"))) for row in data]))"},{"line_number":72,"context_line":"             for column in columns]"},{"line_number":73,"context_line":"    if drop_empty:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ae25b7c2_c1bf8117","line":70,"in_reply_to":"41d8517b_79c9380c","updated":"2021-08-31 15:11:38.000000000","message":"It\u0027s ok to use this 3-th party packages?  I wasn\u0027t sure if it was okay, if so I would be more than happy to use it.","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":31289,"name":"Aurelien Lourot","email":"aurelien.lourot@gmail.com","username":"lourot"},"change_message_id":"00245f27609e550ab84ea9f70a7cb51faa988ae9","unresolved":true,"context_lines":[{"line_number":84,"context_line":"    return os.linesep.join([sep, header, sep, *rows, sep])"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"def _get_human_readable(availability_zones):"},{"line_number":88,"context_line":"    \"\"\"Get human readable table format."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    :param availability_zones: information about the availability zone"}],"source_content_type":"text/x-python","patch_set":7,"id":"14603c11_8407d486","line":87,"updated":"2021-08-31 12:09:29.000000000","message":"this is hard to follow because here it is called `availability_zones` plural but actually when calling this function we pass the output of `get_availability_zone()` singular, so I\u0027m a bit lost. Does the argument contain one or more availability zones? Please align plural/singular across the entire script, thanks!","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":32363,"name":"Robert Gildein","email":"robert.gildein@canonical.com","username":"rgildein"},"change_message_id":"865906d09dd0aca87357604d6290ef67f6a33e65","unresolved":true,"context_lines":[{"line_number":84,"context_line":"    return os.linesep.join([sep, header, sep, *rows, sep])"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"def _get_human_readable(availability_zones):"},{"line_number":88,"context_line":"    \"\"\"Get human readable table format."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    :param availability_zones: information about the availability zone"}],"source_content_type":"text/x-python","patch_set":7,"id":"a6643f85_7071df8b","line":87,"in_reply_to":"14603c11_8407d486","updated":"2021-08-31 15:11:38.000000000","message":"Contains multiple AZs, but per unit. I think the best way would be to stick to the plural.","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":31289,"name":"Aurelien Lourot","email":"aurelien.lourot@gmail.com","username":"lourot"},"change_message_id":"00245f27609e550ab84ea9f70a7cb51faa988ae9","unresolved":true,"context_lines":[{"line_number":87,"context_line":"def _get_human_readable(availability_zones):"},{"line_number":88,"context_line":"    \"\"\"Get human readable table format."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    :param availability_zones: information about the availability zone"},{"line_number":91,"context_line":"    :type availability_zones: Dict[str, Dict[str, str]]"},{"line_number":92,"context_line":"    :returns: formatted data as table"},{"line_number":93,"context_line":"    :rtype: str"}],"source_content_type":"text/x-python","patch_set":7,"id":"57b23283_621967e6","line":90,"updated":"2021-08-31 12:09:29.000000000","message":"here also one can see how we use singular in order to describe a plural argument. This makes reasoning about things difficult. I believe this should be plural everywhere since the structure can contain the availability zone of all units, hence several availability zones","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":32363,"name":"Robert Gildein","email":"robert.gildein@canonical.com","username":"rgildein"},"change_message_id":"865906d09dd0aca87357604d6290ef67f6a33e65","unresolved":false,"context_lines":[{"line_number":87,"context_line":"def _get_human_readable(availability_zones):"},{"line_number":88,"context_line":"    \"\"\"Get human readable table format."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    :param availability_zones: information about the availability zone"},{"line_number":91,"context_line":"    :type availability_zones: Dict[str, Dict[str, str]]"},{"line_number":92,"context_line":"    :returns: formatted data as table"},{"line_number":93,"context_line":"    :rtype: str"}],"source_content_type":"text/x-python","patch_set":7,"id":"ac9eff74_5cefecd7","line":90,"in_reply_to":"57b23283_621967e6","updated":"2021-08-31 15:11:38.000000000","message":"Ack","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":31289,"name":"Aurelien Lourot","email":"aurelien.lourot@gmail.com","username":"lourot"},"change_message_id":"00245f27609e550ab84ea9f70a7cb51faa988ae9","unresolved":true,"context_lines":[{"line_number":104,"context_line":"    :param crush_location: CrushLocation from function get_osd_tree"},{"line_number":105,"context_line":"    :type crush_location: charms_ceph.utils.CrushLocation"},{"line_number":106,"context_line":"    :returns: dictionary contains the Crush Map hierarchy"},{"line_number":107,"context_line":"              the keys are in order according to the defined Ceph Map"},{"line_number":108,"context_line":"              Hierarchy types"},{"line_number":109,"context_line":"    :rtype: Dict[str, str]"},{"line_number":110,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"500f5376_43f91831","line":107,"updated":"2021-08-31 12:09:29.000000000","message":"I don\u0027t think the \"keys are in order\" because this isn\u0027t a sorted dict. Or do you mean something else?\n\nI believe sorting happens somewhere else in this program, namely _get_human_readable_table(..., columns, ...) where column is a sorted list","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":32363,"name":"Robert Gildein","email":"robert.gildein@canonical.com","username":"rgildein"},"change_message_id":"865906d09dd0aca87357604d6290ef67f6a33e65","unresolved":true,"context_lines":[{"line_number":104,"context_line":"    :param crush_location: CrushLocation from function get_osd_tree"},{"line_number":105,"context_line":"    :type crush_location: charms_ceph.utils.CrushLocation"},{"line_number":106,"context_line":"    :returns: dictionary contains the Crush Map hierarchy"},{"line_number":107,"context_line":"              the keys are in order according to the defined Ceph Map"},{"line_number":108,"context_line":"              Hierarchy types"},{"line_number":109,"context_line":"    :rtype: Dict[str, str]"},{"line_number":110,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"8327903b_eb81df6f","line":107,"in_reply_to":"500f5376_43f91831","updated":"2021-08-31 15:11:38.000000000","message":"Yes, this is only dictionary with keys.\n```\n:returns: dictionary contains the Crush Map hierarchy, where\n          the keys are according to the defined types of the\n          Ceph Map Hierarchy \n```","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":31289,"name":"Aurelien Lourot","email":"aurelien.lourot@gmail.com","username":"lourot"},"change_message_id":"9585c56809aa086630f6b80d9cbdc9998065a2b0","unresolved":true,"context_lines":[{"line_number":119,"context_line":"    \"\"\"Get information about the availability zone."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    Returns dictionary contains the unit as the current unit and other_units"},{"line_number":122,"context_line":"    (if the action was executed with the parameter show-other) that provide"},{"line_number":123,"context_line":"    information about other units."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    :param show_all: define whether the result should contain AZ information"}],"source_content_type":"text/x-python","patch_set":7,"id":"a4b2e410_77cab729","line":122,"updated":"2021-08-30 15:28:09.000000000","message":"s/show-other/show-all/","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":31289,"name":"Aurelien Lourot","email":"aurelien.lourot@gmail.com","username":"lourot"},"change_message_id":"9f72cf9144298595481c1c8da56cd5f9ce6ec43c","unresolved":true,"context_lines":[{"line_number":119,"context_line":"    \"\"\"Get information about the availability zone."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    Returns dictionary contains the unit as the current unit and other_units"},{"line_number":122,"context_line":"    (if the action was executed with the parameter show-other) that provide"},{"line_number":123,"context_line":"    information about other units."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    :param show_all: define whether the result should contain AZ information"}],"source_content_type":"text/x-python","patch_set":7,"id":"72663c30_4e26ac3c","line":122,"in_reply_to":"4ea9e66e_fc77acab","updated":"2021-09-02 13:13:11.000000000","message":"Sorry I meant: please change\n\n    if the action was executed with the parameter show-other\n\nto\n\n    if the action was executed with the parameter show-all","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":32363,"name":"Robert Gildein","email":"robert.gildein@canonical.com","username":"rgildein"},"change_message_id":"54011c53bdc6f11bce387db1cacda7b2298aee8b","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    \"\"\"Get information about the availability zone."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    Returns dictionary contains the unit as the current unit and other_units"},{"line_number":122,"context_line":"    (if the action was executed with the parameter show-other) that provide"},{"line_number":123,"context_line":"    information about other units."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    :param show_all: define whether the result should contain AZ information"}],"source_content_type":"text/x-python","patch_set":7,"id":"f02afb6f_bd399de9","line":122,"in_reply_to":"72663c30_4e26ac3c","updated":"2021-09-02 15:13:36.000000000","message":"Done","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":32363,"name":"Robert Gildein","email":"robert.gildein@canonical.com","username":"rgildein"},"change_message_id":"865906d09dd0aca87357604d6290ef67f6a33e65","unresolved":true,"context_lines":[{"line_number":119,"context_line":"    \"\"\"Get information about the availability zone."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    Returns dictionary contains the unit as the current unit and other_units"},{"line_number":122,"context_line":"    (if the action was executed with the parameter show-other) that provide"},{"line_number":123,"context_line":"    information about other units."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    :param show_all: define whether the result should contain AZ information"}],"source_content_type":"text/x-python","patch_set":7,"id":"4ea9e66e_fc77acab","line":122,"in_reply_to":"a4b2e410_77cab729","updated":"2021-08-31 15:11:38.000000000","message":"The `results[\"all-units\"]` contain all units, not only other units. I prefer to leave it as it\u0027s.","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":31289,"name":"Aurelien Lourot","email":"aurelien.lourot@gmail.com","username":"lourot"},"change_message_id":"9585c56809aa086630f6b80d9cbdc9998065a2b0","unresolved":true,"context_lines":[{"line_number":152,"context_line":"        human_readable \u003d hookenv.action_get(\"format\") \u003d\u003d \"text\""},{"line_number":153,"context_line":"        availability_zone \u003d get_availability_zone(show_all)"},{"line_number":154,"context_line":"        if not availability_zone[\"unit\"]:"},{"line_number":155,"context_line":"            hookenv.action_fail(\"Availability zone information not found.\")"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        formatter \u003d _get_human_readable if human_readable else json.dumps"},{"line_number":158,"context_line":"        hookenv.action_set("}],"source_content_type":"text/x-python","patch_set":7,"id":"28cd5b34_1d4bc7cd","line":155,"updated":"2021-08-30 15:28:09.000000000","message":"Actually, I could imagine a case where hostnames are broken and so `all-units` has been populated but `unit` hasn\u0027t been. Wouldn\u0027t it then still be interesting to succeed and return the result?","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":32363,"name":"Robert Gildein","email":"robert.gildein@canonical.com","username":"rgildein"},"change_message_id":"865906d09dd0aca87357604d6290ef67f6a33e65","unresolved":true,"context_lines":[{"line_number":152,"context_line":"        human_readable \u003d hookenv.action_get(\"format\") \u003d\u003d \"text\""},{"line_number":153,"context_line":"        availability_zone \u003d get_availability_zone(show_all)"},{"line_number":154,"context_line":"        if not availability_zone[\"unit\"]:"},{"line_number":155,"context_line":"            hookenv.action_fail(\"Availability zone information not found.\")"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        formatter \u003d _get_human_readable if human_readable else json.dumps"},{"line_number":158,"context_line":"        hookenv.action_set("}],"source_content_type":"text/x-python","patch_set":7,"id":"4c1d02d3_aa3fef9b","line":155,"in_reply_to":"28cd5b34_1d4bc7cd","updated":"2021-08-31 15:11:38.000000000","message":"That\u0027s good point, I\u0027ll replaced it with `hookenv.log(\"Availability zone information not found.\", hookenv.DEBUG)`.","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":32363,"name":"Robert Gildein","email":"robert.gildein@canonical.com","username":"rgildein"},"change_message_id":"54011c53bdc6f11bce387db1cacda7b2298aee8b","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        human_readable \u003d hookenv.action_get(\"format\") \u003d\u003d \"text\""},{"line_number":153,"context_line":"        availability_zone \u003d get_availability_zone(show_all)"},{"line_number":154,"context_line":"        if not availability_zone[\"unit\"]:"},{"line_number":155,"context_line":"            hookenv.action_fail(\"Availability zone information not found.\")"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        formatter \u003d _get_human_readable if human_readable else json.dumps"},{"line_number":158,"context_line":"        hookenv.action_set("}],"source_content_type":"text/x-python","patch_set":7,"id":"8570c59b_2dc776fa","line":155,"in_reply_to":"4c1d02d3_aa3fef9b","updated":"2021-09-02 15:13:36.000000000","message":"Done","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":31289,"name":"Aurelien Lourot","email":"aurelien.lourot@gmail.com","username":"lourot"},"change_message_id":"9f72cf9144298595481c1c8da56cd5f9ce6ec43c","unresolved":true,"context_lines":[{"line_number":112,"context_line":"        human_readable \u003d hookenv.action_get(\"format\") \u003d\u003d \"text\""},{"line_number":113,"context_line":"        availability_zones \u003d get_availability_zones(show_all)"},{"line_number":114,"context_line":"        if not availability_zones[\"unit\"]:"},{"line_number":115,"context_line":"            hookenv.log(\"Availability zone information not found.\","},{"line_number":116,"context_line":"                        hookenv.DEBUG)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        formatter \u003d _get_human_readable if human_readable else json.dumps"}],"source_content_type":"text/x-python","patch_set":11,"id":"337ae359_60d01ada","line":115,"updated":"2021-09-02 13:13:11.000000000","message":"I would be more specific here. What about \"Availability zone information for current unit not found.\"?","commit_id":"1e2e20f98f77bc109eec68620c8bcb8f102401b4"},{"author":{"_account_id":32363,"name":"Robert Gildein","email":"robert.gildein@canonical.com","username":"rgildein"},"change_message_id":"54011c53bdc6f11bce387db1cacda7b2298aee8b","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        human_readable \u003d hookenv.action_get(\"format\") \u003d\u003d \"text\""},{"line_number":113,"context_line":"        availability_zones \u003d get_availability_zones(show_all)"},{"line_number":114,"context_line":"        if not availability_zones[\"unit\"]:"},{"line_number":115,"context_line":"            hookenv.log(\"Availability zone information not found.\","},{"line_number":116,"context_line":"                        hookenv.DEBUG)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        formatter \u003d _get_human_readable if human_readable else json.dumps"}],"source_content_type":"text/x-python","patch_set":11,"id":"d1f179ec_6695fd36","line":115,"in_reply_to":"337ae359_60d01ada","updated":"2021-09-02 15:13:36.000000000","message":"Done","commit_id":"1e2e20f98f77bc109eec68620c8bcb8f102401b4"}],"lib/charms_ceph/utils.py":[{"author":{"_account_id":31289,"name":"Aurelien Lourot","email":"aurelien.lourot@gmail.com","username":"lourot"},"change_message_id":"9f72cf9144298595481c1c8da56cd5f9ce6ec43c","unresolved":true,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"PACKAGES \u003d [\u0027ceph\u0027, \u0027gdisk\u0027,"},{"line_number":90,"context_line":"            \u0027radosgw\u0027, \u0027xfsprogs\u0027,"},{"line_number":91,"context_line":"            \u0027lvm2\u0027, \u0027parted\u0027, \u0027smartmontools\u0027, \u0027python3-tabulate\u0027]"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"REMOVE_PACKAGES \u003d []"},{"line_number":94,"context_line":"CHRONY_PACKAGE \u003d \u0027chrony\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"04e17316_d717e42f","line":91,"updated":"2021-09-02 13:13:11.000000000","message":"I think the current pattern is to put the `python3-*` packages in the `hooks/install` shell script instead.\n\nThis is important because usually you want to make sure all python dependencies have been installed before attempting to run any python code, as otherwise an `import` happening too early may end up raising an ImportError.","commit_id":"1e2e20f98f77bc109eec68620c8bcb8f102401b4"},{"author":{"_account_id":32363,"name":"Robert Gildein","email":"robert.gildein@canonical.com","username":"rgildein"},"change_message_id":"54011c53bdc6f11bce387db1cacda7b2298aee8b","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"PACKAGES \u003d [\u0027ceph\u0027, \u0027gdisk\u0027,"},{"line_number":90,"context_line":"            \u0027radosgw\u0027, \u0027xfsprogs\u0027,"},{"line_number":91,"context_line":"            \u0027lvm2\u0027, \u0027parted\u0027, \u0027smartmontools\u0027, \u0027python3-tabulate\u0027]"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"REMOVE_PACKAGES \u003d []"},{"line_number":94,"context_line":"CHRONY_PACKAGE \u003d \u0027chrony\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f2ace5f_68663e34","line":91,"in_reply_to":"04e17316_d717e42f","updated":"2021-09-02 15:13:36.000000000","message":"Thanks, It makes sense and I\u0027m glad to know it.","commit_id":"1e2e20f98f77bc109eec68620c8bcb8f102401b4"}],"unit_tests/test_actions_get_availability_zone.py":[{"author":{"_account_id":31289,"name":"Aurelien Lourot","email":"aurelien.lourot@gmail.com","username":"lourot"},"change_message_id":"00245f27609e550ab84ea9f70a7cb51faa988ae9","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"c61039a2_981bedda","line":135,"updated":"2021-08-31 12:09:29.000000000","message":"Can we add a small test for the json format?","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":31289,"name":"Aurelien Lourot","email":"aurelien.lourot@gmail.com","username":"lourot"},"change_message_id":"9f72cf9144298595481c1c8da56cd5f9ce6ec43c","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"8a97e244_c9e6a4d1","line":135,"in_reply_to":"3b78b68d_dd2d3ec6","updated":"2021-09-02 13:13:11.000000000","message":"I mean the action can output two formats: human and json. You have implemented tests only for the human format. Should we implement a test for the json format?","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":32363,"name":"Robert Gildein","email":"robert.gildein@canonical.com","username":"rgildein"},"change_message_id":"54011c53bdc6f11bce387db1cacda7b2298aee8b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"0f34d678_01351044","line":135,"in_reply_to":"8a97e244_c9e6a4d1","updated":"2021-09-02 15:13:36.000000000","message":"Done","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"},{"author":{"_account_id":32363,"name":"Robert Gildein","email":"robert.gildein@canonical.com","username":"rgildein"},"change_message_id":"865906d09dd0aca87357604d6290ef67f6a33e65","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"3b78b68d_dd2d3ec6","line":135,"in_reply_to":"c61039a2_981bedda","updated":"2021-08-31 15:11:38.000000000","message":"What do you mean by this: \"small test for json format\"?","commit_id":"dd2c21b20448538bad946d8daf34a7e9746fdfe1"}]}
