)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6f3f07f128dfd3c2c86e8df792ff83fe559f7d84","unresolved":false,"context_lines":[{"line_number":43,"context_line":"| Total                                                                                     | 39.608161 |"},{"line_number":44,"context_line":"+-------------------------------------------------------------------------------------------+-----------+"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Related-Bug: #1801897"},{"line_number":47,"context_line":"Change-Id: Ib9a9a9a79499272d740a64cc0b909f0299a237d1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"ffb9cba7_9e21b850","line":46,"range":{"start_line":46,"start_character":0,"end_line":46,"end_character":7},"updated":"2019-04-23 20:32:47.000000000","message":"I think you could probably mark this as at least Partial-Bug if not Closes-Bug.","commit_id":"186b37f8237010b5abd4ab4ad208a9ea400f8819"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"259858b9f7e9cbf196c7f7703b7dc98a473b951f","unresolved":false,"context_lines":[{"line_number":12,"context_line":"zone_hosts changed from dict of lists to dict of sets."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"The HostAPI instance from the API controller is also passed to the"},{"line_number":15,"context_line":"get_availability_zones method so it does not have to recreate it"},{"line_number":16,"context_line":"per call (this is both for a slight performance gain but mostly also"},{"line_number":17,"context_line":"for test sanity)."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ffb9cba7_d50db03e","line":15,"range":{"start_line":15,"start_character":53,"end_line":15,"end_character":64},"updated":"2019-04-24 23:03:13.000000000","message":"be recreated","commit_id":"74cefe4266a613d4c2afbb0c791e16eb7789aef4"}],"nova/api/openstack/compute/availability_zone.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6f3f07f128dfd3c2c86e8df792ff83fe559f7d84","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        enabled_services \u003d self.host_api.service_get_all("},{"line_number":62,"context_line":"            context, {\u0027disabled\u0027: False}, set_zones\u003dTrue, all_cells\u003dTrue)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        available_zones, not_available_zones \u003d ("},{"line_number":65,"context_line":"            availability_zones.get_availability_zones("},{"line_number":66,"context_line":"                ctxt, enabled_services\u003denabled_services))"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        zone_hosts \u003d {}"},{"line_number":69,"context_line":"        host_services \u003d {}"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9cba7_fee1d4ff","line":66,"range":{"start_line":64,"start_character":8,"end_line":66,"end_character":57},"updated":"2019-04-23 20:32:47.000000000","message":"I guess regarding a unit test would could simply assert that we\u0027re passing enabled_services to get_availability_zones.\n\nIf we had a more robust test, we could further assert that service_get_all is only called once.","commit_id":"186b37f8237010b5abd4ab4ad208a9ea400f8819"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"15d19fb91129d602ab77ee38967aef65b0bce5f3","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        enabled_services \u003d self.host_api.service_get_all("},{"line_number":62,"context_line":"            context, {\u0027disabled\u0027: False}, set_zones\u003dTrue, all_cells\u003dTrue)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        available_zones, not_available_zones \u003d ("},{"line_number":65,"context_line":"            availability_zones.get_availability_zones("},{"line_number":66,"context_line":"                ctxt, enabled_services\u003denabled_services))"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        zone_hosts \u003d {}"},{"line_number":69,"context_line":"        host_services \u003d {}"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9cba7_91c52991","line":66,"range":{"start_line":64,"start_character":8,"end_line":66,"end_character":57},"in_reply_to":"ffb9cba7_fee1d4ff","updated":"2019-04-23 21:32:20.000000000","message":"\u003e If we had a more robust test, we could further assert that service_get_all is only called once.\n\nIt\u0027s actually called twice, once here and once more in availability_zones.get_availability_zones to get disabled services because get_only_available\u003dFalse, but we can assert that we only call self.host_api.service_get_all twice (rather than 3 times).","commit_id":"186b37f8237010b5abd4ab4ad208a9ea400f8819"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6f3f07f128dfd3c2c86e8df792ff83fe559f7d84","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                # Skip API services in the listing since they are not"},{"line_number":74,"context_line":"                # maintained in the same way as other services"},{"line_number":75,"context_line":"                continue"},{"line_number":76,"context_line":"            zone_hosts.setdefault(service[\u0027availability_zone\u0027], set())"},{"line_number":77,"context_line":"            zone_hosts[service[\u0027availability_zone\u0027]].add(service[\u0027host\u0027])"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"            host_services.setdefault(service[\u0027availability_zone\u0027] +"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9cba7_7eede4ed","line":76,"updated":"2019-04-23 20:32:47.000000000","message":"Probably the only good way to test this with a unit test is to make sure that we\u0027re properly handling duplicates (which maybe there is already a test for that? We could find out by simply removing the \"if service[\u0027host\u0027] not in zone_hosts[service[\u0027availability_zone\u0027]]:\" check in the previous code).","commit_id":"186b37f8237010b5abd4ab4ad208a9ea400f8819"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0a4a26d14824507dcf069737764e10a1e3d4cfe1","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                # Skip API services in the listing since they are not"},{"line_number":74,"context_line":"                # maintained in the same way as other services"},{"line_number":75,"context_line":"                continue"},{"line_number":76,"context_line":"            zone_hosts.setdefault(service[\u0027availability_zone\u0027], set())"},{"line_number":77,"context_line":"            zone_hosts[service[\u0027availability_zone\u0027]].add(service[\u0027host\u0027])"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"            host_services.setdefault(service[\u0027availability_zone\u0027] +"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9cba7_fed554ba","line":76,"in_reply_to":"ffb9cba7_3e19acd6","updated":"2019-04-23 20:51:25.000000000","message":"I guess the only way you could have the same host in a zone multiple times is for controller services since a compute host can\u0027t be in multiple zones, so like nova-scheduler and nova-conductor could both be in the \u0027nova\u0027 zone.","commit_id":"186b37f8237010b5abd4ab4ad208a9ea400f8819"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9d8a5e87e185dc5efbf902d37277bd0d0c172a12","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                # Skip API services in the listing since they are not"},{"line_number":74,"context_line":"                # maintained in the same way as other services"},{"line_number":75,"context_line":"                continue"},{"line_number":76,"context_line":"            zone_hosts.setdefault(service[\u0027availability_zone\u0027], set())"},{"line_number":77,"context_line":"            zone_hosts[service[\u0027availability_zone\u0027]].add(service[\u0027host\u0027])"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"            host_services.setdefault(service[\u0027availability_zone\u0027] +"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9cba7_3e19acd6","line":76,"in_reply_to":"ffb9cba7_7eede4ed","updated":"2019-04-23 20:47:08.000000000","message":"I removed the duplicate handling from the previous code and no tests failed so yeah we\u0027re not testing for duplicates, but that could be an easy test.","commit_id":"186b37f8237010b5abd4ab4ad208a9ea400f8819"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"15d19fb91129d602ab77ee38967aef65b0bce5f3","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        result \u003d []"},{"line_number":85,"context_line":"        for zone in available_zones:"},{"line_number":86,"context_line":"            hosts \u003d {}"},{"line_number":87,"context_line":"            for host in zone_hosts.get(zone, []):"},{"line_number":88,"context_line":"                hosts[host] \u003d {}"},{"line_number":89,"context_line":"                for service in host_services[zone + host]:"},{"line_number":90,"context_line":"                    alive \u003d self.servicegroup_api.service_is_up(service)"},{"line_number":91,"context_line":"                    hosts[host][service[\u0027binary\u0027]] \u003d {\u0027available\u0027: alive,"},{"line_number":92,"context_line":"                                      \u0027active\u0027: True !\u003d service[\u0027disabled\u0027],"},{"line_number":93,"context_line":"                                      \u0027updated_at\u0027: service[\u0027updated_at\u0027]}"},{"line_number":94,"context_line":"            result.append({\u0027zoneName\u0027: zone,"},{"line_number":95,"context_line":"                           \u0027zoneState\u0027: {\u0027available\u0027: True},"},{"line_number":96,"context_line":"                           \"hosts\": hosts})"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9cba7_5e2ee0a5","line":93,"range":{"start_line":87,"start_character":12,"end_line":93,"end_character":74},"updated":"2019-04-23 21:32:20.000000000","message":"Actually duplicates above appear to not even matter since we\u0027ll still process the hosts properly (I wrote a test) but it does mean we\u0027d needlessly run through these loops more than necessary. I\u0027ll leave the test in place anyway. Really making sure we do the duplicate handling properly would probably mean refactoring this code into a private method, then mocking that to call the actual function but then count how many times it\u0027s called (once per zone+host combo).","commit_id":"186b37f8237010b5abd4ab4ad208a9ea400f8819"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8634dc9c63fe3f413169ba86298df3b5c4e568d4","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        enabled_services \u003d self.host_api.service_get_all("},{"line_number":62,"context_line":"            context, {\u0027disabled\u0027: False}, set_zones\u003dTrue, all_cells\u003dTrue)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        available_zones, not_available_zones \u003d ("},{"line_number":65,"context_line":"            availability_zones.get_availability_zones("},{"line_number":66,"context_line":"                ctxt, enabled_services\u003denabled_services))"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        zone_hosts \u003d {}"},{"line_number":69,"context_line":"        host_services \u003d {}"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffb9cba7_31a6bdc3","line":66,"range":{"start_line":64,"start_character":7,"end_line":66,"end_character":57},"updated":"2019-04-23 21:56:05.000000000","message":"ok so we look up the enables service and pass it in\nos that here https://review.opendev.org/#/c/636947/3/nova/availability_zones.py@129 we dont have to look it up again.","commit_id":"12c3eb2d3a7e7f12a65d304ecfc14fed58d4ea58"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8634dc9c63fe3f413169ba86298df3b5c4e568d4","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                # Skip API services in the listing since they are not"},{"line_number":74,"context_line":"                # maintained in the same way as other services"},{"line_number":75,"context_line":"                continue"},{"line_number":76,"context_line":"            zone_hosts.setdefault(service[\u0027availability_zone\u0027], set())"},{"line_number":77,"context_line":"            zone_hosts[service[\u0027availability_zone\u0027]].add(service[\u0027host\u0027])"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"            host_services.setdefault(service[\u0027availability_zone\u0027] +"},{"line_number":80,"context_line":"                    service[\u0027host\u0027], [])"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffb9cba7_31947d37","line":77,"range":{"start_line":76,"start_character":12,"end_line":77,"end_character":73},"updated":"2019-04-23 21:56:05.000000000","message":"change for a list to a set which removes and duplicate host.\n\nthe same host shoudl not be list twice anyway by but that allow us to remove the if check and a set will be faster.","commit_id":"12c3eb2d3a7e7f12a65d304ecfc14fed58d4ea58"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"259858b9f7e9cbf196c7f7703b7dc98a473b951f","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                    alive \u003d self.servicegroup_api.service_is_up(service)"},{"line_number":93,"context_line":"                    hosts[host][service[\u0027binary\u0027]] \u003d {"},{"line_number":94,"context_line":"                        \u0027available\u0027: alive,"},{"line_number":95,"context_line":"                        \u0027active\u0027: service[\u0027disabled\u0027] is not True,"},{"line_number":96,"context_line":"                        \u0027updated_at\u0027: service[\u0027updated_at\u0027]"},{"line_number":97,"context_line":"                    }"},{"line_number":98,"context_line":"            result.append({\u0027zoneName\u0027: zone,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffb9cba7_f5223401","line":95,"range":{"start_line":95,"start_character":34,"end_line":95,"end_character":65},"updated":"2019-04-24 23:03:13.000000000","message":"/me turns blind eye","commit_id":"74cefe4266a613d4c2afbb0c791e16eb7789aef4"}],"nova/availability_zones.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6f3f07f128dfd3c2c86e8df792ff83fe559f7d84","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def get_availability_zones(context, get_only_available\u003dFalse,"},{"line_number":113,"context_line":"                           with_hosts\u003dFalse, enabled_services\u003dNone):"},{"line_number":114,"context_line":"    \"\"\"Return available and unavailable zones on demand."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        :param get_only_available: flag to determine whether to return"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9cba7_7e18841c","line":113,"range":{"start_line":113,"start_character":45,"end_line":113,"end_character":61},"updated":"2019-04-23 20:32:47.000000000","message":"Add this to the docstring.","commit_id":"186b37f8237010b5abd4ab4ad208a9ea400f8819"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"15d19fb91129d602ab77ee38967aef65b0bce5f3","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def get_availability_zones(context, get_only_available\u003dFalse,"},{"line_number":113,"context_line":"                           with_hosts\u003dFalse, enabled_services\u003dNone):"},{"line_number":114,"context_line":"    \"\"\"Return available and unavailable zones on demand."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        :param get_only_available: flag to determine whether to return"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9cba7_51bfb1fa","line":113,"range":{"start_line":113,"start_character":45,"end_line":113,"end_character":61},"in_reply_to":"ffb9cba7_7e18841c","updated":"2019-04-23 21:32:20.000000000","message":"Done","commit_id":"186b37f8237010b5abd4ab4ad208a9ea400f8819"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6f3f07f128dfd3c2c86e8df792ff83fe559f7d84","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    hostapi \u003d compute.HostAPI()"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    if enabled_services is None:"},{"line_number":128,"context_line":"        enabled_services \u003d hostapi.service_get_all("},{"line_number":129,"context_line":"            context, {\u0027disabled\u0027: False}, set_zones\u003dTrue, all_cells\u003dTrue)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    available_zones \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9cba7_3ec1ac55","line":128,"updated":"2019-04-23 20:32:47.000000000","message":"A simple unit test would assert that we don\u0027t call service_get_all if enabled_services is passed in.","commit_id":"186b37f8237010b5abd4ab4ad208a9ea400f8819"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"15d19fb91129d602ab77ee38967aef65b0bce5f3","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    hostapi \u003d compute.HostAPI()"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    if enabled_services is None:"},{"line_number":128,"context_line":"        enabled_services \u003d hostapi.service_get_all("},{"line_number":129,"context_line":"            context, {\u0027disabled\u0027: False}, set_zones\u003dTrue, all_cells\u003dTrue)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    available_zones \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9cba7_f1458518","line":128,"in_reply_to":"ffb9cba7_3ec1ac55","updated":"2019-04-23 21:32:20.000000000","message":"Done","commit_id":"186b37f8237010b5abd4ab4ad208a9ea400f8819"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a55a12ed84e79a0f70791cb0cf3e81a3c7c6906e","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            enabled services will be retrieved from all cells with zones set"},{"line_number":125,"context_line":"        :param hostapi: nova.compute.api.HostAPI instance"},{"line_number":126,"context_line":"    \"\"\""},{"line_number":127,"context_line":"    # TODO(mriedem): Make hostapi a required arg in a non-backportable FUP."},{"line_number":128,"context_line":"    if hostapi is None:"},{"line_number":129,"context_line":"        # NOTE(danms): Avoid circular import"},{"line_number":130,"context_line":"        from nova import compute"}],"source_content_type":"text/x-python","patch_set":4,"id":"ffb9cba7_e2658ae2","line":127,"updated":"2019-04-25 14:40:41.000000000","message":"sure, it\u0027s just a unrelated tech debt fix","commit_id":"74cefe4266a613d4c2afbb0c791e16eb7789aef4"}],"nova/tests/unit/api/openstack/compute/test_availability_zone.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4030ac2b1149f65e74ca54f4192f38e18837b396","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        self.assertEqual(len(zones), 3)"},{"line_number":128,"context_line":"        timestamp \u003d iso8601.parse_date(\"2012-12-26T14:45:25Z\")"},{"line_number":129,"context_line":"        nova_network_timestamp \u003d iso8601.parse_date(\"2012-12-26T14:45:24Z\")"},{"line_number":130,"context_line":"        expected \u003d [{\u0027zoneName\u0027: \u0027zone-1\u0027,"},{"line_number":131,"context_line":"                    \u0027zoneState\u0027: {\u0027available\u0027: True},"},{"line_number":132,"context_line":"                    \u0027hosts\u0027: {\u0027fake_host-1\u0027: {"},{"line_number":133,"context_line":"                        \u0027nova-compute\u0027: {\u0027active\u0027: True, \u0027available\u0027: True,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffb9cba7_b11e2d0a","side":"PARENT","line":130,"updated":"2019-04-23 21:42:44.000000000","message":"Granted I could have left this mess in place, but man it\u0027s hard to read (and modify, which is why I formatted it).","commit_id":"570b07e53c72b1fbb80315bd5f4cf42e4e69f64b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d9959cc81f2c8d2ede6ce82a33154a7f7d0b9969","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        super(AvailabilityZoneApiTestV21, self).setUp()"},{"line_number":90,"context_line":"        availability_zones.reset_cache()"},{"line_number":91,"context_line":"        fakes.stub_out_nw_api(self)"},{"line_number":92,"context_line":"        self.mock_service_get_all \u003d mock.patch("},{"line_number":93,"context_line":"            \u0027nova.db.api.service_get_all\u0027,"},{"line_number":94,"context_line":"            side_effect\u003dfake_service_get_all).start()"},{"line_number":95,"context_line":"        self.addCleanup(self.mock_service_get_all.stop)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffb9cba7_9563b8dc","line":92,"updated":"2019-04-24 21:53:06.000000000","message":"Ugh, so apparently the global nature of this stomps on other tests running concurrently. The best thing to do would be to mock just self.controller.host_api.service_get_all *but* availability_zones.get_availability_zones calls that also and with a fresh HostAPI every time. We could / should probably also clean that up by passing in our instance of HostAPI to get_availability_zones.","commit_id":"12c3eb2d3a7e7f12a65d304ecfc14fed58d4ea58"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ce51cdb70f1fe153682e462205f2db9c2aa5dfde","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        super(AvailabilityZoneApiTestV21, self).setUp()"},{"line_number":90,"context_line":"        availability_zones.reset_cache()"},{"line_number":91,"context_line":"        fakes.stub_out_nw_api(self)"},{"line_number":92,"context_line":"        self.mock_service_get_all \u003d mock.patch("},{"line_number":93,"context_line":"            \u0027nova.db.api.service_get_all\u0027,"},{"line_number":94,"context_line":"            side_effect\u003dfake_service_get_all).start()"},{"line_number":95,"context_line":"        self.addCleanup(self.mock_service_get_all.stop)"},{"line_number":96,"context_line":"        self.stub_out(\u0027nova.availability_zones.set_availability_zones\u0027,"},{"line_number":97,"context_line":"                      lambda c, services: services)"},{"line_number":98,"context_line":"        self.stub_out(\u0027nova.servicegroup.API.service_is_up\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffb9cba7_f1ba65dc","line":95,"range":{"start_line":92,"start_character":0,"end_line":95,"end_character":55},"updated":"2019-04-23 21:46:07.000000000","message":"why?","commit_id":"12c3eb2d3a7e7f12a65d304ecfc14fed58d4ea58"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"40df3632de054698c8cd75b95549029f520b2666","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        super(AvailabilityZoneApiTestV21, self).setUp()"},{"line_number":90,"context_line":"        availability_zones.reset_cache()"},{"line_number":91,"context_line":"        fakes.stub_out_nw_api(self)"},{"line_number":92,"context_line":"        self.mock_service_get_all \u003d mock.patch("},{"line_number":93,"context_line":"            \u0027nova.db.api.service_get_all\u0027,"},{"line_number":94,"context_line":"            side_effect\u003dfake_service_get_all).start()"},{"line_number":95,"context_line":"        self.addCleanup(self.mock_service_get_all.stop)"},{"line_number":96,"context_line":"        self.stub_out(\u0027nova.availability_zones.set_availability_zones\u0027,"},{"line_number":97,"context_line":"                      lambda c, services: services)"},{"line_number":98,"context_line":"        self.stub_out(\u0027nova.servicegroup.API.service_is_up\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffb9cba7_916c4937","line":95,"range":{"start_line":92,"start_character":0,"end_line":95,"end_character":55},"in_reply_to":"ffb9cba7_51da5117","updated":"2019-04-23 22:03:02.000000000","message":"If fixtures is imported, this reduces to\n\n self.mock_service_get_all \u003d self.useFixture(fixtures.MockPatch(\n     \u0027...\u0027, side_effect\u003d...)).mock\n\nI didn\u0027t realize a) stub_out doesn\u0027t return the fixture, and b) MonkeyPatch doesn\u0027t expose the mock.\n\nShrug.","commit_id":"12c3eb2d3a7e7f12a65d304ecfc14fed58d4ea58"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8634dc9c63fe3f413169ba86298df3b5c4e568d4","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        super(AvailabilityZoneApiTestV21, self).setUp()"},{"line_number":90,"context_line":"        availability_zones.reset_cache()"},{"line_number":91,"context_line":"        fakes.stub_out_nw_api(self)"},{"line_number":92,"context_line":"        self.mock_service_get_all \u003d mock.patch("},{"line_number":93,"context_line":"            \u0027nova.db.api.service_get_all\u0027,"},{"line_number":94,"context_line":"            side_effect\u003dfake_service_get_all).start()"},{"line_number":95,"context_line":"        self.addCleanup(self.mock_service_get_all.stop)"},{"line_number":96,"context_line":"        self.stub_out(\u0027nova.availability_zones.set_availability_zones\u0027,"},{"line_number":97,"context_line":"                      lambda c, services: services)"},{"line_number":98,"context_line":"        self.stub_out(\u0027nova.servicegroup.API.service_is_up\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffb9cba7_51da5117","line":95,"range":{"start_line":92,"start_character":0,"end_line":95,"end_character":55},"in_reply_to":"ffb9cba7_d1aac183","updated":"2019-04-23 21:56:05.000000000","message":"i think this is less surprising anyway.\n\nthe stub_out way is not really used that much out side of nova so this is easier at leas for me to follow as it more familar. that said more code.","commit_id":"12c3eb2d3a7e7f12a65d304ecfc14fed58d4ea58"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7c5d2cd881dc296a0679c90f55375b065a4dba83","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        super(AvailabilityZoneApiTestV21, self).setUp()"},{"line_number":90,"context_line":"        availability_zones.reset_cache()"},{"line_number":91,"context_line":"        fakes.stub_out_nw_api(self)"},{"line_number":92,"context_line":"        self.mock_service_get_all \u003d mock.patch("},{"line_number":93,"context_line":"            \u0027nova.db.api.service_get_all\u0027,"},{"line_number":94,"context_line":"            side_effect\u003dfake_service_get_all).start()"},{"line_number":95,"context_line":"        self.addCleanup(self.mock_service_get_all.stop)"},{"line_number":96,"context_line":"        self.stub_out(\u0027nova.availability_zones.set_availability_zones\u0027,"},{"line_number":97,"context_line":"                      lambda c, services: services)"},{"line_number":98,"context_line":"        self.stub_out(\u0027nova.servicegroup.API.service_is_up\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffb9cba7_d1aac183","line":95,"range":{"start_line":92,"start_character":0,"end_line":95,"end_character":55},"in_reply_to":"ffb9cba7_f1ba65dc","updated":"2019-04-23 21:46:33.000000000","message":"So I can count how many times it was called.","commit_id":"12c3eb2d3a7e7f12a65d304ecfc14fed58d4ea58"}]}
