)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"07d34570241ba07a481e96192d3a9917bb18dcbc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"ff0f0b1f_05fec3ad","updated":"2017-05-26 08:25:02.000000000","message":"++","commit_id":"62878ef5a6c9f6a2c727c91397830387425c4d37"}],"nova/compute/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c7490d77eb0686591ff106d1c648b3552c5d988f","unresolved":false,"context_lines":[{"line_number":4320,"context_line":"        lookup_fn \u003d lambda c: ("},{"line_number":4321,"context_line":"            objects.Service.get_by_compute_host(c, service_host))"},{"line_number":4322,"context_line":"    else:"},{"line_number":4323,"context_line":"        LOG.warning(\u0027_find_service_in_cell called with no search parameters\u0027)"},{"line_number":4324,"context_line":"        raise exception.ServiceNotFound(service_id\u003d\u0027none\u0027)"},{"line_number":4325,"context_line":""},{"line_number":4326,"context_line":"    for cell in CELLS:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_3a438c6e","line":4323,"range":{"start_line":4323,"start_character":12,"end_line":4323,"end_character":19},"updated":"2017-04-27 20:37:02.000000000","message":"Should probably be error given this is a major coding issue probably. Or raise ValueError or NovaException or something that will result in a 500 in the API because this is a server error I think.","commit_id":"8d33513b10a87568cc5ea802cc00ceba6499e0ef"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bdeb1ec496c019f3bd7765bc2318d67ce96d3fc5","unresolved":false,"context_lines":[{"line_number":4320,"context_line":"        lookup_fn \u003d lambda c: ("},{"line_number":4321,"context_line":"            objects.Service.get_by_compute_host(c, service_host))"},{"line_number":4322,"context_line":"    else:"},{"line_number":4323,"context_line":"        LOG.warning(\u0027_find_service_in_cell called with no search parameters\u0027)"},{"line_number":4324,"context_line":"        raise exception.ServiceNotFound(service_id\u003d\u0027none\u0027)"},{"line_number":4325,"context_line":""},{"line_number":4326,"context_line":"    for cell in CELLS:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_b20aeace","line":4323,"in_reply_to":"5ff73747_3a438c6e","updated":"2017-05-01 10:25:05.000000000","message":"I\u0027m not sure I fully understand but it does seem like this should cause a different exception than the ServiceNotFound case.\n\nIs there an existing test that covers this case?","commit_id":"8d33513b10a87568cc5ea802cc00ceba6499e0ef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5adaa6a733e05ab3497f374d2da84e421cb75bcf","unresolved":false,"context_lines":[{"line_number":4320,"context_line":"        lookup_fn \u003d lambda c: ("},{"line_number":4321,"context_line":"            objects.Service.get_by_compute_host(c, service_host))"},{"line_number":4322,"context_line":"    else:"},{"line_number":4323,"context_line":"        LOG.warning(\u0027_find_service_in_cell called with no search parameters\u0027)"},{"line_number":4324,"context_line":"        raise exception.ServiceNotFound(service_id\u003d\u0027none\u0027)"},{"line_number":4325,"context_line":""},{"line_number":4326,"context_line":"    for cell in CELLS:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_68334a63","line":4323,"in_reply_to":"5ff73747_b20aeace","updated":"2017-05-01 17:38:17.000000000","message":"I didn\u0027t add a test because I normally don\u0027t check for logging in tests, and this is all that it does.\n\nI\u0027m kinda mixed on this being a 500, even though I understand the reasoning for it. Sounds like you both agree so I\u0027ll just do that (and add a test since it\u0027s testable behavior).","commit_id":"8d33513b10a87568cc5ea802cc00ceba6499e0ef"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5d8f925c46e2d06aec859906681f29c65a6e0d4f","unresolved":false,"context_lines":[{"line_number":4321,"context_line":"        lookup_fn \u003d lambda c: ("},{"line_number":4322,"context_line":"            objects.Service.get_by_compute_host(c, service_host))"},{"line_number":4323,"context_line":"    else:"},{"line_number":4324,"context_line":"        LOG.error(\u0027_find_service_in_cell called with no search parameters\u0027)"},{"line_number":4325,"context_line":"        raise exception.NovaException()"},{"line_number":4326,"context_line":""},{"line_number":4327,"context_line":"    for cell in CELLS:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_2b2adcd9","line":4324,"range":{"start_line":4324,"start_character":12,"end_line":4324,"end_character":17},"updated":"2017-05-01 18:21:41.000000000","message":"LOG.exception is probably better since that will dump a stacktrace to see where the bad call is coming from.","commit_id":"ce208970a8a673dce31b5a5697126b2e9c837106"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5d8f925c46e2d06aec859906681f29c65a6e0d4f","unresolved":false,"context_lines":[{"line_number":4322,"context_line":"            objects.Service.get_by_compute_host(c, service_host))"},{"line_number":4323,"context_line":"    else:"},{"line_number":4324,"context_line":"        LOG.error(\u0027_find_service_in_cell called with no search parameters\u0027)"},{"line_number":4325,"context_line":"        raise exception.NovaException()"},{"line_number":4326,"context_line":""},{"line_number":4327,"context_line":"    for cell in CELLS:"},{"line_number":4328,"context_line":"        # NOTE(danms): Services can be in cell0, so don\u0027t skip it here"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_cb1a58c4","line":4325,"updated":"2017-05-01 18:21:41.000000000","message":"nit: could add a comment that this is intentionally unclear so we don\u0027t leak internal details.","commit_id":"ce208970a8a673dce31b5a5697126b2e9c837106"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"541931563b9d9822635f731d8db80587c51cca37","unresolved":false,"context_lines":[{"line_number":4343,"context_line":"            objects.Service.get_by_compute_host(c, service_host))"},{"line_number":4344,"context_line":"    else:"},{"line_number":4345,"context_line":"        LOG.error(\u0027_find_service_in_cell called with no search parameters\u0027)"},{"line_number":4346,"context_line":"        raise exception.NovaException()"},{"line_number":4347,"context_line":""},{"line_number":4348,"context_line":"    for cell in CELLS:"},{"line_number":4349,"context_line":"        # NOTE(danms): Services can be in cell0, so don\u0027t skip it here"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_746a33ed","line":4346,"updated":"2017-05-23 19:44:51.000000000","message":"You dropped a comment from PS4:\n\nhttps://review.openstack.org/#/c/460616/4/nova/compute/api.py@4325","commit_id":"ba429507c403820051fe304f8777ab105d3448bf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9ef3fb5ef4cbb0e83cf0877109c64929c1128e0a","unresolved":false,"context_lines":[{"line_number":4481,"context_line":"                ret_services.append(service)"},{"line_number":4482,"context_line":"        return ret_services"},{"line_number":4483,"context_line":""},{"line_number":4484,"context_line":"    def _find_service(self, context, service_id):"},{"line_number":4485,"context_line":"        \"\"\"Find a service by id by searching all cells."},{"line_number":4486,"context_line":""},{"line_number":4487,"context_line":"        If one matching service is found, return it. If none or multiple"},{"line_number":4488,"context_line":"        are found, raise an exception."},{"line_number":4489,"context_line":""},{"line_number":4490,"context_line":"        :param context: A context.RequestContext"},{"line_number":4491,"context_line":"        :param service_id: The DB ID of the service to find"},{"line_number":4492,"context_line":"        :returns: An objects.Service"},{"line_number":4493,"context_line":"        :raises: ServiceNotUnique if multiple matches are found"},{"line_number":4494,"context_line":"        :raises: ServiceNotFound if no matches are found"},{"line_number":4495,"context_line":"        \"\"\""},{"line_number":4496,"context_line":""},{"line_number":4497,"context_line":"        load_cells()"},{"line_number":4498,"context_line":"        # NOTE(danms): Unfortunately this API exposes database identifiers"},{"line_number":4499,"context_line":"        # which means we really can\u0027t do something efficient here"},{"line_number":4500,"context_line":"        service \u003d None"},{"line_number":4501,"context_line":"        found_in_cell \u003d None"},{"line_number":4502,"context_line":"        for cell in CELLS:"},{"line_number":4503,"context_line":"            # NOTE(danms): Services can be in cell0, so don\u0027t skip it here"},{"line_number":4504,"context_line":"            try:"},{"line_number":4505,"context_line":"                with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":4506,"context_line":"                    cell_service \u003d objects.Service.get_by_id(cctxt,"},{"line_number":4507,"context_line":"                                                             service_id)"},{"line_number":4508,"context_line":"            except exception.ServiceNotFound:"},{"line_number":4509,"context_line":"                # NOTE(danms): Keep looking in other cells"},{"line_number":4510,"context_line":"                continue"},{"line_number":4511,"context_line":"            if service and cell_service:"},{"line_number":4512,"context_line":"                raise exception.ServiceNotUnique()"},{"line_number":4513,"context_line":"            service \u003d cell_service"},{"line_number":4514,"context_line":"            found_in_cell \u003d cell"},{"line_number":4515,"context_line":""},{"line_number":4516,"context_line":"        if service:"},{"line_number":4517,"context_line":"            # NOTE(danms): Set the cell on the context so it remains"},{"line_number":4518,"context_line":"            # when we return to our caller"},{"line_number":4519,"context_line":"            nova_context.set_target_cell(context, found_in_cell)"},{"line_number":4520,"context_line":"            return service"},{"line_number":4521,"context_line":"        else:"},{"line_number":4522,"context_line":"            raise exception.ServiceNotFound(service_id\u003dservice_id)"},{"line_number":4523,"context_line":""},{"line_number":4524,"context_line":"    def service_get_by_id(self, context, service_id):"},{"line_number":4525,"context_line":"        \"\"\"Get service entry for the given service id.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_3426fbcf","line":4522,"range":{"start_line":4484,"start_character":4,"end_line":4522,"end_character":66},"updated":"2017-05-23 19:47:01.000000000","message":"This was all removed in PS4.","commit_id":"ba429507c403820051fe304f8777ab105d3448bf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fb473c4511d8f97772629a0a34fb87022edf58de","unresolved":false,"context_lines":[{"line_number":4470,"context_line":"                ret_services.append(service)"},{"line_number":4471,"context_line":"        return ret_services"},{"line_number":4472,"context_line":""},{"line_number":4473,"context_line":"    def _find_service(self, context, service_id):"},{"line_number":4474,"context_line":"        \"\"\"Find a service by id by searching all cells."},{"line_number":4475,"context_line":""},{"line_number":4476,"context_line":"        If one matching service is found, return it. If none or multiple"},{"line_number":4477,"context_line":"        are found, raise an exception."},{"line_number":4478,"context_line":""},{"line_number":4479,"context_line":"        :param context: A context.RequestContext"},{"line_number":4480,"context_line":"        :param service_id: The DB ID (or UUID) of the service to find"},{"line_number":4481,"context_line":"        :returns: An objects.Service"},{"line_number":4482,"context_line":"        :raises: ServiceNotUnique if multiple matches are found"},{"line_number":4483,"context_line":"        :raises: ServiceNotFound if no matches are found"},{"line_number":4484,"context_line":"        \"\"\""},{"line_number":4485,"context_line":""},{"line_number":4486,"context_line":"        load_cells()"},{"line_number":4487,"context_line":"        # NOTE(danms): Unfortunately this API exposes database identifiers"},{"line_number":4488,"context_line":"        # which means we really can\u0027t do something efficient here"},{"line_number":4489,"context_line":"        service \u003d None"},{"line_number":4490,"context_line":"        found_in_cell \u003d None"},{"line_number":4491,"context_line":"        is_uuid \u003d uuidutils.is_uuid_like(service_id)"},{"line_number":4492,"context_line":"        for cell in CELLS:"},{"line_number":4493,"context_line":"            # NOTE(danms): Services can be in cell0, so don\u0027t skip it here"},{"line_number":4494,"context_line":"            try:"},{"line_number":4495,"context_line":"                with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":4496,"context_line":"                    if is_uuid:"},{"line_number":4497,"context_line":"                        service \u003d objects.Service.get_by_uuid(cctxt,"},{"line_number":4498,"context_line":"                                                              service_id)"},{"line_number":4499,"context_line":"                        found_in_cell \u003d cell"},{"line_number":4500,"context_line":"                        # Service uuids are unique so we can break the loop now"},{"line_number":4501,"context_line":"                        break"},{"line_number":4502,"context_line":"                    else:"},{"line_number":4503,"context_line":"                        cell_service \u003d objects.Service.get_by_id(cctxt,"},{"line_number":4504,"context_line":"                                                                 service_id)"},{"line_number":4505,"context_line":"            except exception.ServiceNotFound:"},{"line_number":4506,"context_line":"                # NOTE(danms): Keep looking in other cells"},{"line_number":4507,"context_line":"                continue"},{"line_number":4508,"context_line":"            if service and cell_service:"},{"line_number":4509,"context_line":"                raise exception.ServiceNotUnique()"},{"line_number":4510,"context_line":"            service \u003d cell_service"},{"line_number":4511,"context_line":"            found_in_cell \u003d cell"},{"line_number":4512,"context_line":""},{"line_number":4513,"context_line":"        if service:"},{"line_number":4514,"context_line":"            # NOTE(danms): Set the cell on the context so it remains"},{"line_number":4515,"context_line":"            # when we return to our caller"},{"line_number":4516,"context_line":"            nova_context.set_target_cell(context, found_in_cell)"},{"line_number":4517,"context_line":"            return service"},{"line_number":4518,"context_line":"        else:"},{"line_number":4519,"context_line":"            raise exception.ServiceNotFound(service_id\u003dservice_id)"},{"line_number":4520,"context_line":""},{"line_number":4521,"context_line":"    def service_get_by_id(self, context, service_id):"},{"line_number":4522,"context_line":"        \"\"\"Get service entry for the given service id or uuid.\"\"\""},{"line_number":4523,"context_line":"        return self._find_service(context, service_id)"},{"line_number":4524,"context_line":""},{"line_number":4525,"context_line":"    @target_host_cell"},{"line_number":4526,"context_line":"    def service_get_by_compute_host(self, context, host_name):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff0f0b1f_0db3a8ea","line":4523,"range":{"start_line":4473,"start_character":4,"end_line":4523,"end_character":54},"updated":"2017-05-25 14:22:37.000000000","message":"This is all wrong again.","commit_id":"3d4d71020b5637097a2bb2bb36d053d24df93580"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f8574f55245d88c6e03d0e0d1747d98471c577c8","unresolved":false,"context_lines":[{"line_number":4436,"context_line":"        # which means we really can\u0027t do something efficient here"},{"line_number":4437,"context_line":"        service \u003d None"},{"line_number":4438,"context_line":"        found_in_cell \u003d None"},{"line_number":4439,"context_line":"        is_uuid \u003d uuidutils.is_uuid_like(service_id)"},{"line_number":4440,"context_line":"        for cell in CELLS:"},{"line_number":4441,"context_line":"            # NOTE(danms): Services can be in cell0, so don\u0027t skip it here"},{"line_number":4442,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff0f0b1f_00112a54","side":"PARENT","line":4439,"range":{"start_line":4439,"start_character":8,"end_line":4439,"end_character":52},"updated":"2017-05-25 15:55:53.000000000","message":"You dropped all of this stuff I just added.","commit_id":"65402e1aeb770d077620f2935a0cb305474aa7a1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"db5ab07ebd60d45b39520e382188340900404ae3","unresolved":false,"context_lines":[{"line_number":4436,"context_line":"        # which means we really can\u0027t do something efficient here"},{"line_number":4437,"context_line":"        service \u003d None"},{"line_number":4438,"context_line":"        found_in_cell \u003d None"},{"line_number":4439,"context_line":"        is_uuid \u003d uuidutils.is_uuid_like(service_id)"},{"line_number":4440,"context_line":"        for cell in CELLS:"},{"line_number":4441,"context_line":"            # NOTE(danms): Services can be in cell0, so don\u0027t skip it here"},{"line_number":4442,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff0f0b1f_4055e2f9","side":"PARENT","line":4439,"range":{"start_line":4439,"start_character":8,"end_line":4439,"end_character":52},"in_reply_to":"ff0f0b1f_00112a54","updated":"2017-05-25 15:57:30.000000000","message":"Specifically this:\n\nIb82432f125649bc96b386c8f5895813cfbaa57dd","commit_id":"65402e1aeb770d077620f2935a0cb305474aa7a1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"aaf82c7fd206611690004a298112cfbf482ab93b","unresolved":false,"context_lines":[{"line_number":4311,"context_line":"    are found, raise an exception."},{"line_number":4312,"context_line":""},{"line_number":4313,"context_line":"    :param context: A context.RequestContext"},{"line_number":4314,"context_line":"    :param service_id: If not none, the DB ID of the service to find"},{"line_number":4315,"context_line":"    :param service_host: If not None, the hostname of the service to find"},{"line_number":4316,"context_line":"    :returns: An objects.Service"},{"line_number":4317,"context_line":"    :raises: ServiceNotUnique if multiple matching IDs are found"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_c4721f4a","line":4314,"range":{"start_line":4314,"start_character":43,"end_line":4314,"end_character":45},"updated":"2017-05-25 20:00:00.000000000","message":"(or UUID)","commit_id":"62878ef5a6c9f6a2c727c91397830387425c4d37"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"aaf82c7fd206611690004a298112cfbf482ab93b","unresolved":false,"context_lines":[{"line_number":4351,"context_line":"            raise exception.ServiceNotUnique()"},{"line_number":4352,"context_line":"        service \u003d cell_service"},{"line_number":4353,"context_line":"        found_in_cell \u003d cell"},{"line_number":4354,"context_line":"        if service and is_uuid:"},{"line_number":4355,"context_line":"            break"},{"line_number":4356,"context_line":""},{"line_number":4357,"context_line":"    if service:"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff0f0b1f_c4a7bfa7","line":4354,"range":{"start_line":4354,"start_character":19,"end_line":4354,"end_character":30},"updated":"2017-05-25 20:00:00.000000000","message":"OK this is here because we can stop looking for duplicates if we were using a uuid to begin with, because in that case it\u0027s a straight lookup. Yar.","commit_id":"62878ef5a6c9f6a2c727c91397830387425c4d37"}]}
