)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5a8030f33182dab4aa51b9e7d18a97f60b20cb0b","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2020-02-04 12:28:32 +0000"},{"line_number":4,"context_line":"Commit:     Stephen Finucane \u003csfinucan@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2020-02-05 17:36:31 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"trivial: Fetch \u0027Service\u0027 objects once when building AZs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"As noted in a TODO by mriedem, we were making two trips to the DB when"},{"line_number":10,"context_line":"retrieving \u0027Service\u0027 objects in order to build a list of availability"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3fa7e38b_3492034c","line":7,"range":{"start_line":6,"start_character":0,"end_line":7,"end_character":8},"updated":"2020-02-05 17:46:28.000000000","message":"This isn\u0027t really that trivial now, but oh well :)","commit_id":"b1826dfbd724f2e0ca4f31d21b165354d213aaab"}],"nova/availability_zones.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6d4945c619b4542a3e5c230eb4aade1869f83b9b","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        if not service.disabled:"},{"line_number":135,"context_line":"            enabled_services.append(service)"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            disabled_services.append(service)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    if with_hosts:"},{"line_number":140,"context_line":"        return _get_availability_zones_with_hosts("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_f360083b","line":137,"updated":"2020-02-05 14:00:01.000000000","message":"hm, why python doesn\u0027t have list.split(input_list, predicate) ? :)","commit_id":"94861a00491fb9541a21b467002d9d7f2996b920"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"480f385bdc5d7be261512105a4b3efa9104d7707","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        if not service.disabled:"},{"line_number":135,"context_line":"            enabled_services.append(service)"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            disabled_services.append(service)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    if with_hosts:"},{"line_number":140,"context_line":"        return _get_availability_zones_with_hosts("}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_599b3a15","line":137,"in_reply_to":"3fa7e38b_f360083b","updated":"2020-02-05 17:39:00.000000000","message":"https://www.python.org/dev/peps/pep-0001/#submitting-a-pep :)","commit_id":"94861a00491fb9541a21b467002d9d7f2996b920"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6d4945c619b4542a3e5c230eb4aade1869f83b9b","unresolved":false,"context_lines":[{"line_number":150,"context_line":"    available_zones \u003d []"},{"line_number":151,"context_line":"    for service in enabled_services:"},{"line_number":152,"context_line":"        zone \u003d service[\u0027availability_zone\u0027]"},{"line_number":153,"context_line":"        if zone not in available_zones:"},{"line_number":154,"context_line":"            available_zones.append(zone)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    if get_only_available:"},{"line_number":157,"context_line":"        return available_zones"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_33cd402f","line":154,"range":{"start_line":153,"start_character":0,"end_line":154,"end_character":40},"updated":"2020-02-05 14:00:01.000000000","message":"If available_zones is a set then you could add the zone to it without caring about duplicates. Like:\n\n    available_zones \u003d {service[\u0027availability_zone\u0027] for service in enabled_services}","commit_id":"94861a00491fb9541a21b467002d9d7f2996b920"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"480f385bdc5d7be261512105a4b3efa9104d7707","unresolved":false,"context_lines":[{"line_number":150,"context_line":"    available_zones \u003d []"},{"line_number":151,"context_line":"    for service in enabled_services:"},{"line_number":152,"context_line":"        zone \u003d service[\u0027availability_zone\u0027]"},{"line_number":153,"context_line":"        if zone not in available_zones:"},{"line_number":154,"context_line":"            available_zones.append(zone)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    if get_only_available:"},{"line_number":157,"context_line":"        return available_zones"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_3450c309","line":154,"range":{"start_line":153,"start_character":0,"end_line":154,"end_character":40},"in_reply_to":"3fa7e38b_33cd402f","updated":"2020-02-05 17:39:00.000000000","message":"Done","commit_id":"94861a00491fb9541a21b467002d9d7f2996b920"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6d4945c619b4542a3e5c230eb4aade1869f83b9b","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        if zone in available_zones:"},{"line_number":163,"context_line":"            continue"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        if zone not in not_available_zones:"},{"line_number":166,"context_line":"            not_available_zones.append(zone)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    return available_zones, not_available_zones"},{"line_number":169,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_93f6745e","line":166,"range":{"start_line":165,"start_character":1,"end_line":166,"end_character":44},"updated":"2020-02-05 14:00:01.000000000","message":"ditto\n\n    not_available_zones \u003d {service[\u0027availability_zone\u0027] \n        for service in disabled_services \n        if service[\u0027availability_zone\u0027] not in available_zones}","commit_id":"94861a00491fb9541a21b467002d9d7f2996b920"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"480f385bdc5d7be261512105a4b3efa9104d7707","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        if zone in available_zones:"},{"line_number":163,"context_line":"            continue"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        if zone not in not_available_zones:"},{"line_number":166,"context_line":"            not_available_zones.append(zone)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    return available_zones, not_available_zones"},{"line_number":169,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_94497766","line":166,"range":{"start_line":165,"start_character":1,"end_line":166,"end_character":44},"in_reply_to":"3fa7e38b_93f6745e","updated":"2020-02-05 17:39:00.000000000","message":"Done","commit_id":"94861a00491fb9541a21b467002d9d7f2996b920"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6d4945c619b4542a3e5c230eb4aade1869f83b9b","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        zone \u003d service[\u0027availability_zone\u0027]"},{"line_number":177,"context_line":"        host \u003d service[\u0027host\u0027]"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        if zone not in available_zones:"},{"line_number":180,"context_line":"            available_zones[zone] \u003d set([host])"},{"line_number":181,"context_line":"        else:"},{"line_number":182,"context_line":"            available_zones[zone].add(host)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    if get_only_available:"},{"line_number":185,"context_line":"        return list(available_zones.items())"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_53b79c89","line":182,"range":{"start_line":179,"start_character":0,"end_line":182,"end_character":43},"updated":"2020-02-05 14:00:01.000000000","message":"available_zones \u003d defaultdict(list) would help avoiding the conditional","commit_id":"94861a00491fb9541a21b467002d9d7f2996b920"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"480f385bdc5d7be261512105a4b3efa9104d7707","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        zone \u003d service[\u0027availability_zone\u0027]"},{"line_number":177,"context_line":"        host \u003d service[\u0027host\u0027]"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        if zone not in available_zones:"},{"line_number":180,"context_line":"            available_zones[zone] \u003d set([host])"},{"line_number":181,"context_line":"        else:"},{"line_number":182,"context_line":"            available_zones[zone].add(host)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    if get_only_available:"},{"line_number":185,"context_line":"        return list(available_zones.items())"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_9472d7ae","line":182,"range":{"start_line":179,"start_character":0,"end_line":182,"end_character":43},"in_reply_to":"3fa7e38b_53b79c89","updated":"2020-02-05 17:39:00.000000000","message":"Done","commit_id":"94861a00491fb9541a21b467002d9d7f2996b920"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b3337642fa001683d1f1153d18cea51c802aa103","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        available zones only"},{"line_number":122,"context_line":"    :param with_hosts: whether to return hosts part of the AZs"},{"line_number":123,"context_line":"    :type with_hosts: bool"},{"line_number":124,"context_line":"    :param services: list of services to use; if None, enabled services will be"},{"line_number":125,"context_line":"        retrieved from all cells with zones set"},{"line_number":126,"context_line":"    \"\"\""},{"line_number":127,"context_line":"    if services is None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_2fcad7a2","line":124,"range":{"start_line":124,"start_character":55,"end_line":124,"end_character":62},"updated":"2020-02-19 19:36:00.000000000","message":"x?","commit_id":"14fed95f61e66cb63818eb1e2c856d6f9b3b6211"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b3337642fa001683d1f1153d18cea51c802aa103","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    :param with_hosts: whether to return hosts part of the AZs"},{"line_number":123,"context_line":"    :type with_hosts: bool"},{"line_number":124,"context_line":"    :param services: list of services to use; if None, enabled services will be"},{"line_number":125,"context_line":"        retrieved from all cells with zones set"},{"line_number":126,"context_line":"    \"\"\""},{"line_number":127,"context_line":"    if services is None:"},{"line_number":128,"context_line":"        services \u003d hostapi.service_get_all("}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_0f57dbcb","line":125,"updated":"2020-02-19 19:36:00.000000000","message":"Unrelated, but since you\u0027re touching the docstring anyway...\n\nWould be nice to explain the return value(s) here, since sometimes it\u0027s one and sometimes it\u0027s two. That\u0027s sort of explained under get_only_available, but it\u0027s not especially clear.","commit_id":"14fed95f61e66cb63818eb1e2c856d6f9b3b6211"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b3337642fa001683d1f1153d18cea51c802aa103","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    for service in services:"},{"line_number":134,"context_line":"        if not service.disabled:"},{"line_number":135,"context_line":"            enabled_services.append(service)"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            disabled_services.append(service)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    if with_hosts:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_afdec73a","line":136,"range":{"start_line":136,"start_character":8,"end_line":136,"end_character":13},"updated":"2020-02-19 19:36:00.000000000","message":"as a further optimization, disabled_services is unused if get_only_available is True, so you could avoid building it at all.","commit_id":"14fed95f61e66cb63818eb1e2c856d6f9b3b6211"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"661a140d41c6112277deda39ffe4b8357aa1d63c","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        if service[\u0027availability_zone\u0027] not in available_zones"},{"line_number":160,"context_line":"    }"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    return sorted(available_zones), sorted(not_available_zones)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"def _get_availability_zones_with_hosts("}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_e5ed9001","line":162,"updated":"2020-02-06 08:09:27.000000000","message":"I don\u0027t get why python developers think it is consistent and good that dict is now insertion ordered while sets are still unordered. :/","commit_id":"14fed95f61e66cb63818eb1e2c856d6f9b3b6211"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"661a140d41c6112277deda39ffe4b8357aa1d63c","unresolved":false,"context_lines":[{"line_number":165,"context_line":"def _get_availability_zones_with_hosts("},{"line_number":166,"context_line":"        enabled_services, disabled_services, get_only_available\u003dFalse):"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    available_zones \u003d collections.defaultdict(set)"},{"line_number":169,"context_line":"    for service in enabled_services:"},{"line_number":170,"context_line":"        available_zones[service[\u0027availability_zone\u0027]].add(service[\u0027host\u0027])"},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_85fcdcb6","line":168,"range":{"start_line":168,"start_character":46,"end_line":168,"end_character":49},"updated":"2020-02-06 08:09:27.000000000","message":"even better than my \u0027list\u0027 proposal","commit_id":"14fed95f61e66cb63818eb1e2c856d6f9b3b6211"}],"nova/tests/unit/api/openstack/compute/test_availability_zone.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6d4945c619b4542a3e5c230eb4aade1869f83b9b","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            }"},{"line_number":176,"context_line":"        ]"},{"line_number":177,"context_line":"        self.assertEqual(expected, zones)"},{"line_number":178,"context_line":"        self.assertEqual(1, self.mock_service_get_all.call_count,"},{"line_number":179,"context_line":"                         self.mock_service_get_all.call_args_list)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    @mock.patch.object(availability_zones, \u0027get_availability_zones\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_b39ff0f4","line":178,"updated":"2020-02-05 14:00:01.000000000","message":"I guess this is the optimization.","commit_id":"94861a00491fb9541a21b467002d9d7f2996b920"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"480f385bdc5d7be261512105a4b3efa9104d7707","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            }"},{"line_number":176,"context_line":"        ]"},{"line_number":177,"context_line":"        self.assertEqual(expected, zones)"},{"line_number":178,"context_line":"        self.assertEqual(1, self.mock_service_get_all.call_count,"},{"line_number":179,"context_line":"                         self.mock_service_get_all.call_args_list)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    @mock.patch.object(availability_zones, \u0027get_availability_zones\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_f96f86f8","line":178,"in_reply_to":"3fa7e38b_b39ff0f4","updated":"2020-02-05 17:39:00.000000000","message":"Yup. Rewrote the commit message so this was clear","commit_id":"94861a00491fb9541a21b467002d9d7f2996b920"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5a8030f33182dab4aa51b9e7d18a97f60b20cb0b","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                        }"},{"line_number":168,"context_line":"                    }"},{"line_number":169,"context_line":"                }"},{"line_number":170,"context_line":"            },"},{"line_number":171,"context_line":"            {"},{"line_number":172,"context_line":"                \u0027zoneName\u0027: \u0027zone-2\u0027,"},{"line_number":173,"context_line":"                \u0027zoneState\u0027: {\u0027available\u0027: False},"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_94b417d5","line":170,"updated":"2020-02-05 17:46:28.000000000","message":"note: I\u0027d to rearrange this because I\u0027m always ordering these now, rather than ordering them based on the first service returned. I think that\u0027s okay.","commit_id":"b1826dfbd724f2e0ca4f31d21b165354d213aaab"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"661a140d41c6112277deda39ffe4b8357aa1d63c","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                        }"},{"line_number":168,"context_line":"                    }"},{"line_number":169,"context_line":"                }"},{"line_number":170,"context_line":"            },"},{"line_number":171,"context_line":"            {"},{"line_number":172,"context_line":"                \u0027zoneName\u0027: \u0027zone-2\u0027,"},{"line_number":173,"context_line":"                \u0027zoneState\u0027: {\u0027available\u0027: False},"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_c51bb41a","line":170,"in_reply_to":"3fa7e38b_94b417d5","updated":"2020-02-06 08:09:27.000000000","message":"thanks for the explanation","commit_id":"b1826dfbd724f2e0ca4f31d21b165354d213aaab"}]}
