)]}'
{"nova/compute/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"47f6bd4e0d2d1612de48c4a1f4e08acf2e2b536f","unresolved":false,"context_lines":[{"line_number":3753,"context_line":"        else:"},{"line_number":3754,"context_line":"            # The instance is being created and we don\u0027t know which"},{"line_number":3755,"context_line":"            # cell it\u0027s going to land in, so check all cells."},{"line_number":3756,"context_line":"            # NOTE(danms): We don\u0027t require all cells to report here since"},{"line_number":3757,"context_line":"            # we\u0027re really concerned if whether or not the cell for a specific"},{"line_number":3758,"context_line":"            # instance has been upgraded. If that cell responded, then the"},{"line_number":3759,"context_line":"            # minimum version is important. If not, we won\u0027t be able to"},{"line_number":3760,"context_line":"            # continue here anyway."},{"line_number":3761,"context_line":"            min_compute_version \u003d \\"},{"line_number":3762,"context_line":"                objects.service.get_minimum_version_all_cells("},{"line_number":3763,"context_line":"                    context, [\u0027nova-compute\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_8de3d833","line":3760,"range":{"start_line":3756,"start_character":12,"end_line":3760,"end_character":35},"updated":"2018-02-06 21:39:42.000000000","message":"This comment is wrong. The reason we don\u0027t care here is the same as the comment in the servers create API controller code - in this case, we\u0027re booting from volume and don\u0027t yet know which cell the instance is going to land in.","commit_id":"97a0158d6419a5d5774c136c0b2a9063ebb0f4ed"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"18c150c526ba0e2282dc9684f5923435208b2fc1","unresolved":false,"context_lines":[{"line_number":3753,"context_line":"        else:"},{"line_number":3754,"context_line":"            # The instance is being created and we don\u0027t know which"},{"line_number":3755,"context_line":"            # cell it\u0027s going to land in, so check all cells."},{"line_number":3756,"context_line":"            # NOTE(danms): We don\u0027t require all cells to report here since"},{"line_number":3757,"context_line":"            # we\u0027re really concerned if whether or not the cell for a specific"},{"line_number":3758,"context_line":"            # instance has been upgraded. If that cell responded, then the"},{"line_number":3759,"context_line":"            # minimum version is important. If not, we won\u0027t be able to"},{"line_number":3760,"context_line":"            # continue here anyway."},{"line_number":3761,"context_line":"            min_compute_version \u003d \\"},{"line_number":3762,"context_line":"                objects.service.get_minimum_version_all_cells("},{"line_number":3763,"context_line":"                    context, [\u0027nova-compute\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_5b37adb1","line":3760,"range":{"start_line":3756,"start_character":12,"end_line":3760,"end_character":35},"in_reply_to":"3fa0c359_8de3d833","updated":"2018-02-07 16:18:56.000000000","message":"That\u0027s actually what I meant, although I see why the latter two comments were confusing.","commit_id":"97a0158d6419a5d5774c136c0b2a9063ebb0f4ed"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"133af9482ffd66dd0c602765cb708c4ac93e6ade","unresolved":false,"context_lines":[{"line_number":1319,"context_line":"            elif volume_id is not None:"},{"line_number":1320,"context_line":"                # The instance is being created and we don\u0027t know which"},{"line_number":1321,"context_line":"                # cell it\u0027s going to land in, so check all cells."},{"line_number":1322,"context_line":"                min_compute_version \u003d \\"},{"line_number":1323,"context_line":"                    objects.service.get_minimum_version_all_cells("},{"line_number":1324,"context_line":"                        context, [\u0027nova-compute\u0027])"},{"line_number":1325,"context_line":"                try:"},{"line_number":1326,"context_line":"                    # NOTE(ildikov): The boot from volume operation did not"},{"line_number":1327,"context_line":"                    # reserve the volume before Pike and as the older computes"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f6a8fd7_b1687dba","line":1324,"range":{"start_line":1322,"start_character":16,"end_line":1324,"end_character":50},"updated":"2018-04-30 08:43:03.000000000","message":"We do an across cell query later again, do we waste a query at here?","commit_id":"5fe3a01b604c29b0961d19b44a873cca78891381"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d2025636dc49aa01d72a98b911a4d6db7bfb0201","unresolved":false,"context_lines":[{"line_number":1319,"context_line":"            elif volume_id is not None:"},{"line_number":1320,"context_line":"                # The instance is being created and we don\u0027t know which"},{"line_number":1321,"context_line":"                # cell it\u0027s going to land in, so check all cells."},{"line_number":1322,"context_line":"                min_compute_version \u003d \\"},{"line_number":1323,"context_line":"                    objects.service.get_minimum_version_all_cells("},{"line_number":1324,"context_line":"                        context, [\u0027nova-compute\u0027])"},{"line_number":1325,"context_line":"                try:"},{"line_number":1326,"context_line":"                    # NOTE(ildikov): The boot from volume operation did not"},{"line_number":1327,"context_line":"                    # reserve the volume before Pike and as the older computes"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_a89fd6b2","line":1324,"range":{"start_line":1322,"start_character":16,"end_line":1324,"end_character":50},"in_reply_to":"9f6a8fd7_b1687dba","updated":"2018-05-03 14:16:09.000000000","message":"This was added in Pike and can likely be removed now in Rocky.","commit_id":"5fe3a01b604c29b0961d19b44a873cca78891381"}],"nova/objects/service.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"47f6bd4e0d2d1612de48c4a1f4e08acf2e2b536f","unresolved":false,"context_lines":[{"line_number":462,"context_line":"    This attempts to calculate the minimum service version for a set"},{"line_number":463,"context_line":"    of binaries across all the cells in the system. If require_all"},{"line_number":464,"context_line":"    is False, then any cells that fail to report a version will be"},{"line_number":465,"context_line":"    ignored (assuming they won\u0027t be candidates for scheduling and thus"},{"line_number":466,"context_line":"    excluding them from the minimum version calculation is reasonable)."},{"line_number":467,"context_line":"    If require_all is True, then a failing cell will cause this to raise"},{"line_number":468,"context_line":"    exception.CellTimeout, as would be appropriate for gating some"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_4d3cf092","line":465,"range":{"start_line":465,"start_character":51,"end_line":465,"end_character":61},"updated":"2018-02-06 21:39:42.000000000","message":"s/scheduling/use/ ?\n\nNot a big deal, just ties the usage of the parameter to what scenarios we expect a caller to be in, when we don\u0027t really know.","commit_id":"97a0158d6419a5d5774c136c0b2a9063ebb0f4ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"47f6bd4e0d2d1612de48c4a1f4e08acf2e2b536f","unresolved":false,"context_lines":[{"line_number":477,"context_line":"        objects.Service.get_minimum_version_multi,"},{"line_number":478,"context_line":"        binaries)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    only_compute \u003d binaries \u003d\u003d [\u0027nova-compute\u0027]"},{"line_number":481,"context_line":"    min_version \u003d None"},{"line_number":482,"context_line":"    for cell_uuid, result in results.items():"},{"line_number":483,"context_line":"        if cell_uuid \u003d\u003d objects.CellMapping.CELL0_UUID and only_compute:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_cdf560cd","line":480,"range":{"start_line":480,"start_character":4,"end_line":480,"end_character":47},"updated":"2018-02-06 21:39:42.000000000","message":"Why do we need this now when we didn\u0027t need it before?\n\nAlso, all of the tests make only_compute True, there are none where we are looking for something like nova-osapi_compute.","commit_id":"97a0158d6419a5d5774c136c0b2a9063ebb0f4ed"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"24d97522ed6a653398559ce3ded20d9d0f8bed29","unresolved":false,"context_lines":[{"line_number":477,"context_line":"        objects.Service.get_minimum_version_multi,"},{"line_number":478,"context_line":"        binaries)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    only_compute \u003d binaries \u003d\u003d [\u0027nova-compute\u0027]"},{"line_number":481,"context_line":"    min_version \u003d None"},{"line_number":482,"context_line":"    for cell_uuid, result in results.items():"},{"line_number":483,"context_line":"        if cell_uuid \u003d\u003d objects.CellMapping.CELL0_UUID and only_compute:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_7b98691a","line":480,"range":{"start_line":480,"start_character":4,"end_line":480,"end_character":47},"in_reply_to":"3fa0c359_5bbc8ddb","updated":"2018-02-07 16:31:54.000000000","message":"Actually, yeah. While working up a test for this, I think this must be what was happening before. Looking in cell0 for computes should always give us a min version of zero, which isn\u0027t right.\n\nAlso, if we\u0027re looking for the minimum across multiple services, we\u0027ll never get the right answer if we don\u0027t ignore all zero returns I think. No API nodes in a cell, and no computes in cell0. So I think the only sane thing to do here is never let a zero for a service override the minimum.","commit_id":"97a0158d6419a5d5774c136c0b2a9063ebb0f4ed"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"dc0745c21035a7e246fe2f36c1de4d10fba68492","unresolved":false,"context_lines":[{"line_number":477,"context_line":"        objects.Service.get_minimum_version_multi,"},{"line_number":478,"context_line":"        binaries)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    only_compute \u003d binaries \u003d\u003d [\u0027nova-compute\u0027]"},{"line_number":481,"context_line":"    min_version \u003d None"},{"line_number":482,"context_line":"    for cell_uuid, result in results.items():"},{"line_number":483,"context_line":"        if cell_uuid \u003d\u003d objects.CellMapping.CELL0_UUID and only_compute:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_5bbc8ddb","line":480,"range":{"start_line":480,"start_character":4,"end_line":480,"end_character":47},"in_reply_to":"3fa0c359_cdf560cd","updated":"2018-02-07 16:26:39.000000000","message":"I did this to try to address the problem I was seeing with the one test calculating zero and I was thinking it might be because it included cell0 and got zero for compute in there.\n\nSince it passed this time it seems likely. I\u0027m thinking it\u0027s likely an artifact of us caching the service versions without cell awareness and this changing the ordering of us updating that cache. I guess I need to defeat some caching and see if that helps.","commit_id":"97a0158d6419a5d5774c136c0b2a9063ebb0f4ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"47f6bd4e0d2d1612de48c4a1f4e08acf2e2b536f","unresolved":false,"context_lines":[{"line_number":483,"context_line":"        if cell_uuid \u003d\u003d objects.CellMapping.CELL0_UUID and only_compute:"},{"line_number":484,"context_line":"            continue"},{"line_number":485,"context_line":"        if result is nova_context.did_not_respond_sentinel:"},{"line_number":486,"context_line":"            LOG.warning(\u0027Cell %s did not respond when getting minimum \u0027"},{"line_number":487,"context_line":"                        \u0027service version\u0027, cell_uuid)"},{"line_number":488,"context_line":"            if require_all:"},{"line_number":489,"context_line":"                raise exception.CellTimeout()"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_0de26804","line":486,"updated":"2018-02-06 21:39:42.000000000","message":"FWIW, we already log a warning in scatter_gather_all_cells when we hit a timeout. This warning does provide more context, so maybe it\u0027s useful on it\u0027s own...","commit_id":"97a0158d6419a5d5774c136c0b2a9063ebb0f4ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"47f6bd4e0d2d1612de48c4a1f4e08acf2e2b536f","unresolved":false,"context_lines":[{"line_number":488,"context_line":"            if require_all:"},{"line_number":489,"context_line":"                raise exception.CellTimeout()"},{"line_number":490,"context_line":"        elif result is nova_context.raised_exception_sentinel:"},{"line_number":491,"context_line":"            LOG.warning(\u0027Failed to get minimum service version for cell %s\u0027,"},{"line_number":492,"context_line":"                        cell_uuid)"},{"line_number":493,"context_line":"            if require_all:"},{"line_number":494,"context_line":"                # NOTE(danms): Okay, this isn\u0027t necessarily a timeout, but"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_8ded18f1","line":491,"updated":"2018-02-06 21:39:42.000000000","message":"Also, FWIW, scatter_gather_all_cells logs an exception traceback if this happens.","commit_id":"97a0158d6419a5d5774c136c0b2a9063ebb0f4ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e0580868bc3642cf4d20926161b7f31c7d2b3ff6","unresolved":false,"context_lines":[{"line_number":476,"context_line":"    \"\"\""},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"    if not all(binary.startswith(\u0027nova-\u0027) for binary in binaries):"},{"line_number":479,"context_line":"        LOG.warning(\u0027get_minimum_version called with likely-incorrect \u0027"},{"line_number":480,"context_line":"                    \u0027binaries `%s\\\u0027\u0027, \u0027,\u0027.join(binaries))"},{"line_number":481,"context_line":"        raise exception.ObjectActionError(action\u003d\u0027get_minimum_version\u0027,"},{"line_number":482,"context_line":"                                          reason\u003d\u0027Invalid binary prefix\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa0c359_bbd02721","line":479,"range":{"start_line":479,"start_character":21,"end_line":479,"end_character":40},"updated":"2018-02-07 21:41:01.000000000","message":"get_minimum_version_all_cells","commit_id":"b169734ce354429cfb7b9beda9f4a739ea83719a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e0580868bc3642cf4d20926161b7f31c7d2b3ff6","unresolved":false,"context_lines":[{"line_number":478,"context_line":"    if not all(binary.startswith(\u0027nova-\u0027) for binary in binaries):"},{"line_number":479,"context_line":"        LOG.warning(\u0027get_minimum_version called with likely-incorrect \u0027"},{"line_number":480,"context_line":"                    \u0027binaries `%s\\\u0027\u0027, \u0027,\u0027.join(binaries))"},{"line_number":481,"context_line":"        raise exception.ObjectActionError(action\u003d\u0027get_minimum_version\u0027,"},{"line_number":482,"context_line":"                                          reason\u003d\u0027Invalid binary prefix\u0027)"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    # NOTE(danms): Instead of using Service.get_minimum_version_multi(), we"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa0c359_9bc52b5e","line":481,"range":{"start_line":481,"start_character":50,"end_line":481,"end_character":69},"updated":"2018-02-07 21:41:01.000000000","message":"get_minimum_version_all_cells","commit_id":"b169734ce354429cfb7b9beda9f4a739ea83719a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"42c0c99db781a8e360ae6a8de6629d61c3290f6f","unresolved":false,"context_lines":[{"line_number":470,"context_line":"    exception.CellTimeout, as would be appropriate for gating some"},{"line_number":471,"context_line":"    data migration until everything is new enough."},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"    Note that services that to not report a positive version are excluded"},{"line_number":474,"context_line":"    from this, as it crosses all cells which will naturally not have all"},{"line_number":475,"context_line":"    services."},{"line_number":476,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_329d2b57","line":473,"range":{"start_line":473,"start_character":28,"end_line":473,"end_character":30},"updated":"2018-04-09 18:10:08.000000000","message":"do","commit_id":"f559f5d15e24f6ae8fcff71bfa812ea347b5c9b4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"42c0c99db781a8e360ae6a8de6629d61c3290f6f","unresolved":false,"context_lines":[{"line_number":475,"context_line":"    services."},{"line_number":476,"context_line":"    \"\"\""},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"    if not all(binary.startswith(\u0027nova-\u0027) for binary in binaries):"},{"line_number":479,"context_line":"        LOG.warning(\u0027get_minimum_version_all_cells called with \u0027"},{"line_number":480,"context_line":"                    \u0027likely-incorrect binaries `%s\\\u0027\u0027, \u0027,\u0027.join(binaries))"},{"line_number":481,"context_line":"        raise exception.ObjectActionError("},{"line_number":482,"context_line":"            action\u003d\u0027get_minimum_version_all_cells\u0027,"},{"line_number":483,"context_line":"            reason\u003d\u0027Invalid binary prefix\u0027)"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"    # NOTE(danms): Instead of using Service.get_minimum_version_multi(), we"},{"line_number":486,"context_line":"    # replicate the call directly to the underlying DB method here because"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_f2bfb3a7","line":483,"range":{"start_line":478,"start_character":4,"end_line":483,"end_character":43},"updated":"2018-04-09 18:10:08.000000000","message":"OK this is copied from get_minimum_version_multi, got it.\n\nYou don\u0027t have a unit test for this case though.","commit_id":"f559f5d15e24f6ae8fcff71bfa812ea347b5c9b4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"42c0c99db781a8e360ae6a8de6629d61c3290f6f","unresolved":false,"context_lines":[{"line_number":482,"context_line":"            action\u003d\u0027get_minimum_version_all_cells\u0027,"},{"line_number":483,"context_line":"            reason\u003d\u0027Invalid binary prefix\u0027)"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"    # NOTE(danms): Instead of using Service.get_minimum_version_multi(), we"},{"line_number":486,"context_line":"    # replicate the call directly to the underlying DB method here because"},{"line_number":487,"context_line":"    # we want to defeat the caching and we need to filter non-present"},{"line_number":488,"context_line":"    # services differently from the single-cell method."}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_922af7e4","line":485,"range":{"start_line":485,"start_character":19,"end_line":485,"end_character":71},"updated":"2018-04-09 18:10:08.000000000","message":"One thing we lose with this is we aren\u0027t giving the option of using DB read slaves, however, it doesn\u0027t look like anything that uses the existing methods actually pass use_slave\u003dTrue.","commit_id":"f559f5d15e24f6ae8fcff71bfa812ea347b5c9b4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"42c0c99db781a8e360ae6a8de6629d61c3290f6f","unresolved":false,"context_lines":[{"line_number":505,"context_line":"            if require_all:"},{"line_number":506,"context_line":"                # NOTE(danms): Okay, this isn\u0027t necessarily a timeout, but"},{"line_number":507,"context_line":"                # it\u0027s functionally the same from the caller\u0027s perspective"},{"line_number":508,"context_line":"                # and we logged the fact that it was actually a failure"},{"line_number":509,"context_line":"                # for the forensic investigator."},{"line_number":510,"context_line":"                raise exception.CellTimeout()"},{"line_number":511,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_b2c93b26","line":508,"range":{"start_line":508,"start_character":22,"end_line":508,"end_character":31},"updated":"2018-04-09 18:10:08.000000000","message":"As in the scatter/gather code did:\n\nhttps://github.com/openstack/nova/blob/e2d5dc4e2c5f69fcbcb04c29b2ed469725122787/nova/context.py#L435","commit_id":"f559f5d15e24f6ae8fcff71bfa812ea347b5c9b4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"42c0c99db781a8e360ae6a8de6629d61c3290f6f","unresolved":false,"context_lines":[{"line_number":509,"context_line":"                # for the forensic investigator."},{"line_number":510,"context_line":"                raise exception.CellTimeout()"},{"line_number":511,"context_line":"        else:"},{"line_number":512,"context_line":"            # NOTE(danms): Don\u0027t consider a zero or None result as the minimum"},{"line_number":513,"context_line":"            # since we\u0027re crossing cells and will likely not have all the"},{"line_number":514,"context_line":"            # services being probed."},{"line_number":515,"context_line":"            relevant_versions \u003d [version for version in result.values()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_3283ebab","line":512,"updated":"2018-04-09 18:10:08.000000000","message":"Yup and this is consistent with how I had to implement the same type of logic in a similar kind of nova-status check:\n\nhttps://review.openstack.org/#/c/557506/3/nova/cmd/status.py@397","commit_id":"f559f5d15e24f6ae8fcff71bfa812ea347b5c9b4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"42c0c99db781a8e360ae6a8de6629d61c3290f6f","unresolved":false,"context_lines":[{"line_number":511,"context_line":"        else:"},{"line_number":512,"context_line":"            # NOTE(danms): Don\u0027t consider a zero or None result as the minimum"},{"line_number":513,"context_line":"            # since we\u0027re crossing cells and will likely not have all the"},{"line_number":514,"context_line":"            # services being probed."},{"line_number":515,"context_line":"            relevant_versions \u003d [version for version in result.values()"},{"line_number":516,"context_line":"                                 if version]"},{"line_number":517,"context_line":"            if relevant_versions:"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_12da67e8","line":514,"range":{"start_line":514,"start_character":29,"end_line":514,"end_character":35},"updated":"2018-04-09 18:10:08.000000000","message":"gross","commit_id":"f559f5d15e24f6ae8fcff71bfa812ea347b5c9b4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"42c0c99db781a8e360ae6a8de6629d61c3290f6f","unresolved":false,"context_lines":[{"line_number":522,"context_line":"    # NOTE(danms): If we got no matches at all (such as at first startup)"},{"line_number":523,"context_line":"    # then report that as zero to be consistent with the other such"},{"line_number":524,"context_line":"    # methods."},{"line_number":525,"context_line":"    return min_version or 0"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_d27f0fa9","line":525,"updated":"2018-04-09 18:10:08.000000000","message":"Yup, like on L448.","commit_id":"f559f5d15e24f6ae8fcff71bfa812ea347b5c9b4"}]}
