)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b5dd2f2f4aa1f9b98035e92253af0f1554d40926","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: Add a placement audit command"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When deleting instances, allocations can be orphaned. Adding a new nova-manage"},{"line_number":10,"context_line":"command to lookup at all compute nodes and check whether they have orphaned"},{"line_number":11,"context_line":"allocations."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7faddb67_11becbd4","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":53},"updated":"2019-07-12 14:08:43.000000000","message":"I\u0027m not sure what delete case you\u0027re talking about orphans allocations here really, but there are many more cases where we can orphan allocations which I think I linked to in the related mailing list thread. A common one is failed migrations.","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b5dd2f2f4aa1f9b98035e92253af0f1554d40926","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: Add a placement audit command"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When deleting instances, allocations can be orphaned. Adding a new nova-manage"},{"line_number":10,"context_line":"command to lookup at all compute nodes and check whether they have orphaned"},{"line_number":11,"context_line":"allocations."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7faddb67_d1b35309","line":9,"range":{"start_line":9,"start_character":67,"end_line":9,"end_character":78},"updated":"2019-07-12 14:08:43.000000000","message":"nit: wrap lines earlier","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b5dd2f2f4aa1f9b98035e92253af0f1554d40926","unresolved":false,"context_lines":[{"line_number":7,"context_line":"WIP: Add a placement audit command"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When deleting instances, allocations can be orphaned. Adding a new nova-manage"},{"line_number":10,"context_line":"command to lookup at all compute nodes and check whether they have orphaned"},{"line_number":11,"context_line":"allocations."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I537ed74503d208957f0a97af3ab754a6750dac20"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7faddb67_3191874f","line":10,"updated":"2019-07-12 14:08:43.000000000","message":"When we talked about this in IRC, I thought I suggested a course of looking up the resource providers and their allocations and then from the allocation consumers (we could filter out the ones that don\u0027t have VCPU/MEMORY_MB since those wouldn\u0027t be nova allocations), we then need to determine if:\n\n1. it\u0027s an instance and the allocation is on the wrong host\n2. if the instance is gone but the allocation was leaked\n3. if it\u0027s a migration-based allocation that was leaked - this would tie into #2 since if it\u0027s not an instance or migration consumer, then the instance might be deleted (or the migration I guess? We could try reading deleted records to be sure if they haven\u0027t been archived first).\n\nAnyway, in general, I\u0027d like more details in the commit message about what the command does to set the stage before digging into the code.\n\nFor example, is it multi-cell aware or does it need to be run per cell?","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"71a504d4f64f1515289381eecb432d60f5527be4","unresolved":false,"context_lines":[{"line_number":7,"context_line":"WIP: Add a placement audit command"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When deleting instances, allocations can be orphaned. Adding a new nova-manage"},{"line_number":10,"context_line":"command to lookup at all compute nodes and check whether they have orphaned"},{"line_number":11,"context_line":"allocations."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I537ed74503d208957f0a97af3ab754a6750dac20"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7faddb67_8f9cb9c0","line":10,"in_reply_to":"7faddb67_3191874f","updated":"2019-07-15 15:46:53.000000000","message":"IIRC we agreed on IRC that given we don\u0027t have pagination for RPs in the Placement API, we should rather lookup at the compute nodes. But okay, I can change it.","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"67f2a645a2ac16e7e9099bf53ddfda04b8611e77","unresolved":false,"context_lines":[{"line_number":7,"context_line":"WIP: Add a placement audit command"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When deleting instances, allocations can be orphaned. Adding a new nova-manage"},{"line_number":10,"context_line":"command to lookup at all compute nodes and check whether they have orphaned"},{"line_number":11,"context_line":"allocations."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I537ed74503d208957f0a97af3ab754a6750dac20"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7faddb67_b5734e80","line":10,"in_reply_to":"7faddb67_8f9cb9c0","updated":"2019-07-26 23:10:36.000000000","message":"I don\u0027t remember agreeing to that but we\u0027ve talked about this a few times with weeks in between so it\u0027s hard for me to keep track.","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"}],"doc/source/cli/nova-manage.rst":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9c18b2140acba36585c3618245e94469a7152323","unresolved":false,"context_lines":[{"line_number":685,"context_line":"       * - 255"},{"line_number":686,"context_line":"         - An unexpected error occurred."},{"line_number":687,"context_line":""},{"line_number":688,"context_line":""},{"line_number":689,"context_line":"``nova-manage placement audit [--verbose] [--delete] [--resource_provider \u003cuuid\u003e]``"},{"line_number":690,"context_line":"    Iterates over all the Resource Providers (or just one if you provide the"},{"line_number":691,"context_line":"    UUID) and then verifies if the compute allocations are either related to"}],"source_content_type":"text/x-rst","patch_set":14,"id":"3fa7e38b_43cff953","line":688,"updated":"2020-02-19 10:56:03.000000000","message":"nit: extra newline","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"8d1155b835e1acf9bccc479ca1af8254bd1667e7","unresolved":false,"context_lines":[{"line_number":685,"context_line":"       * - 255"},{"line_number":686,"context_line":"         - An unexpected error occurred."},{"line_number":687,"context_line":""},{"line_number":688,"context_line":""},{"line_number":689,"context_line":"``nova-manage placement audit [--verbose] [--delete] [--resource_provider \u003cuuid\u003e]``"},{"line_number":690,"context_line":"    Iterates over all the Resource Providers (or just one if you provide the"},{"line_number":691,"context_line":"    UUID) and then verifies if the compute allocations are either related to"}],"source_content_type":"text/x-rst","patch_set":14,"id":"df33271e_7d17b246","line":688,"in_reply_to":"3fa7e38b_43cff953","updated":"2020-03-30 07:22:36.000000000","message":"Done","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"}],"nova/cmd/manage.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b5dd2f2f4aa1f9b98035e92253af0f1554d40926","unresolved":false,"context_lines":[{"line_number":2183,"context_line":"                                     compute_nodes):"},{"line_number":2184,"context_line":"        num_processed \u003d 0"},{"line_number":2185,"context_line":"        faults \u003d 0"},{"line_number":2186,"context_line":"        # FIXME(sbauza): Should we rather loop over RPs instead of CNs ?"},{"line_number":2187,"context_line":"        # If so, given we don\u0027t have pagination for RPs, we need to make sure"},{"line_number":2188,"context_line":"        # asking for *all* RPs wouldn\u0027t be a performance issue."},{"line_number":2189,"context_line":"        for cn in compute_nodes:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_71ee1fb5","line":2186,"updated":"2019-07-12 14:08:43.000000000","message":"This is what I said in the commit message and below.","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b5dd2f2f4aa1f9b98035e92253af0f1554d40926","unresolved":false,"context_lines":[{"line_number":2185,"context_line":"        faults \u003d 0"},{"line_number":2186,"context_line":"        # FIXME(sbauza): Should we rather loop over RPs instead of CNs ?"},{"line_number":2187,"context_line":"        # If so, given we don\u0027t have pagination for RPs, we need to make sure"},{"line_number":2188,"context_line":"        # asking for *all* RPs wouldn\u0027t be a performance issue."},{"line_number":2189,"context_line":"        for cn in compute_nodes:"},{"line_number":2190,"context_line":"            # Get all the active instances from this compute node"},{"line_number":2191,"context_line":"            # TODO(sbauza): We could prevent another loop by instead using"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_3132e760","line":2188,"updated":"2019-07-12 14:08:43.000000000","message":"I\u0027m not sure how much we care about performance in an audit command. Paging support in placement when listing resource providers could be nice in general though and might be something we could add later as a TODO.","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1d6d5a1877579cf37d8f857da416653a631ad72e","unresolved":false,"context_lines":[{"line_number":2185,"context_line":"        faults \u003d 0"},{"line_number":2186,"context_line":"        # FIXME(sbauza): Should we rather loop over RPs instead of CNs ?"},{"line_number":2187,"context_line":"        # If so, given we don\u0027t have pagination for RPs, we need to make sure"},{"line_number":2188,"context_line":"        # asking for *all* RPs wouldn\u0027t be a performance issue."},{"line_number":2189,"context_line":"        for cn in compute_nodes:"},{"line_number":2190,"context_line":"            # Get all the active instances from this compute node"},{"line_number":2191,"context_line":"            # TODO(sbauza): We could prevent another loop by instead using"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_ddb27349","line":2188,"in_reply_to":"7faddb67_3132e760","updated":"2019-07-15 09:50:34.000000000","message":"In some recent tests getting 10,000 allocation candidates (which is more expensive (by a _lot_) than getting a list of resource providers) took about 17 seconds.\n\nUntil we\u0027re exploring UIs that need to list unfiltered resource providers, I don\u0027t think we have a clear use case for server-side pagination.\n\nOr to put it another way: if you need fewer resource providers, ask a better question (make a better query).","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b5dd2f2f4aa1f9b98035e92253af0f1554d40926","unresolved":false,"context_lines":[{"line_number":2194,"context_line":"                ctxt, cn.host, cn.hypervisor_hostname, expected_attrs\u003d[])"},{"line_number":2195,"context_line":"            inst_uuids \u003d [instance.uuid for instance in instances]"},{"line_number":2196,"context_line":""},{"line_number":2197,"context_line":"            # Get all active migrations for this compute node"},{"line_number":2198,"context_line":"            migs \u003d objects.MigrationList.get_in_progress_by_host_and_node("},{"line_number":2199,"context_line":"                ctxt, cn.host, cn.node)"},{"line_number":2200,"context_line":"            mig_uuids \u003d [migration.uuid for migration in migs]"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_b13d772c","line":2197,"updated":"2019-07-12 14:08:43.000000000","message":"As I\u0027ve said elsewhere, we could have leaked migration-based allocations for end-state migrations, e.g. migrations that are in \u0027error\u0027 status. You wouldn\u0027t catch those here. This is another reason why I think we should be starting from what placement thinks is correct and working backward to verify in the nova database.","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1d6d5a1877579cf37d8f857da416653a631ad72e","unresolved":false,"context_lines":[{"line_number":2194,"context_line":"                ctxt, cn.host, cn.hypervisor_hostname, expected_attrs\u003d[])"},{"line_number":2195,"context_line":"            inst_uuids \u003d [instance.uuid for instance in instances]"},{"line_number":2196,"context_line":""},{"line_number":2197,"context_line":"            # Get all active migrations for this compute node"},{"line_number":2198,"context_line":"            migs \u003d objects.MigrationList.get_in_progress_by_host_and_node("},{"line_number":2199,"context_line":"                ctxt, cn.host, cn.node)"},{"line_number":2200,"context_line":"            mig_uuids \u003d [migration.uuid for migration in migs]"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_9d8abb67","line":2197,"in_reply_to":"7faddb67_b13d772c","updated":"2019-07-15 09:50:34.000000000","message":"I agree that what Matt says is the right order or processing.","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b5dd2f2f4aa1f9b98035e92253af0f1554d40926","unresolved":false,"context_lines":[{"line_number":2203,"context_line":"                # FIXME(sbauza): Make this method officially public"},{"line_number":2204,"context_line":"                rps_in_tree \u003d placement._get_providers_in_tree(ctxt, cn.uuid)"},{"line_number":2205,"context_line":"            except exception.ResourceProviderRetrievalFailed:"},{"line_number":2206,"context_line":"                print(_(\u0027Not able to find resource providers tree matching \u0027"},{"line_number":2207,"context_line":"                        \u0027the compute node UUID %s. Please check its \u0027"},{"line_number":2208,"context_line":"                        \u0027allocations manually.\u0027 % cn.uiid))"},{"line_number":2209,"context_line":"                faults +\u003d 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_71437fb0","line":2206,"range":{"start_line":2206,"start_character":22,"end_line":2206,"end_character":23},"updated":"2019-07-12 14:08:43.000000000","message":"I don\u0027t think we need to mark this stuff for translation since nova doesn\u0027t get translated anymore anyway.","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b5dd2f2f4aa1f9b98035e92253af0f1554d40926","unresolved":false,"context_lines":[{"line_number":2217,"context_line":"                            \u0027provider %s.\u0027 % rp[\u0027uuid\u0027]))"},{"line_number":2218,"context_line":"                    faults +\u003d 1"},{"line_number":2219,"context_line":"                    continue"},{"line_number":2220,"context_line":"                for consumer_uuid, consumer_resources in six.iteritems("},{"line_number":2221,"context_line":"                        pallocs.allocations):"},{"line_number":2222,"context_line":"                    consumer_allocs \u003d consumer_resources[\u0027resources\u0027]"},{"line_number":2223,"context_line":"                    if any(rc in NOVA_RCS"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_b126d714","line":2220,"updated":"2019-07-12 14:08:43.000000000","message":"This is now the 3rd for loop in this method. For sanity, can you please break this method apart into separate methods so it\u0027s not just a giant block of code with several nested loops.","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1d6d5a1877579cf37d8f857da416653a631ad72e","unresolved":false,"context_lines":[{"line_number":2217,"context_line":"                            \u0027provider %s.\u0027 % rp[\u0027uuid\u0027]))"},{"line_number":2218,"context_line":"                    faults +\u003d 1"},{"line_number":2219,"context_line":"                    continue"},{"line_number":2220,"context_line":"                for consumer_uuid, consumer_resources in six.iteritems("},{"line_number":2221,"context_line":"                        pallocs.allocations):"},{"line_number":2222,"context_line":"                    consumer_allocs \u003d consumer_resources[\u0027resources\u0027]"},{"line_number":2223,"context_line":"                    if any(rc in NOVA_RCS"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_3d7b877b","line":2220,"in_reply_to":"7faddb67_b126d714","updated":"2019-07-15 09:50:34.000000000","message":"++","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b5dd2f2f4aa1f9b98035e92253af0f1554d40926","unresolved":false,"context_lines":[{"line_number":2252,"context_line":"        return (num_processed, faults)"},{"line_number":2253,"context_line":""},{"line_number":2254,"context_line":"    @action_description("},{"line_number":2255,"context_line":"        _(\"Deletes orphaned allocations that are no longer corresponding to \""},{"line_number":2256,"context_line":"          \"existing instance resources. This command requires that \""},{"line_number":2257,"context_line":"          \"the [api_database]/connection and [placement] configuration \""},{"line_number":2258,"context_line":"          \"options are set.\"))"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_b17c971f","line":2255,"updated":"2019-07-12 14:08:43.000000000","message":"This is a bit confusing. The command is called \u0027audit\u0027 so by default I\u0027d expect an audit style command to just give me a report, with perhaps an option to cleanup (delete) any orphans it finds.","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b5dd2f2f4aa1f9b98035e92253af0f1554d40926","unresolved":false,"context_lines":[{"line_number":2278,"context_line":"        \"\"\""},{"line_number":2279,"context_line":""},{"line_number":2280,"context_line":"        # TODO(sbauza): Are we sure we have all Nova RCs ?"},{"line_number":2281,"context_line":"        NOVA_RCS \u003d [orc.VCPU, orc.MEMORY_MB, orc.DISK_GB, orc.VGPU]"},{"line_number":2282,"context_line":""},{"line_number":2283,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":2284,"context_line":"        output \u003d lambda msg: None"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_b1a1f796","line":2281,"range":{"start_line":2281,"start_character":20,"end_line":2281,"end_character":43},"updated":"2019-07-12 14:08:43.000000000","message":"Aren\u0027t these really the only two we care about as far as identifying if it\u0027s nova-owned resources? Some instances won\u0027t have DISK_GB (volume-backed) or VGPU, but most/all would have VCPU/MEMORY_MB (well maybe VGPU allocations won\u0027t include VCPU? I\u0027m not sure - depends on how that admin setup the flavor).","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"cdfe6bb28181cb119561093cfbd76bfe57730239","unresolved":false,"context_lines":[{"line_number":2278,"context_line":"        \"\"\""},{"line_number":2279,"context_line":""},{"line_number":2280,"context_line":"        # TODO(sbauza): Are we sure we have all Nova RCs ?"},{"line_number":2281,"context_line":"        NOVA_RCS \u003d [orc.VCPU, orc.MEMORY_MB, orc.DISK_GB, orc.VGPU]"},{"line_number":2282,"context_line":""},{"line_number":2283,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":2284,"context_line":"        output \u003d lambda msg: None"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_8826b767","line":2281,"range":{"start_line":2281,"start_character":20,"end_line":2281,"end_character":43},"in_reply_to":"7faddb67_b1a1f796","updated":"2019-09-19 09:04:34.000000000","message":"I can make it a parameter for admins which want to check specific resource classes and just check by default VCPU and MEMORY_MB","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b5dd2f2f4aa1f9b98035e92253af0f1554d40926","unresolved":false,"context_lines":[{"line_number":2306,"context_line":"        # That would prevent checking compute nodes that were already verified"},{"line_number":2307,"context_line":"        marker \u003d None"},{"line_number":2308,"context_line":"        while True:"},{"line_number":2309,"context_line":"            compute_nodes \u003d context.scatter_gather_skip_cell0("},{"line_number":2310,"context_line":"                ctxt, objects.ComputeNodeList.get_by_pagination,"},{"line_number":2311,"context_line":"                max_count, marker)"},{"line_number":2312,"context_line":"            if compute_nodes:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_d1fd936e","line":2309,"updated":"2019-07-12 14:08:43.000000000","message":"As I mentioned in the commit message, I don\u0027t think going from the compute nodes is maybe the best way. For example, let\u0027s say the admin deleted a nova-compute service which leaked the resource provider because it still had migration-based allocations on it [1]. The nova-compute service restarted (or wasn\u0027t stopped and the update_available_resource periodic ran and created a new resource provider for a new compute node record with a new uuid). In that case we could still have allocations against an orphaned old resource provider which no longer has a compute node - although in fairness that likely might not hurt scheduling because placement could return that resource provider but the scheduler would filter it out b/c there wouldn\u0027t be a compute node for it. That\u0027s not the end of the world, but it does mean there are orphaned things in placement which do potentially affect scheduling (especially if you configure the scheduler and set max_placement_results low like CERN does).\n\n[1] http://lists.openstack.org/pipermail/openstack-discuss/2019-June/007097.html","commit_id":"3eac2377c5e341e7fe8cd12e7f360cf6b19692dd"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"783aa1c0c8c3258c0647fb864b29ee33cacf6ba8","unresolved":false,"context_lines":[{"line_number":2698,"context_line":"        if uuid is not None:"},{"line_number":2699,"context_line":"            url +\u003d \u0027?uuid\u003d%s\u0027 % uuid"},{"line_number":2700,"context_line":"        resp \u003d self.get(url, global_request_id\u003dcontext.global_id)"},{"line_number":2701,"context_line":"        if not resp:"},{"line_number":2702,"context_line":"            raise exception.PlacementAPIConnectFailure()"},{"line_number":2703,"context_line":"        if uuid is not None and resp.status_code \u003d\u003d \u0027404\u0027:"},{"line_number":2704,"context_line":"            raise exception.ResourceProviderNotFound(name_or_uuid\u003duuid)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_cc54ca00","line":2701,"updated":"2019-08-05 13:33:59.000000000","message":"When you bool a requests.Response is runs \u0027self.ok\u0027 which translates to status_code \u003c 400. So unless ksa has done some jiggery pokery with that interface (which would be horrible) this will raise ConnectFailure on a 404.\n\nAlso, you\u0027ll never get a 404 from GET /resource_providers because it is a collection resources. Instead you\u0027ll get a response like:\n\n    GET http://ds1:8000/resource_providers?uuid\u003d$(uuidgen)\n    {\"resource_providers\": []}\n\nSo you\u0027ll either need to check the length of the resource_providers attribute in the response, or, when getting a single resource provider, actually GET it: GET /resource_providers/{uuid} , not filter by uuid.","commit_id":"59a5aab5ecd838e29e6628bc236045c3444311ef"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"783aa1c0c8c3258c0647fb864b29ee33cacf6ba8","unresolved":false,"context_lines":[{"line_number":2761,"context_line":"            resource_providers \u003d self._get_resource_providers(ctxt, rp_uuid)"},{"line_number":2762,"context_line":"        else:"},{"line_number":2763,"context_line":"            # NOTE(sbauza): Do we want to have the Placement API supporting"},{"line_number":2764,"context_line":"            # pagination ?"},{"line_number":2765,"context_line":"            resource_providers \u003d self._get_resource_providers(ctxt)"},{"line_number":2766,"context_line":""},{"line_number":2767,"context_line":"        checked_rps \u003d 0"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_2ca0fef3","line":2764,"updated":"2019-08-05 13:33:59.000000000","message":"I really wouldn\u0027t worry about that. Placement can return several thousand resource providers in well under a second and the volume of data is fairly small, especially when considering that it will be thrown away after the command line finishes.","commit_id":"59a5aab5ecd838e29e6628bc236045c3444311ef"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"91817b04a890004bfbab6cf4ac9bd71220728609","unresolved":false,"context_lines":[{"line_number":2766,"context_line":"        faults \u003d 0"},{"line_number":2767,"context_line":""},{"line_number":2768,"context_line":"        if rp_uuid:"},{"line_number":2769,"context_line":"            resource_providers \u003d self._get_resource_providers(ctxt, rp_uuid)"},{"line_number":2770,"context_line":"        else:"},{"line_number":2771,"context_line":"            resource_providers \u003d self._get_resource_providers(ctxt)"},{"line_number":2772,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_6c6a1d82","line":2769,"range":{"start_line":2769,"start_character":0,"end_line":2769,"end_character":76},"updated":"2019-08-26 09:47:35.000000000","message":"we might want to pass in the placement client above since this function needs one.","commit_id":"2f867bd78c617bdd4e55e2b51d11533c4418a6ac"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"02c92e8ea2859116ed91be44bbf29f94080c8ba5","unresolved":false,"context_lines":[{"line_number":2666,"context_line":"            cn_host, cn_node \u003d self.cn_uuid_mapping[cn_uuid]"},{"line_number":2667,"context_line":"        else:"},{"line_number":2668,"context_line":"            try:"},{"line_number":2669,"context_line":"                cn \u003d objects.ComputeNode.get_by_uuid(ctxt, cn_uuid)"},{"line_number":2670,"context_line":"            except exception.ComputeHostNotFound:"},{"line_number":2671,"context_line":"                return ([], [])"},{"line_number":2672,"context_line":"            cn_host, cn_node \u003d (cn.host, cn.hypervisor_hostname)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_af93d25a","line":2669,"updated":"2019-09-24 12:34:15.000000000","message":"Do we need to target the context already here?","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f5a74abafb0e7aa82428cde961c8b24946f88615","unresolved":false,"context_lines":[{"line_number":2666,"context_line":"            cn_host, cn_node \u003d self.cn_uuid_mapping[cn_uuid]"},{"line_number":2667,"context_line":"        else:"},{"line_number":2668,"context_line":"            try:"},{"line_number":2669,"context_line":"                cn \u003d objects.ComputeNode.get_by_uuid(ctxt, cn_uuid)"},{"line_number":2670,"context_line":"            except exception.ComputeHostNotFound:"},{"line_number":2671,"context_line":"                return ([], [])"},{"line_number":2672,"context_line":"            cn_host, cn_node \u003d (cn.host, cn.hypervisor_hostname)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_a3f10d04","line":2669,"in_reply_to":"3fa7e38b_af93d25a","updated":"2019-10-03 17:10:59.000000000","message":"Done","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"02c92e8ea2859116ed91be44bbf29f94080c8ba5","unresolved":false,"context_lines":[{"line_number":2668,"context_line":"            try:"},{"line_number":2669,"context_line":"                cn \u003d objects.ComputeNode.get_by_uuid(ctxt, cn_uuid)"},{"line_number":2670,"context_line":"            except exception.ComputeHostNotFound:"},{"line_number":2671,"context_line":"                return ([], [])"},{"line_number":2672,"context_line":"            cn_host, cn_node \u003d (cn.host, cn.hypervisor_hostname)"},{"line_number":2673,"context_line":"            self.cn_uuid_mapping[cn_uuid] \u003d (cn_host, cn_node)"},{"line_number":2674,"context_line":"        # Get all the active instances from this compute node"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_8f96164c","line":2671,"updated":"2019-09-24 12:34:15.000000000","message":"I would at least log something in this case.","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f5a74abafb0e7aa82428cde961c8b24946f88615","unresolved":false,"context_lines":[{"line_number":2668,"context_line":"            try:"},{"line_number":2669,"context_line":"                cn \u003d objects.ComputeNode.get_by_uuid(ctxt, cn_uuid)"},{"line_number":2670,"context_line":"            except exception.ComputeHostNotFound:"},{"line_number":2671,"context_line":"                return ([], [])"},{"line_number":2672,"context_line":"            cn_host, cn_node \u003d (cn.host, cn.hypervisor_hostname)"},{"line_number":2673,"context_line":"            self.cn_uuid_mapping[cn_uuid] \u003d (cn_host, cn_node)"},{"line_number":2674,"context_line":"        # Get all the active instances from this compute node"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_0bf84f7a","line":2671,"in_reply_to":"3fa7e38b_8f96164c","updated":"2019-10-03 17:10:59.000000000","message":"Done","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e9c0d46e3b0aa18783e6db369b0902eb576b3c06","unresolved":false,"context_lines":[{"line_number":2675,"context_line":"        if self.instances_mapping.get(cn_uuid):"},{"line_number":2676,"context_line":"            inst_uuids \u003d self.instances_mapping[cn_uuid]"},{"line_number":2677,"context_line":"        else:"},{"line_number":2678,"context_line":"            instances \u003d objects.InstanceList.get_by_host_and_node("},{"line_number":2679,"context_line":"                ctxt, cn_host, cn_node, expected_attrs\u003d[])"},{"line_number":2680,"context_line":"            inst_uuids \u003d [instance.uuid for instance in instances]"},{"line_number":2681,"context_line":"            self.instances_mapping[cn_uuid] \u003d inst_uuids"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_deb842e6","line":2678,"updated":"2019-09-24 11:25:38.000000000","message":"Don\u0027t we need to cell target the context here?","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f5a74abafb0e7aa82428cde961c8b24946f88615","unresolved":false,"context_lines":[{"line_number":2675,"context_line":"        if self.instances_mapping.get(cn_uuid):"},{"line_number":2676,"context_line":"            inst_uuids \u003d self.instances_mapping[cn_uuid]"},{"line_number":2677,"context_line":"        else:"},{"line_number":2678,"context_line":"            instances \u003d objects.InstanceList.get_by_host_and_node("},{"line_number":2679,"context_line":"                ctxt, cn_host, cn_node, expected_attrs\u003d[])"},{"line_number":2680,"context_line":"            inst_uuids \u003d [instance.uuid for instance in instances]"},{"line_number":2681,"context_line":"            self.instances_mapping[cn_uuid] \u003d inst_uuids"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_c312090a","line":2678,"in_reply_to":"3fa7e38b_deb842e6","updated":"2019-10-03 17:10:59.000000000","message":"Done","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e9c0d46e3b0aa18783e6db369b0902eb576b3c06","unresolved":false,"context_lines":[{"line_number":2694,"context_line":"                                                 delete):"},{"line_number":2695,"context_line":"        \"\"\"Finds orphaned allocations for a specific resource provider."},{"line_number":2696,"context_line":""},{"line_number":2697,"context_line":"        :param ctxt: cell-targeted nova.context.RequestContext"},{"line_number":2698,"context_line":"        :param placement: nova.scheduler.client.report.SchedulerReportClient"},{"line_number":2699,"context_line":"            to communicate with the Placement service API."},{"line_number":2700,"context_line":"        :param output: function that takes a single message for verbose output"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_be7b0679","line":2697,"range":{"start_line":2697,"start_character":21,"end_line":2697,"end_character":34},"updated":"2019-09-24 11:25:38.000000000","message":"Is it really cell targeted? I think the caller simply passes an admin context without targeting it.","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f5a74abafb0e7aa82428cde961c8b24946f88615","unresolved":false,"context_lines":[{"line_number":2694,"context_line":"                                                 delete):"},{"line_number":2695,"context_line":"        \"\"\"Finds orphaned allocations for a specific resource provider."},{"line_number":2696,"context_line":""},{"line_number":2697,"context_line":"        :param ctxt: cell-targeted nova.context.RequestContext"},{"line_number":2698,"context_line":"        :param placement: nova.scheduler.client.report.SchedulerReportClient"},{"line_number":2699,"context_line":"            to communicate with the Placement service API."},{"line_number":2700,"context_line":"        :param output: function that takes a single message for verbose output"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_83f411d1","line":2697,"range":{"start_line":2697,"start_character":21,"end_line":2697,"end_character":34},"in_reply_to":"3fa7e38b_be7b0679","updated":"2019-10-03 17:10:59.000000000","message":"Done","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e9c0d46e3b0aa18783e6db369b0902eb576b3c06","unresolved":false,"context_lines":[{"line_number":2705,"context_line":"        num_processed \u003d 0"},{"line_number":2706,"context_line":"        faults \u003d 0"},{"line_number":2707,"context_line":""},{"line_number":2708,"context_line":"        # TODO(sbauza): Are we sure we have all Nova RCs ?"},{"line_number":2709,"context_line":"        # FIXME(sbauza): Possibly use consumer types once Placement API"},{"line_number":2710,"context_line":"        # supports them."},{"line_number":2711,"context_line":"        # NOTE(sbauza): We check allocations having *any* below RC, not having"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_5eba120a","line":2708,"updated":"2019-09-24 11:25:38.000000000","message":"These are used by nova as well:\n\nNET_BW_[EI]GR_KILOBIT_PER_SEC\nPCPU\nMEM_ENCRYPTION_CONTEXT","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f5a74abafb0e7aa82428cde961c8b24946f88615","unresolved":false,"context_lines":[{"line_number":2705,"context_line":"        num_processed \u003d 0"},{"line_number":2706,"context_line":"        faults \u003d 0"},{"line_number":2707,"context_line":""},{"line_number":2708,"context_line":"        # TODO(sbauza): Are we sure we have all Nova RCs ?"},{"line_number":2709,"context_line":"        # FIXME(sbauza): Possibly use consumer types once Placement API"},{"line_number":2710,"context_line":"        # supports them."},{"line_number":2711,"context_line":"        # NOTE(sbauza): We check allocations having *any* below RC, not having"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_332592ac","line":2708,"in_reply_to":"3fa7e38b_5eba120a","updated":"2019-10-03 17:10:59.000000000","message":"Done","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e9c0d46e3b0aa18783e6db369b0902eb576b3c06","unresolved":false,"context_lines":[{"line_number":2732,"context_line":""},{"line_number":2733,"context_line":"        # Verify every allocations for each consumer UUID"},{"line_number":2734,"context_line":"        for consumer_uuid, consumer_resources in six.iteritems("},{"line_number":2735,"context_line":"                pallocs.allocations):"},{"line_number":2736,"context_line":"            consumer_allocs \u003d consumer_resources[\u0027resources\u0027]"},{"line_number":2737,"context_line":"            if any(rc in NOVA_RCS"},{"line_number":2738,"context_line":"                   for rc in consumer_allocs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_1e1b3ad0","line":2735,"range":{"start_line":2735,"start_character":24,"end_line":2735,"end_character":35},"updated":"2019-09-24 11:25:38.000000000","message":"we access the same consumer from multiple RP perspective. This seems inefficient. If I have an orphaned instance allocation (the instance is deleted from nova side but somehow the allocation remained in placement) that allocates from multiple RPs in the same RP tree (e.g. bandwidth). Then the code below will delete the allocations RP by RP instead of delete the whole consumer as it was an instance which does not exists any more.","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f5a74abafb0e7aa82428cde961c8b24946f88615","unresolved":false,"context_lines":[{"line_number":2732,"context_line":""},{"line_number":2733,"context_line":"        # Verify every allocations for each consumer UUID"},{"line_number":2734,"context_line":"        for consumer_uuid, consumer_resources in six.iteritems("},{"line_number":2735,"context_line":"                pallocs.allocations):"},{"line_number":2736,"context_line":"            consumer_allocs \u003d consumer_resources[\u0027resources\u0027]"},{"line_number":2737,"context_line":"            if any(rc in NOVA_RCS"},{"line_number":2738,"context_line":"                   for rc in consumer_allocs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_f31cda14","line":2735,"range":{"start_line":2735,"start_character":24,"end_line":2735,"end_character":35},"in_reply_to":"3fa7e38b_1e1b3ad0","updated":"2019-10-03 17:10:59.000000000","message":"We unfortunately have to make a trade-off.\nSince allocations can be for deleted instances in Nova, it\u0027s not like heal_allocations where we can loop over the instances. Instead, we need to check *every* RP and verify every allocation to see whether it\u0027s used. That\u0027s also why I wanted to provide a specific RP UUID argument.","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e9c0d46e3b0aa18783e6db369b0902eb576b3c06","unresolved":false,"context_lines":[{"line_number":2769,"context_line":"                                        \u0027for consumer UUID %s\u0027)"},{"line_number":2770,"context_line":"                                      % consumer_uuid)"},{"line_number":2771,"context_line":"                                faults +\u003d 1"},{"line_number":2772,"context_line":"                                continue"},{"line_number":2773,"context_line":"                        else:"},{"line_number":2774,"context_line":"                            try:"},{"line_number":2775,"context_line":"                                placement.delete_allocation_for_instance("}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_5ea69255","line":2772,"updated":"2019-09-24 11:25:38.000000000","message":"this gets highly nested I would pull out some functions","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f5a74abafb0e7aa82428cde961c8b24946f88615","unresolved":false,"context_lines":[{"line_number":2769,"context_line":"                                        \u0027for consumer UUID %s\u0027)"},{"line_number":2770,"context_line":"                                      % consumer_uuid)"},{"line_number":2771,"context_line":"                                faults +\u003d 1"},{"line_number":2772,"context_line":"                                continue"},{"line_number":2773,"context_line":"                        else:"},{"line_number":2774,"context_line":"                            try:"},{"line_number":2775,"context_line":"                                placement.delete_allocation_for_instance("}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_39178cf0","line":2772,"in_reply_to":"3fa7e38b_5ea69255","updated":"2019-10-03 17:10:59.000000000","message":"Done","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e9c0d46e3b0aa18783e6db369b0902eb576b3c06","unresolved":false,"context_lines":[{"line_number":2798,"context_line":"        return (num_processed, faults)"},{"line_number":2799,"context_line":""},{"line_number":2800,"context_line":"    # TODO(sbauza): Move this to the scheduler report client ?"},{"line_number":2801,"context_line":"    def _get_resource_providers(self, context, placement, uuid\u003dNone):"},{"line_number":2802,"context_line":"        \"\"\"Returns all resource providers regardless of their relationships."},{"line_number":2803,"context_line":""},{"line_number":2804,"context_line":"        :param context: The nova.context.RequestContext auth context"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_bea226fb","line":2801,"updated":"2019-09-24 11:25:38.000000000","message":"I would split this into too methods one for the plural and on for the singular use. that would result in two simple function instead of the current function with conditionals.","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f5a74abafb0e7aa82428cde961c8b24946f88615","unresolved":false,"context_lines":[{"line_number":2798,"context_line":"        return (num_processed, faults)"},{"line_number":2799,"context_line":""},{"line_number":2800,"context_line":"    # TODO(sbauza): Move this to the scheduler report client ?"},{"line_number":2801,"context_line":"    def _get_resource_providers(self, context, placement, uuid\u003dNone):"},{"line_number":2802,"context_line":"        \"\"\"Returns all resource providers regardless of their relationships."},{"line_number":2803,"context_line":""},{"line_number":2804,"context_line":"        :param context: The nova.context.RequestContext auth context"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_3312720b","line":2801,"in_reply_to":"3fa7e38b_bea226fb","updated":"2019-10-03 17:10:59.000000000","message":"Done","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e9c0d46e3b0aa18783e6db369b0902eb576b3c06","unresolved":false,"context_lines":[{"line_number":2831,"context_line":"          \"options are set.\"))"},{"line_number":2832,"context_line":"    @args(\u0027--verbose\u0027, action\u003d\u0027store_true\u0027, dest\u003d\u0027verbose\u0027, default\u003dFalse,"},{"line_number":2833,"context_line":"          help\u003d\u0027Provide verbose output during execution.\u0027)"},{"line_number":2834,"context_line":"    @args(\u0027--resource_provider\u0027, metavar\u003d\u0027\u003cprovider_uuid\u003e\u0027,"},{"line_number":2835,"context_line":"          dest\u003d\u0027provider_uuid\u0027,"},{"line_number":2836,"context_line":"          help\u003d\u0027UUID of a specific resource provider to verify.\u0027)"},{"line_number":2837,"context_line":"    @args(\u0027--delete\u0027, action\u003d\u0027store_true\u0027, dest\u003d\u0027verbose\u0027, default\u003dFalse,"},{"line_number":2838,"context_line":"          help\u003d\u0027Deletes orphaned allocations that were found.\u0027)"},{"line_number":2839,"context_line":"    def audit(self, verbose\u003dFalse, provider_uuid\u003dNone, delete\u003dFalse):"},{"line_number":2840,"context_line":"        \"\"\"Provides information about orphaned allocations that can be removed"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_de0b6221","line":2837,"range":{"start_line":2834,"start_character":1,"end_line":2837,"end_character":1},"updated":"2019-09-24 11:25:38.000000000","message":"Does it make sense to allow providing a child provider here? That would result that an orphaned instance allocation only be cleaned up partially.","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f5a74abafb0e7aa82428cde961c8b24946f88615","unresolved":false,"context_lines":[{"line_number":2831,"context_line":"          \"options are set.\"))"},{"line_number":2832,"context_line":"    @args(\u0027--verbose\u0027, action\u003d\u0027store_true\u0027, dest\u003d\u0027verbose\u0027, default\u003dFalse,"},{"line_number":2833,"context_line":"          help\u003d\u0027Provide verbose output during execution.\u0027)"},{"line_number":2834,"context_line":"    @args(\u0027--resource_provider\u0027, metavar\u003d\u0027\u003cprovider_uuid\u003e\u0027,"},{"line_number":2835,"context_line":"          dest\u003d\u0027provider_uuid\u0027,"},{"line_number":2836,"context_line":"          help\u003d\u0027UUID of a specific resource provider to verify.\u0027)"},{"line_number":2837,"context_line":"    @args(\u0027--delete\u0027, action\u003d\u0027store_true\u0027, dest\u003d\u0027verbose\u0027, default\u003dFalse,"},{"line_number":2838,"context_line":"          help\u003d\u0027Deletes orphaned allocations that were found.\u0027)"},{"line_number":2839,"context_line":"    def audit(self, verbose\u003dFalse, provider_uuid\u003dNone, delete\u003dFalse):"},{"line_number":2840,"context_line":"        \"\"\"Provides information about orphaned allocations that can be removed"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_137c1671","line":2837,"range":{"start_line":2834,"start_character":1,"end_line":2837,"end_character":1},"in_reply_to":"3fa7e38b_de0b6221","updated":"2019-10-03 17:10:59.000000000","message":"Operators having a huge number of computes would like to not iterate over their long list of providers and just say which one to verify, that\u0027s why I wanted this argument.","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e9c0d46e3b0aa18783e6db369b0902eb576b3c06","unresolved":false,"context_lines":[{"line_number":2863,"context_line":""},{"line_number":2864,"context_line":"        if provider_uuid:"},{"line_number":2865,"context_line":"            try:"},{"line_number":2866,"context_line":"                resource_providers \u003d self._get_resource_providers("},{"line_number":2867,"context_line":"                    ctxt, placement, provider_uuid)"},{"line_number":2868,"context_line":"            except exception.ResourceProviderNotFound:"},{"line_number":2869,"context_line":"                print(_(\u0027Resource provider with UUID %s does not exist.\u0027) %"},{"line_number":2870,"context_line":"                      provider_uuid)"},{"line_number":2871,"context_line":"                return 127"},{"line_number":2872,"context_line":"        else:"},{"line_number":2873,"context_line":"            resource_providers \u003d self._get_resource_providers(ctxt, placement)"},{"line_number":2874,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_7e6b4eb6","line":2871,"range":{"start_line":2866,"start_character":1,"end_line":2871,"end_character":26},"updated":"2019-09-24 11:25:38.000000000","message":"This feels strange to me. I would not try to re-use _get_resource_providers here as this reuse makes _get_resource_providers a lot more complex internally. I think two separate method would be better.","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f5a74abafb0e7aa82428cde961c8b24946f88615","unresolved":false,"context_lines":[{"line_number":2863,"context_line":""},{"line_number":2864,"context_line":"        if provider_uuid:"},{"line_number":2865,"context_line":"            try:"},{"line_number":2866,"context_line":"                resource_providers \u003d self._get_resource_providers("},{"line_number":2867,"context_line":"                    ctxt, placement, provider_uuid)"},{"line_number":2868,"context_line":"            except exception.ResourceProviderNotFound:"},{"line_number":2869,"context_line":"                print(_(\u0027Resource provider with UUID %s does not exist.\u0027) %"},{"line_number":2870,"context_line":"                      provider_uuid)"},{"line_number":2871,"context_line":"                return 127"},{"line_number":2872,"context_line":"        else:"},{"line_number":2873,"context_line":"            resource_providers \u003d self._get_resource_providers(ctxt, placement)"},{"line_number":2874,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_3381124c","line":2871,"range":{"start_line":2866,"start_character":1,"end_line":2871,"end_character":26},"in_reply_to":"3fa7e38b_7e6b4eb6","updated":"2019-10-03 17:10:59.000000000","message":"Done","commit_id":"c8e6f276e7570803f16463db7aa9278d4335ec52"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ec826aec1fb585c77c17108d23ad6edd3774b465","unresolved":false,"context_lines":[{"line_number":2701,"context_line":""},{"line_number":2702,"context_line":"    def _delete_allocations_from_consumer(self, ctxt, placement, provider,"},{"line_number":2703,"context_line":"                                          consumer_uuid):"},{"line_number":2704,"context_line":"        \"\"\"Finds orphaned allocations for a specific resource provider."},{"line_number":2705,"context_line":""},{"line_number":2706,"context_line":"        :param ctxt: nova.context.RequestContext"},{"line_number":2707,"context_line":"        :param placement: nova.scheduler.client.report.SchedulerReportClient"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_9997a03b","line":2704,"updated":"2019-10-03 17:17:41.000000000","message":"shit, bad copy/paste.","commit_id":"225ce1a7c70e9b649ad4bc34cb1b9b354a2a5d2b"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"1355f8e16e03383240cde43f35497f4185f891d6","unresolved":false,"context_lines":[{"line_number":2862,"context_line":"        \"\"\""},{"line_number":2863,"context_line":"        if url is None:"},{"line_number":2864,"context_line":"            url \u003d \u0027/resource_providers\u0027"},{"line_number":2865,"context_line":"        resp \u003d placement.get(url, global_request_id\u003dcontext.global_id)"},{"line_number":2866,"context_line":"        if resp is None:"},{"line_number":2867,"context_line":"            raise exception.PlacementAPIConnectFailure()"},{"line_number":2868,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_4c69a822","line":2865,"updated":"2019-10-16 14:35:33.000000000","message":"I need to ask for a specific microversion here.","commit_id":"0063e207a77c4fac4cbc0d0a48aab920014a0a27"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1cfa7be7463a0c0b24ec5e9f1b775eb6047a7f5f","unresolved":false,"context_lines":[{"line_number":2918,"context_line":"                return 127"},{"line_number":2919,"context_line":"            resource_providers \u003d [resource_provider]"},{"line_number":2920,"context_line":"        else:"},{"line_number":2921,"context_line":"            resource_providers \u003d self._get_resource_providers(ctxt, placement)"},{"line_number":2922,"context_line":""},{"line_number":2923,"context_line":"        for provider in resource_providers:"},{"line_number":2924,"context_line":"            (nb_p, faults) \u003d self._check_orphaned_allocations_for_provider("}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_d2320ef2","line":2921,"range":{"start_line":2921,"start_character":38,"end_line":2921,"end_character":61},"updated":"2019-10-16 14:48:37.000000000","message":"Just a note since I brought it up in IRC. I was thinking we could pre-filter the list of providers to process by only getting back compute node providers by filtering like GET /resource_providers?resources\u003dMEMORY_MB:1 but that won\u0027t work for ironic node providers that are using a custom resource class only and not reporting MEMORY_MB.","commit_id":"0063e207a77c4fac4cbc0d0a48aab920014a0a27"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8d1d38167c4bae48b07ee79e376ba92602b8c139","unresolved":false,"context_lines":[{"line_number":2918,"context_line":"                return 127"},{"line_number":2919,"context_line":"            resource_providers \u003d [resource_provider]"},{"line_number":2920,"context_line":"        else:"},{"line_number":2921,"context_line":"            resource_providers \u003d self._get_resource_providers(ctxt, placement)"},{"line_number":2922,"context_line":""},{"line_number":2923,"context_line":"        for provider in resource_providers:"},{"line_number":2924,"context_line":"            (nb_p, faults) \u003d self._check_orphaned_allocations_for_provider("}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_380a6325","line":2921,"range":{"start_line":2921,"start_character":38,"end_line":2921,"end_character":61},"in_reply_to":"3fa7e38b_d2320ef2","updated":"2019-10-16 17:11:46.000000000","message":"https://review.opendev.org/#/c/688979/ will let you do it by asking for providers with the COMPUTE_NODE trait","commit_id":"0063e207a77c4fac4cbc0d0a48aab920014a0a27"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"aa3a3e11961e5ba00ae48a152fd1a8871a904756","unresolved":false,"context_lines":[{"line_number":2864,"context_line":"            url +\u003d \u0027\u0026uuid\u003d%s\u0027 % kwargs[\u0027uuid\u0027]"},{"line_number":2865,"context_line":""},{"line_number":2866,"context_line":"        resp \u003d placement.get(url, global_request_id\u003dcontext.global_id,"},{"line_number":2867,"context_line":"                             microversion\u003d\u00271.14\u0027)"},{"line_number":2868,"context_line":"        if resp is None:"},{"line_number":2869,"context_line":"            raise exception.PlacementAPIConnectFailure()"},{"line_number":2870,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_1a434db2","line":2867,"updated":"2019-11-15 16:07:15.000000000","message":"this should be version\u003d\u00271.14\u0027 as per https://github.com/openstack/nova/blob/c5d094ad3d2dca30b11baed980a7ce9dbe547c23/nova/scheduler/client/report.py#L235","commit_id":"4f95ccc91799ce45ae1325281d4feedc59841834"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"416bc1a5ae9093c648561911b29db07f2efb2c69","unresolved":false,"context_lines":[{"line_number":2864,"context_line":"            url +\u003d \u0027\u0026uuid\u003d%s\u0027 % kwargs[\u0027uuid\u0027]"},{"line_number":2865,"context_line":""},{"line_number":2866,"context_line":"        resp \u003d placement.get(url, global_request_id\u003dcontext.global_id,"},{"line_number":2867,"context_line":"                             microversion\u003d\u00271.14\u0027)"},{"line_number":2868,"context_line":"        if resp is None:"},{"line_number":2869,"context_line":"            raise exception.PlacementAPIConnectFailure()"},{"line_number":2870,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_9ae41daa","line":2867,"in_reply_to":"3fa7e38b_1a434db2","updated":"2019-11-15 16:11:49.000000000","message":"Why aren\u0027t your functional tests hitting this?","commit_id":"4f95ccc91799ce45ae1325281d4feedc59841834"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"96e9936fa2bd62c4bdfcc913df4a33b9369e4b05","unresolved":false,"context_lines":[{"line_number":2692,"context_line":"        # Get all *active* migrations for this compute node"},{"line_number":2693,"context_line":"        # NOTE(sbauza): Since migrations are transient, it\u0027s better to not"},{"line_number":2694,"context_line":"        # cache the results as they could be stale"},{"line_number":2695,"context_line":"        with context.target_cell(ctxt, cell_mapping) as cctxt:"},{"line_number":2696,"context_line":"            migs \u003d objects.MigrationList.get_in_progress_by_host_and_node("},{"line_number":2697,"context_line":"                cctxt, cn_host, cn_node)"},{"line_number":2698,"context_line":"        mig_uuids \u003d [migration.uuid for migration in migs]"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_3df5e351","line":2695,"updated":"2019-11-15 16:50:49.000000000","message":"here cell_mapping might be undefined\n\nstack@aio:/opt/stack/nova$ nova-manage placement audit --verbose\nDEBUG nova.context [None req-ade15d3c-06cb-48c9-9602-50e9bada8bf0 None None] Found 2 cells: 00000000-0000-0000-0000-000000000000(cell0),595eb732-a928-46b9-8d33-f69d448cc38a(cell1) {{(pid\u003d7751) load_cells /opt/stack/nova/nova/context.py:469}}\nAn error has occurred:\nTraceback (most recent call last):\n  File \"/opt/stack/nova/nova/cmd/manage.py\", line 2994, in main\n    ret \u003d fn(*fn_args, **fn_kwargs)\n  File \"/opt/stack/nova/nova/cmd/manage.py\", line 2931, in audit\n    ctxt, placement, output, provider, delete)\n  File \"/opt/stack/nova/nova/cmd/manage.py\", line 2779, in _check_orphaned_allocations_for_provider\n    result \u003d self._get_instances_and_current_migrations(ctxt, cn_uuid)\n  File \"/opt/stack/nova/nova/cmd/manage.py\", line 2699, in _get_instances_and_current_migrations\n    with context.target_cell(ctxt, cell_mapping) as cctxt:\nUnboundLocalError: local variable \u0027cell_mapping\u0027 referenced before assignment","commit_id":"802c0cd46f85bfd25fb57949798655abd95fa88c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3ea138632a739df70329c68668935561c8bcae2e","unresolved":false,"context_lines":[{"line_number":2884,"context_line":"    @args(\u0027--resource_provider\u0027, metavar\u003d\u0027\u003cprovider_uuid\u003e\u0027,"},{"line_number":2885,"context_line":"          dest\u003d\u0027provider_uuid\u0027,"},{"line_number":2886,"context_line":"          help\u003d\u0027UUID of a specific resource provider to verify.\u0027)"},{"line_number":2887,"context_line":"    @args(\u0027--delete\u0027, action\u003d\u0027store_true\u0027, dest\u003d\u0027verbose\u0027, default\u003dFalse,"},{"line_number":2888,"context_line":"          help\u003d\u0027Deletes orphaned allocations that were found.\u0027)"},{"line_number":2889,"context_line":"    def audit(self, verbose\u003dFalse, provider_uuid\u003dNone, delete\u003dFalse):"},{"line_number":2890,"context_line":"        \"\"\"Provides information about orphaned allocations that can be removed"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_8aaca188","line":2887,"range":{"start_line":2887,"start_character":49,"end_line":2887,"end_character":56},"updated":"2019-11-20 08:37:38.000000000","message":"this should be delete","commit_id":"742d48ca0786bc880ccfd80de2332cb10d1ed99a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f9c9f0f4a06773dfc80c36d0f03c64c899ce2a46","unresolved":false,"context_lines":[{"line_number":2692,"context_line":""},{"line_number":2693,"context_line":"        # Get all *active* migrations for this compute node"},{"line_number":2694,"context_line":"        # NOTE(sbauza): Since migrations are transient, it\u0027s better to not"},{"line_number":2695,"context_line":"        # cache the results as they could be stale"},{"line_number":2696,"context_line":"        with context.target_cell(ctxt, cell_mapping) as cctxt:"},{"line_number":2697,"context_line":"            migs \u003d objects.MigrationList.get_in_progress_by_host_and_node("},{"line_number":2698,"context_line":"                cctxt, cn_host, cn_node)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_1f516d64","line":2695,"updated":"2019-11-27 09:45:00.000000000","message":"+1","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"47387f047af2697173a320104b1d89f5743408a3","unresolved":false,"context_lines":[{"line_number":2734,"context_line":""},{"line_number":2735,"context_line":"        else:"},{"line_number":2736,"context_line":"            try:"},{"line_number":2737,"context_line":"                placement.delete_allocation_for_instance("},{"line_number":2738,"context_line":"                    ctxt, consumer_uuid)"},{"line_number":2739,"context_line":"            except exception.AllocationDeleteFailed:"},{"line_number":2740,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_2426fccc","line":2737,"updated":"2019-11-20 15:41:19.000000000","message":"Pass consumer_type through to this since it defaults to \u0027instance\u0027 which is confusing if you\u0027re deleting allocations for a migration record.","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0ccd59481c4e6608a7c0482e54e6f2899a1b63a5","unresolved":false,"context_lines":[{"line_number":2734,"context_line":""},{"line_number":2735,"context_line":"        else:"},{"line_number":2736,"context_line":"            try:"},{"line_number":2737,"context_line":"                placement.delete_allocation_for_instance("},{"line_number":2738,"context_line":"                    ctxt, consumer_uuid)"},{"line_number":2739,"context_line":"            except exception.AllocationDeleteFailed:"},{"line_number":2740,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_c564bf23","line":2737,"in_reply_to":"3fa7e38b_2426fccc","updated":"2020-01-08 17:05:55.000000000","message":"Done","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f9c9f0f4a06773dfc80c36d0f03c64c899ce2a46","unresolved":false,"context_lines":[{"line_number":2751,"context_line":"        :param output: function that takes a single message for verbose output"},{"line_number":2752,"context_line":"        :param provider: Resource Provider to look at."},{"line_number":2753,"context_line":"        :param delete: deletes the found orphaned allocations."},{"line_number":2754,"context_line":"        :return: a tuple (\u003cnumber of deleted allocs\u003e, \u003cnumber of faults\u003e)"},{"line_number":2755,"context_line":"        \"\"\""},{"line_number":2756,"context_line":"        num_processed \u003d 0"},{"line_number":2757,"context_line":"        faults \u003d 0"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_1f3acd34","line":2754,"range":{"start_line":2754,"start_character":27,"end_line":2754,"end_character":51},"updated":"2019-11-27 09:45:00.000000000","message":"I think it is just number of processed allocs, as deletion depends on the delete flag.","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0ccd59481c4e6608a7c0482e54e6f2899a1b63a5","unresolved":false,"context_lines":[{"line_number":2751,"context_line":"        :param output: function that takes a single message for verbose output"},{"line_number":2752,"context_line":"        :param provider: Resource Provider to look at."},{"line_number":2753,"context_line":"        :param delete: deletes the found orphaned allocations."},{"line_number":2754,"context_line":"        :return: a tuple (\u003cnumber of deleted allocs\u003e, \u003cnumber of faults\u003e)"},{"line_number":2755,"context_line":"        \"\"\""},{"line_number":2756,"context_line":"        num_processed \u003d 0"},{"line_number":2757,"context_line":"        faults \u003d 0"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_51134a02","line":2754,"range":{"start_line":2754,"start_character":27,"end_line":2754,"end_character":51},"in_reply_to":"3fa7e38b_1f3acd34","updated":"2020-01-08 17:05:55.000000000","message":"Done","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f9c9f0f4a06773dfc80c36d0f03c64c899ce2a46","unresolved":false,"context_lines":[{"line_number":2768,"context_line":""},{"line_number":2769,"context_line":"        # Since the RP can be a child RP, we need to get the root RP as it\u0027s"},{"line_number":2770,"context_line":"        # the compute node UUID"},{"line_number":2771,"context_line":"        # NOTE(sbauza): In case Placement doesn\u0027t support 1.14 microversion,"},{"line_number":2772,"context_line":"        # that means we don\u0027t have nested RPs."},{"line_number":2773,"context_line":"        cn_uuid \u003d provider.get(\"root_provider_uuid\") or provider[\u0027uuid\u0027]"},{"line_number":2774,"context_line":"        # Now get all the existing instances and active migrations for this"},{"line_number":2775,"context_line":"        # compute node"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_1f23ad08","line":2772,"range":{"start_line":2771,"start_character":0,"end_line":2772,"end_character":46},"updated":"2019-11-27 09:45:00.000000000","message":"note to myself: _get_resource_providers will blow if 1.14 is not supported.","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f9c9f0f4a06773dfc80c36d0f03c64c899ce2a46","unresolved":false,"context_lines":[{"line_number":2770,"context_line":"        # the compute node UUID"},{"line_number":2771,"context_line":"        # NOTE(sbauza): In case Placement doesn\u0027t support 1.14 microversion,"},{"line_number":2772,"context_line":"        # that means we don\u0027t have nested RPs."},{"line_number":2773,"context_line":"        cn_uuid \u003d provider.get(\"root_provider_uuid\") or provider[\u0027uuid\u0027]"},{"line_number":2774,"context_line":"        # Now get all the existing instances and active migrations for this"},{"line_number":2775,"context_line":"        # compute node"},{"line_number":2776,"context_line":"        result \u003d self._get_instances_and_current_migrations(ctxt, cn_uuid)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_7f83c1cc","line":2773,"range":{"start_line":2773,"start_character":53,"end_line":2773,"end_character":72},"updated":"2019-11-27 09:45:00.000000000","message":"as we use microversion 1.14, this or clause will never be hit. The root_provider_uuid alway filled.\n\nstack@aio:~$ openstack --os-placement-api-version 1.14  resource provider list \n+--------------------------------------+--------------------------------+------------+--------------------------------------+--------------------------------------+\n| uuid                                 | name                           | generation | root_provider_uuid                   | parent_provider_uuid                 |\n+--------------------------------------+--------------------------------+------------+--------------------------------------+--------------------------------------+\n| 737d9a03-3f8d-4740-9b3b-933fac0dded9 | aio                            |          3 | 737d9a03-3f8d-4740-9b3b-933fac0dded9 | None                                 |\n| 31b21568-8d05-5d9c-a045-6956ac62790a | aio:Open vSwitch agent         |          0 | 737d9a03-3f8d-4740-9b3b-933fac0dded9 | 737d9a03-3f8d-4740-9b3b-933fac0dded9 |\n| 1110cf59-cabf-526c-bacc-08baabbac692 | aio:Open vSwitch agent:br-test |          2 | 737d9a03-3f8d-4740-9b3b-933fac0dded9 | 31b21568-8d05-5d9c-a045-6956ac62790a |\n| 9734f92c-16da-585b-a19c-e3d4f30302fe | aio:NIC Switch agent           |          0 | 737d9a03-3f8d-4740-9b3b-933fac0dded9 | 737d9a03-3f8d-4740-9b3b-933fac0dded9 |\n+--------------------------------------+--------------------------------+------------+--------------------------------------+--------------------------------------+","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0ccd59481c4e6608a7c0482e54e6f2899a1b63a5","unresolved":false,"context_lines":[{"line_number":2770,"context_line":"        # the compute node UUID"},{"line_number":2771,"context_line":"        # NOTE(sbauza): In case Placement doesn\u0027t support 1.14 microversion,"},{"line_number":2772,"context_line":"        # that means we don\u0027t have nested RPs."},{"line_number":2773,"context_line":"        cn_uuid \u003d provider.get(\"root_provider_uuid\") or provider[\u0027uuid\u0027]"},{"line_number":2774,"context_line":"        # Now get all the existing instances and active migrations for this"},{"line_number":2775,"context_line":"        # compute node"},{"line_number":2776,"context_line":"        result \u003d self._get_instances_and_current_migrations(ctxt, cn_uuid)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_9119c224","line":2773,"range":{"start_line":2773,"start_character":53,"end_line":2773,"end_character":72},"in_reply_to":"3fa7e38b_7f83c1cc","updated":"2020-01-08 17:05:55.000000000","message":"Done","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"47387f047af2697173a320104b1d89f5743408a3","unresolved":false,"context_lines":[{"line_number":2804,"context_line":"                             \u0027active migrations are related. \u0027)"},{"line_number":2805,"context_line":"                           % {\u0027consumer_uuid\u0027: consumer_uuid})"},{"line_number":2806,"context_line":"                    if delete:"},{"line_number":2807,"context_line":"                        deleted \u003d self._delete_allocations_from_consumer("},{"line_number":2808,"context_line":"                            ctxt, placement, provider, consumer_uuid)"},{"line_number":2809,"context_line":"                        if not deleted:"},{"line_number":2810,"context_line":"                            print(_(\u0027Not able to delete allocations \u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_4423f8be","line":2807,"updated":"2019-11-20 15:41:19.000000000","message":"Per gibi\u0027s comment about logging in the SchedulerReportClient, pass the consumer_type through this method based on if the consumer is an instance or migration.","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0ccd59481c4e6608a7c0482e54e6f2899a1b63a5","unresolved":false,"context_lines":[{"line_number":2804,"context_line":"                             \u0027active migrations are related. \u0027)"},{"line_number":2805,"context_line":"                           % {\u0027consumer_uuid\u0027: consumer_uuid})"},{"line_number":2806,"context_line":"                    if delete:"},{"line_number":2807,"context_line":"                        deleted \u003d self._delete_allocations_from_consumer("},{"line_number":2808,"context_line":"                            ctxt, placement, provider, consumer_uuid)"},{"line_number":2809,"context_line":"                        if not deleted:"},{"line_number":2810,"context_line":"                            print(_(\u0027Not able to delete allocations \u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_e5a3fb42","line":2807,"in_reply_to":"3fa7e38b_4423f8be","updated":"2020-01-08 17:05:55.000000000","message":"Done","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f9c9f0f4a06773dfc80c36d0f03c64c899ce2a46","unresolved":false,"context_lines":[{"line_number":2829,"context_line":"                    num_processed +\u003d 1"},{"line_number":2830,"context_line":"        return (num_processed, faults)"},{"line_number":2831,"context_line":""},{"line_number":2832,"context_line":"    # TODO(sbauza): Move this to the scheduler report client ?"},{"line_number":2833,"context_line":"    def _get_resource_provider(self, context, placement, uuid):"},{"line_number":2834,"context_line":"        \"\"\"Returns all resource providers regardless of their relationships."},{"line_number":2835,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_bfddb914","line":2832,"range":{"start_line":2832,"start_character":3,"end_line":2832,"end_character":62},"updated":"2019-11-27 09:45:00.000000000","message":"yeah, why not. And I would change the implementation to call  GET /resource_providers/{uuid} directly.","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0ccd59481c4e6608a7c0482e54e6f2899a1b63a5","unresolved":false,"context_lines":[{"line_number":2829,"context_line":"                    num_processed +\u003d 1"},{"line_number":2830,"context_line":"        return (num_processed, faults)"},{"line_number":2831,"context_line":""},{"line_number":2832,"context_line":"    # TODO(sbauza): Move this to the scheduler report client ?"},{"line_number":2833,"context_line":"    def _get_resource_provider(self, context, placement, uuid):"},{"line_number":2834,"context_line":"        \"\"\"Returns all resource providers regardless of their relationships."},{"line_number":2835,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_653e2be4","line":2832,"range":{"start_line":2832,"start_character":3,"end_line":2832,"end_character":62},"in_reply_to":"3fa7e38b_bfddb914","updated":"2020-01-08 17:05:55.000000000","message":"There are two ways of doing this, I tried in multiple revs :\n- a single factored method, accepting uuid as a param\n- two distinct methods, one wrapping the other\n\nI went back and forth with those two approaches, I\u0027m fine with sticking with one if all of us agree on which one to pick :-)","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f9c9f0f4a06773dfc80c36d0f03c64c899ce2a46","unresolved":false,"context_lines":[{"line_number":2831,"context_line":""},{"line_number":2832,"context_line":"    # TODO(sbauza): Move this to the scheduler report client ?"},{"line_number":2833,"context_line":"    def _get_resource_provider(self, context, placement, uuid):"},{"line_number":2834,"context_line":"        \"\"\"Returns all resource providers regardless of their relationships."},{"line_number":2835,"context_line":""},{"line_number":2836,"context_line":"        :param context: The nova.context.RequestContext auth context"},{"line_number":2837,"context_line":"        :param placement: nova.scheduler.client.report.SchedulerReportClient"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_ffbd71b1","line":2834,"range":{"start_line":2834,"start_character":11,"end_line":2834,"end_character":76},"updated":"2019-11-27 09:45:00.000000000","message":"This needs to be updated","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4b188f8b32226b5d2a86cf51d90361ef44d41d3e","unresolved":false,"context_lines":[{"line_number":2831,"context_line":""},{"line_number":2832,"context_line":"    # TODO(sbauza): Move this to the scheduler report client ?"},{"line_number":2833,"context_line":"    def _get_resource_provider(self, context, placement, uuid):"},{"line_number":2834,"context_line":"        \"\"\"Returns all resource providers regardless of their relationships."},{"line_number":2835,"context_line":""},{"line_number":2836,"context_line":"        :param context: The nova.context.RequestContext auth context"},{"line_number":2837,"context_line":"        :param placement: nova.scheduler.client.report.SchedulerReportClient"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_b480acf7","line":2834,"range":{"start_line":2834,"start_character":11,"end_line":2834,"end_character":76},"in_reply_to":"3fa7e38b_4570cfda","updated":"2020-01-09 13:18:10.000000000","message":"This function now returns one single ResourceProvider hence the function doc needs to be updated","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0ccd59481c4e6608a7c0482e54e6f2899a1b63a5","unresolved":false,"context_lines":[{"line_number":2831,"context_line":""},{"line_number":2832,"context_line":"    # TODO(sbauza): Move this to the scheduler report client ?"},{"line_number":2833,"context_line":"    def _get_resource_provider(self, context, placement, uuid):"},{"line_number":2834,"context_line":"        \"\"\"Returns all resource providers regardless of their relationships."},{"line_number":2835,"context_line":""},{"line_number":2836,"context_line":"        :param context: The nova.context.RequestContext auth context"},{"line_number":2837,"context_line":"        :param placement: nova.scheduler.client.report.SchedulerReportClient"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_4570cfda","line":2834,"range":{"start_line":2834,"start_character":11,"end_line":2834,"end_character":76},"in_reply_to":"3fa7e38b_ffbd71b1","updated":"2020-01-08 17:05:55.000000000","message":"Why ? Calling GET /resource_providers will return you a list of RPs without any hierarchy, even with version 1.14 :\nhttps://docs.openstack.org/api-ref/placement/?expanded\u003dshow-resource-provider-detail\n\nThat\u0027s the only returned object that will have more details, that\u0027s it.","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f9c9f0f4a06773dfc80c36d0f03c64c899ce2a46","unresolved":false,"context_lines":[{"line_number":2860,"context_line":"        :raises: keystoneauth1.exceptions.base.ClientException on failure to"},{"line_number":2861,"context_line":"                 communicate with the placement API"},{"line_number":2862,"context_line":"        \"\"\""},{"line_number":2863,"context_line":"        url \u003d \u0027/resource_providers\u0027"},{"line_number":2864,"context_line":"        if \u0027uuid\u0027 in kwargs:"},{"line_number":2865,"context_line":"            url +\u003d \u0027\u0026uuid\u003d%s\u0027 % kwargs[\u0027uuid\u0027]"},{"line_number":2866,"context_line":""},{"line_number":2867,"context_line":"        resp \u003d placement.get(url, global_request_id\u003dcontext.global_id,"},{"line_number":2868,"context_line":"                             version\u003d\u00271.14\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_7f00a167","line":2865,"range":{"start_line":2863,"start_character":0,"end_line":2865,"end_character":46},"updated":"2019-11-27 09:45:00.000000000","message":"I would move this logic to _get_resource_provider()","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0ccd59481c4e6608a7c0482e54e6f2899a1b63a5","unresolved":false,"context_lines":[{"line_number":2860,"context_line":"        :raises: keystoneauth1.exceptions.base.ClientException on failure to"},{"line_number":2861,"context_line":"                 communicate with the placement API"},{"line_number":2862,"context_line":"        \"\"\""},{"line_number":2863,"context_line":"        url \u003d \u0027/resource_providers\u0027"},{"line_number":2864,"context_line":"        if \u0027uuid\u0027 in kwargs:"},{"line_number":2865,"context_line":"            url +\u003d \u0027\u0026uuid\u003d%s\u0027 % kwargs[\u0027uuid\u0027]"},{"line_number":2866,"context_line":""},{"line_number":2867,"context_line":"        resp \u003d placement.get(url, global_request_id\u003dcontext.global_id,"},{"line_number":2868,"context_line":"                             version\u003d\u00271.14\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_8543276b","line":2865,"range":{"start_line":2863,"start_character":0,"end_line":2865,"end_character":46},"in_reply_to":"3fa7e38b_7f00a167","updated":"2020-01-08 17:05:55.000000000","message":"See above my comment","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f9c9f0f4a06773dfc80c36d0f03c64c899ce2a46","unresolved":false,"context_lines":[{"line_number":2938,"context_line":"            output(_(\u0027Processed %(num)s allocation%(suffix)s\u0027)"},{"line_number":2939,"context_line":"                   % {\u0027num\u0027: num_processed,"},{"line_number":2940,"context_line":"                      \u0027suffix\u0027: suffix})"},{"line_number":2941,"context_line":"            if faults \u003e 0:"},{"line_number":2942,"context_line":"                return 1"},{"line_number":2943,"context_line":"            return 4 if delete else 3"},{"line_number":2944,"context_line":"        return 0"},{"line_number":2945,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_dfee75b4","line":2942,"range":{"start_line":2941,"start_character":0,"end_line":2942,"end_character":24},"updated":"2019-11-27 09:45:00.000000000","message":"Can we hit this branch at all? As far as I see if we get fault back from _check_orphaned_allocations_for_provider() we exit immediately. And if there is 0 RPs then the fault is also always 0","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0ccd59481c4e6608a7c0482e54e6f2899a1b63a5","unresolved":false,"context_lines":[{"line_number":2938,"context_line":"            output(_(\u0027Processed %(num)s allocation%(suffix)s\u0027)"},{"line_number":2939,"context_line":"                   % {\u0027num\u0027: num_processed,"},{"line_number":2940,"context_line":"                      \u0027suffix\u0027: suffix})"},{"line_number":2941,"context_line":"            if faults \u003e 0:"},{"line_number":2942,"context_line":"                return 1"},{"line_number":2943,"context_line":"            return 4 if delete else 3"},{"line_number":2944,"context_line":"        return 0"},{"line_number":2945,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_5c018506","line":2942,"range":{"start_line":2941,"start_character":0,"end_line":2942,"end_character":24},"in_reply_to":"3fa7e38b_dfee75b4","updated":"2020-01-08 17:05:55.000000000","message":"Correct, I forgot to remove this branch.","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4b188f8b32226b5d2a86cf51d90361ef44d41d3e","unresolved":false,"context_lines":[{"line_number":2576,"context_line":""},{"line_number":2577,"context_line":"    # TODO(sbauza): Move this to the scheduler report client ?"},{"line_number":2578,"context_line":"    def _get_resource_provider(self, context, placement, uuid):"},{"line_number":2579,"context_line":"        \"\"\"Returns all resource providers regardless of their relationships."},{"line_number":2580,"context_line":""},{"line_number":2581,"context_line":"        :param context: The nova.context.RequestContext auth context"},{"line_number":2582,"context_line":"        :param placement: nova.scheduler.client.report.SchedulerReportClient"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_547b7827","line":2579,"updated":"2020-01-09 13:18:10.000000000","message":"This function now returns one single ResourceProvider hence the function doc needs to be updated","commit_id":"4572a900c58dd737da8d6866e01cfc655706615a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9c18b2140acba36585c3618245e94469a7152323","unresolved":false,"context_lines":[{"line_number":2454,"context_line":"        allocations \u003d placement.get_allocs_for_consumer("},{"line_number":2455,"context_line":"            ctxt, consumer_uuid)"},{"line_number":2456,"context_line":"        if len(allocations[\u0027allocations\u0027]) \u003e 1:"},{"line_number":2457,"context_line":"            # This consumer has resources spreaded amongst"},{"line_number":2458,"context_line":"            # multiple RPs (think nested or shared for example)"},{"line_number":2459,"context_line":"            # We then need to just update the usage to remove"},{"line_number":2460,"context_line":"            # the orphaned resources on the specific RP"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_1ede366b","line":2457,"range":{"start_line":2457,"start_character":42,"end_line":2457,"end_character":58},"updated":"2020-02-19 10:56:03.000000000","message":"spread among","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"8d1155b835e1acf9bccc479ca1af8254bd1667e7","unresolved":false,"context_lines":[{"line_number":2454,"context_line":"        allocations \u003d placement.get_allocs_for_consumer("},{"line_number":2455,"context_line":"            ctxt, consumer_uuid)"},{"line_number":2456,"context_line":"        if len(allocations[\u0027allocations\u0027]) \u003e 1:"},{"line_number":2457,"context_line":"            # This consumer has resources spreaded amongst"},{"line_number":2458,"context_line":"            # multiple RPs (think nested or shared for example)"},{"line_number":2459,"context_line":"            # We then need to just update the usage to remove"},{"line_number":2460,"context_line":"            # the orphaned resources on the specific RP"}],"source_content_type":"text/x-python","patch_set":14,"id":"df33271e_1d20269b","line":2457,"range":{"start_line":2457,"start_character":42,"end_line":2457,"end_character":58},"in_reply_to":"3fa7e38b_1ede366b","updated":"2020-03-30 07:22:36.000000000","message":"Done","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9c18b2140acba36585c3618245e94469a7152323","unresolved":false,"context_lines":[{"line_number":2640,"context_line":"        * 1: An unexpected error happened during run."},{"line_number":2641,"context_line":"        * 3: Orphaned allocations were detected."},{"line_number":2642,"context_line":"        * 4: Orphaned allocations were detected and deleted."},{"line_number":2643,"context_line":"        * 127: Invalid input."},{"line_number":2644,"context_line":"        \"\"\""},{"line_number":2645,"context_line":""},{"line_number":2646,"context_line":"        ctxt \u003d context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_1eb71625","line":2643,"updated":"2020-02-19 10:56:03.000000000","message":"Why not 255?\n\nLater: ah, we have prior art to consider here","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"8d1155b835e1acf9bccc479ca1af8254bd1667e7","unresolved":false,"context_lines":[{"line_number":2640,"context_line":"        * 1: An unexpected error happened during run."},{"line_number":2641,"context_line":"        * 3: Orphaned allocations were detected."},{"line_number":2642,"context_line":"        * 4: Orphaned allocations were detected and deleted."},{"line_number":2643,"context_line":"        * 127: Invalid input."},{"line_number":2644,"context_line":"        \"\"\""},{"line_number":2645,"context_line":""},{"line_number":2646,"context_line":"        ctxt \u003d context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":14,"id":"df33271e_7d3052e9","line":2643,"in_reply_to":"3fa7e38b_1eb71625","updated":"2020-03-30 07:22:36.000000000","message":"\u003e Why not 255?\n \u003e \n \u003e Later: ah, we have prior art to consider here\n\nCorrect. I used the same return code for consistency with other commands.","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9c18b2140acba36585c3618245e94469a7152323","unresolved":false,"context_lines":[{"line_number":2669,"context_line":"            resource_providers \u003d self._get_resource_providers(ctxt, placement)"},{"line_number":2670,"context_line":""},{"line_number":2671,"context_line":"        for provider in resource_providers:"},{"line_number":2672,"context_line":"            (nb_p, faults) \u003d self._check_orphaned_allocations_for_provider("},{"line_number":2673,"context_line":"                ctxt, placement, output, provider, delete)"},{"line_number":2674,"context_line":"            num_processed +\u003d nb_p"},{"line_number":2675,"context_line":"            if faults \u003e 0:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_fe331ac2","line":2672,"range":{"start_line":2672,"start_character":11,"end_line":2672,"end_character":27},"updated":"2020-02-19 10:56:03.000000000","message":"style nit: don\u0027t need those brackets","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"8d1155b835e1acf9bccc479ca1af8254bd1667e7","unresolved":false,"context_lines":[{"line_number":2669,"context_line":"            resource_providers \u003d self._get_resource_providers(ctxt, placement)"},{"line_number":2670,"context_line":""},{"line_number":2671,"context_line":"        for provider in resource_providers:"},{"line_number":2672,"context_line":"            (nb_p, faults) \u003d self._check_orphaned_allocations_for_provider("},{"line_number":2673,"context_line":"                ctxt, placement, output, provider, delete)"},{"line_number":2674,"context_line":"            num_processed +\u003d nb_p"},{"line_number":2675,"context_line":"            if faults \u003e 0:"}],"source_content_type":"text/x-python","patch_set":14,"id":"df33271e_9d61d6d6","line":2672,"range":{"start_line":2672,"start_character":11,"end_line":2672,"end_character":27},"in_reply_to":"3fa7e38b_fe331ac2","updated":"2020-03-30 07:22:36.000000000","message":"\u003e style nit: don\u0027t need those brackets\n\nYeah, agreed. I\u0027ll change it, but fwiw I prefer to explicitly say it\u0027s a tuple as it\u0027s what a method returns.","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"}],"nova/tests/functional/test_nova_manage.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f9c9f0f4a06773dfc80c36d0f03c64c899ce2a46","unresolved":false,"context_lines":[{"line_number":1382,"context_line":"        integrated_helpers.ProviderUsageBaseTestCase):"},{"line_number":1383,"context_line":"    \"\"\"Functional tests for nova-manage placement audit\"\"\""},{"line_number":1384,"context_line":""},{"line_number":1385,"context_line":"    # This is required by the parent class."},{"line_number":1386,"context_line":"    compute_driver \u003d \u0027fake.SmallFakeDriver\u0027"},{"line_number":1387,"context_line":""},{"line_number":1388,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_3f81c9a1","line":1385,"updated":"2019-11-27 09:45:00.000000000","message":"It is more like: you need a virt driver to boot up servers below :)","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0ccd59481c4e6608a7c0482e54e6f2899a1b63a5","unresolved":false,"context_lines":[{"line_number":1382,"context_line":"        integrated_helpers.ProviderUsageBaseTestCase):"},{"line_number":1383,"context_line":"    \"\"\"Functional tests for nova-manage placement audit\"\"\""},{"line_number":1384,"context_line":""},{"line_number":1385,"context_line":"    # This is required by the parent class."},{"line_number":1386,"context_line":"    compute_driver \u003d \u0027fake.SmallFakeDriver\u0027"},{"line_number":1387,"context_line":""},{"line_number":1388,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_4e877db4","line":1385,"in_reply_to":"3fa7e38b_3f81c9a1","updated":"2020-01-08 17:05:55.000000000","message":"Done","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f9c9f0f4a06773dfc80c36d0f03c64c899ce2a46","unresolved":false,"context_lines":[{"line_number":1401,"context_line":"        self.useFixture(fixtures.MonkeyPatch(\u0027sys.stdout\u0027, self.output))"},{"line_number":1402,"context_line":""},{"line_number":1403,"context_line":"        self.flavor \u003d self.api.get_flavors()[0]"},{"line_number":1404,"context_line":"        # we need to mock some calls to placement"},{"line_number":1405,"context_line":"        self.useFixture(cast_as_call.CastAsCall(self))"},{"line_number":1406,"context_line":""},{"line_number":1407,"context_line":"    def _delete_instance_but_keep_its_allocations(self, server):"},{"line_number":1408,"context_line":"        \"\"\"Mocks out the call to Placement for deleting the allocations but"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_ff8a51ba","line":1405,"range":{"start_line":1404,"start_character":0,"end_line":1405,"end_character":54},"updated":"2019-11-27 09:45:00.000000000","message":"This feels unnecessary. Just move the \n\nself._wait_until_deleted(server) and  self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027) under the mock context manager below.","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0ccd59481c4e6608a7c0482e54e6f2899a1b63a5","unresolved":false,"context_lines":[{"line_number":1401,"context_line":"        self.useFixture(fixtures.MonkeyPatch(\u0027sys.stdout\u0027, self.output))"},{"line_number":1402,"context_line":""},{"line_number":1403,"context_line":"        self.flavor \u003d self.api.get_flavors()[0]"},{"line_number":1404,"context_line":"        # we need to mock some calls to placement"},{"line_number":1405,"context_line":"        self.useFixture(cast_as_call.CastAsCall(self))"},{"line_number":1406,"context_line":""},{"line_number":1407,"context_line":"    def _delete_instance_but_keep_its_allocations(self, server):"},{"line_number":1408,"context_line":"        \"\"\"Mocks out the call to Placement for deleting the allocations but"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_c2efbc19","line":1405,"range":{"start_line":1404,"start_character":0,"end_line":1405,"end_character":54},"in_reply_to":"3fa7e38b_ff8a51ba","updated":"2020-01-08 17:05:55.000000000","message":"Done","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f9c9f0f4a06773dfc80c36d0f03c64c899ce2a46","unresolved":false,"context_lines":[{"line_number":1412,"context_line":"        with mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":1413,"context_line":"                        \u0027delete_allocation_for_instance\u0027):"},{"line_number":1414,"context_line":"            self.api.delete_server(server[\u0027id\u0027])"},{"line_number":1415,"context_line":"        self._wait_until_deleted(server)"},{"line_number":1416,"context_line":""},{"line_number":1417,"context_line":"    def test_audit_orphaned_allocation_from_instance_delete(self):"},{"line_number":1418,"context_line":"        \"\"\"Creates a server and deletes it by retaining its allocations so the"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_ca179546","line":1415,"updated":"2019-11-27 09:45:00.000000000","message":"just to be sure move this under the context manager to keep the report client delete mocked until the whole delete server finishes.","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0ccd59481c4e6608a7c0482e54e6f2899a1b63a5","unresolved":false,"context_lines":[{"line_number":1412,"context_line":"        with mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":1413,"context_line":"                        \u0027delete_allocation_for_instance\u0027):"},{"line_number":1414,"context_line":"            self.api.delete_server(server[\u0027id\u0027])"},{"line_number":1415,"context_line":"        self._wait_until_deleted(server)"},{"line_number":1416,"context_line":""},{"line_number":1417,"context_line":"    def test_audit_orphaned_allocation_from_instance_delete(self):"},{"line_number":1418,"context_line":"        \"\"\"Creates a server and deletes it by retaining its allocations so the"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_82d54449","line":1415,"in_reply_to":"3fa7e38b_ca179546","updated":"2020-01-08 17:05:55.000000000","message":"Done","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f9c9f0f4a06773dfc80c36d0f03c64c899ce2a46","unresolved":false,"context_lines":[{"line_number":1427,"context_line":"        with mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":1428,"context_line":"                        \u0027delete_allocation_for_instance\u0027):"},{"line_number":1429,"context_line":"            self.api.delete_server(server[\u0027id\u0027])"},{"line_number":1430,"context_line":"        self._wait_until_deleted(server)"},{"line_number":1431,"context_line":""},{"line_number":1432,"context_line":"        # make sure the allocation is still around"},{"line_number":1433,"context_line":"        self.assertFlavorMatchesUsage(rp_uuid, self.flavor)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_ea14d143","line":1430,"updated":"2019-11-27 09:45:00.000000000","message":"move it under the context manager so you will not need the CastAsCall fixture.","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0ccd59481c4e6608a7c0482e54e6f2899a1b63a5","unresolved":false,"context_lines":[{"line_number":1427,"context_line":"        with mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":1428,"context_line":"                        \u0027delete_allocation_for_instance\u0027):"},{"line_number":1429,"context_line":"            self.api.delete_server(server[\u0027id\u0027])"},{"line_number":1430,"context_line":"        self._wait_until_deleted(server)"},{"line_number":1431,"context_line":""},{"line_number":1432,"context_line":"        # make sure the allocation is still around"},{"line_number":1433,"context_line":"        self.assertFlavorMatchesUsage(rp_uuid, self.flavor)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_42dbcc78","line":1430,"in_reply_to":"3fa7e38b_ea14d143","updated":"2020-01-08 17:05:55.000000000","message":"Done","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f9c9f0f4a06773dfc80c36d0f03c64c899ce2a46","unresolved":false,"context_lines":[{"line_number":1500,"context_line":"            self.api.post_server_action("},{"line_number":1501,"context_line":"                server[\u0027id\u0027], post, check_response_status\u003d[204])"},{"line_number":1502,"context_line":""},{"line_number":1503,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"},{"line_number":1504,"context_line":""},{"line_number":1505,"context_line":"        # The target host usage should be according to the new flavor..."},{"line_number":1506,"context_line":"        self.assertFlavorMatchesUsage(dest_rp_uuid, new_flavor)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_aa281985","line":1503,"updated":"2019-11-27 09:45:00.000000000","message":"move this under the mock context manager","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"0ccd59481c4e6608a7c0482e54e6f2899a1b63a5","unresolved":false,"context_lines":[{"line_number":1500,"context_line":"            self.api.post_server_action("},{"line_number":1501,"context_line":"                server[\u0027id\u0027], post, check_response_status\u003d[204])"},{"line_number":1502,"context_line":""},{"line_number":1503,"context_line":"        self._wait_for_state_change(self.api, server, \u0027ACTIVE\u0027)"},{"line_number":1504,"context_line":""},{"line_number":1505,"context_line":"        # The target host usage should be according to the new flavor..."},{"line_number":1506,"context_line":"        self.assertFlavorMatchesUsage(dest_rp_uuid, new_flavor)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_e2cf58b0","line":1503,"in_reply_to":"3fa7e38b_aa281985","updated":"2020-01-08 17:05:55.000000000","message":"Done","commit_id":"569af1b4c38d4e5db53ffd80ecf49ce542aa5142"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4b188f8b32226b5d2a86cf51d90361ef44d41d3e","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from nova.tests.functional import fixtures as func_fixtures"},{"line_number":32,"context_line":"from nova.tests.functional import integrated_helpers"},{"line_number":33,"context_line":"from nova.tests.functional import test_servers"},{"line_number":34,"context_line":"from nova.tests.unit import cast_as_call"},{"line_number":35,"context_line":"from nova.tests.unit.image import fake as image_fake"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"CONF \u003d config.CONF"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_14a660ad","line":34,"updated":"2020-01-09 13:18:10.000000000","message":"This is unused now and causes the pep8 failure.","commit_id":"4572a900c58dd737da8d6866e01cfc655706615a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9c18b2140acba36585c3618245e94469a7152323","unresolved":false,"context_lines":[{"line_number":1416,"context_line":"        self.useFixture(fixtures.MonkeyPatch(\u0027sys.stdout\u0027, self.output))"},{"line_number":1417,"context_line":""},{"line_number":1418,"context_line":"        self.flavor \u003d self.api.get_flavors()[0]"},{"line_number":1419,"context_line":""},{"line_number":1420,"context_line":"    def _delete_instance_but_keep_its_allocations(self, server):"},{"line_number":1421,"context_line":"        \"\"\"Mocks out the call to Placement for deleting the allocations but"},{"line_number":1422,"context_line":"           still performs the instance deletion."},{"line_number":1423,"context_line":"        \"\"\""},{"line_number":1424,"context_line":""},{"line_number":1425,"context_line":"        with mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":1426,"context_line":"                        \u0027delete_allocation_for_instance\u0027):"},{"line_number":1427,"context_line":"            self.api.delete_server(server[\u0027id\u0027])"},{"line_number":1428,"context_line":"            self._wait_until_deleted(server)"},{"line_number":1429,"context_line":""},{"line_number":1430,"context_line":"    def test_audit_orphaned_allocation_from_instance_delete(self):"},{"line_number":1431,"context_line":"        \"\"\"Creates a server and deletes it by retaining its allocations so the"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_e35aa55b","line":1428,"range":{"start_line":1419,"start_character":0,"end_line":1428,"end_character":44},"updated":"2020-02-19 10:56:03.000000000","message":"This seems to be unreferenced? (fwiw, I do prefer doing this inline like you\u0027ve done)","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"8d1155b835e1acf9bccc479ca1af8254bd1667e7","unresolved":false,"context_lines":[{"line_number":1416,"context_line":"        self.useFixture(fixtures.MonkeyPatch(\u0027sys.stdout\u0027, self.output))"},{"line_number":1417,"context_line":""},{"line_number":1418,"context_line":"        self.flavor \u003d self.api.get_flavors()[0]"},{"line_number":1419,"context_line":""},{"line_number":1420,"context_line":"    def _delete_instance_but_keep_its_allocations(self, server):"},{"line_number":1421,"context_line":"        \"\"\"Mocks out the call to Placement for deleting the allocations but"},{"line_number":1422,"context_line":"           still performs the instance deletion."},{"line_number":1423,"context_line":"        \"\"\""},{"line_number":1424,"context_line":""},{"line_number":1425,"context_line":"        with mock.patch(\u0027nova.scheduler.client.report.SchedulerReportClient.\u0027"},{"line_number":1426,"context_line":"                        \u0027delete_allocation_for_instance\u0027):"},{"line_number":1427,"context_line":"            self.api.delete_server(server[\u0027id\u0027])"},{"line_number":1428,"context_line":"            self._wait_until_deleted(server)"},{"line_number":1429,"context_line":""},{"line_number":1430,"context_line":"    def test_audit_orphaned_allocation_from_instance_delete(self):"},{"line_number":1431,"context_line":"        \"\"\"Creates a server and deletes it by retaining its allocations so the"}],"source_content_type":"text/x-python","patch_set":14,"id":"df33271e_5db0ee43","line":1428,"range":{"start_line":1419,"start_character":0,"end_line":1428,"end_character":44},"in_reply_to":"3fa7e38b_e35aa55b","updated":"2020-03-30 07:22:36.000000000","message":"Shit, you\u0027re right, I forgot to remove it. Done.","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9c18b2140acba36585c3618245e94469a7152323","unresolved":false,"context_lines":[{"line_number":1456,"context_line":"            \u0027Resource Provider %(rp_uuid)s can be deleted\u0027 %"},{"line_number":1457,"context_line":"            {\u0027consumer_uuid\u0027: server[\u0027id\u0027],"},{"line_number":1458,"context_line":"             \u0027rp_uuid\u0027: rp_uuid},"},{"line_number":1459,"context_line":"            output)"},{"line_number":1460,"context_line":"        self.assertIn(\u0027Processed 1 allocation.\u0027, output)"},{"line_number":1461,"context_line":"        self.assertEqual(3, ret)"},{"line_number":1462,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_1e2dd68f","line":1459,"range":{"start_line":1459,"start_character":12,"end_line":1459,"end_character":18},"updated":"2020-02-19 10:56:03.000000000","message":"nit: do you want to reset this or check that \"Deleted allocations\" is *not* present before proceeding on? In _theory_, the \"Deleted allocations\" message might already be here?","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"8d1155b835e1acf9bccc479ca1af8254bd1667e7","unresolved":false,"context_lines":[{"line_number":1456,"context_line":"            \u0027Resource Provider %(rp_uuid)s can be deleted\u0027 %"},{"line_number":1457,"context_line":"            {\u0027consumer_uuid\u0027: server[\u0027id\u0027],"},{"line_number":1458,"context_line":"             \u0027rp_uuid\u0027: rp_uuid},"},{"line_number":1459,"context_line":"            output)"},{"line_number":1460,"context_line":"        self.assertIn(\u0027Processed 1 allocation.\u0027, output)"},{"line_number":1461,"context_line":"        self.assertEqual(3, ret)"},{"line_number":1462,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"df33271e_5d962e4e","line":1459,"range":{"start_line":1459,"start_character":12,"end_line":1459,"end_character":18},"in_reply_to":"3fa7e38b_1e2dd68f","updated":"2020-03-30 07:22:36.000000000","message":"Done","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9c18b2140acba36585c3618245e94469a7152323","unresolved":false,"context_lines":[{"line_number":1466,"context_line":"        # The allocations are now deleted"},{"line_number":1467,"context_line":"        self.assertRequestMatchesUsage({\u0027VCPU\u0027: 0,"},{"line_number":1468,"context_line":"                                        \u0027MEMORY_MB\u0027: 0,"},{"line_number":1469,"context_line":"                                        \u0027DISK_GB\u0027: 0}, rp_uuid)"},{"line_number":1470,"context_line":""},{"line_number":1471,"context_line":"        output \u003d self.output.getvalue()"},{"line_number":1472,"context_line":"        self.assertIn("}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_2378bdc0","line":1469,"updated":"2020-02-19 10:56:03.000000000","message":"style nit:\n\n  self.assertRequestMatchesUsage(\n      {\u0027VCPU\u0027: 0, \u0027MEMORY_MB\u0027: 0, \u0027DISK_GB\u0027: 0}, rp_uuid,\n  )","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"8d1155b835e1acf9bccc479ca1af8254bd1667e7","unresolved":false,"context_lines":[{"line_number":1466,"context_line":"        # The allocations are now deleted"},{"line_number":1467,"context_line":"        self.assertRequestMatchesUsage({\u0027VCPU\u0027: 0,"},{"line_number":1468,"context_line":"                                        \u0027MEMORY_MB\u0027: 0,"},{"line_number":1469,"context_line":"                                        \u0027DISK_GB\u0027: 0}, rp_uuid)"},{"line_number":1470,"context_line":""},{"line_number":1471,"context_line":"        output \u003d self.output.getvalue()"},{"line_number":1472,"context_line":"        self.assertIn("}],"source_content_type":"text/x-python","patch_set":14,"id":"df33271e_dd06bece","line":1469,"in_reply_to":"3fa7e38b_2378bdc0","updated":"2020-03-30 07:22:36.000000000","message":"Done","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9c18b2140acba36585c3618245e94469a7152323","unresolved":false,"context_lines":[{"line_number":1525,"context_line":"        self.assertIn("},{"line_number":1526,"context_line":"            \u0027Allocations for consumer UUID %(consumer_uuid)s on \u0027"},{"line_number":1527,"context_line":"            \u0027Resource Provider %(rp_uuid)s can be deleted\u0027 %"},{"line_number":1528,"context_line":"            {\u0027consumer_uuid\u0027: migration_uuid,"},{"line_number":1529,"context_line":"             \u0027rp_uuid\u0027: source_rp_uuid},"},{"line_number":1530,"context_line":"            output)"},{"line_number":1531,"context_line":"        self.assertIn(\u0027Processed 1 allocation.\u0027, output)"},{"line_number":1532,"context_line":"        self.assertEqual(3, ret)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_be536215","line":1529,"range":{"start_line":1528,"start_character":0,"end_line":1529,"end_character":40},"updated":"2020-02-19 10:56:03.000000000","message":"style nit: could fit on one line","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"8d1155b835e1acf9bccc479ca1af8254bd1667e7","unresolved":false,"context_lines":[{"line_number":1525,"context_line":"        self.assertIn("},{"line_number":1526,"context_line":"            \u0027Allocations for consumer UUID %(consumer_uuid)s on \u0027"},{"line_number":1527,"context_line":"            \u0027Resource Provider %(rp_uuid)s can be deleted\u0027 %"},{"line_number":1528,"context_line":"            {\u0027consumer_uuid\u0027: migration_uuid,"},{"line_number":1529,"context_line":"             \u0027rp_uuid\u0027: source_rp_uuid},"},{"line_number":1530,"context_line":"            output)"},{"line_number":1531,"context_line":"        self.assertIn(\u0027Processed 1 allocation.\u0027, output)"},{"line_number":1532,"context_line":"        self.assertEqual(3, ret)"}],"source_content_type":"text/x-python","patch_set":14,"id":"df33271e_1d0dc6e7","line":1529,"range":{"start_line":1528,"start_character":0,"end_line":1529,"end_character":40},"in_reply_to":"3fa7e38b_be536215","updated":"2020-03-30 07:22:36.000000000","message":"Done","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9c18b2140acba36585c3618245e94469a7152323","unresolved":false,"context_lines":[{"line_number":1550,"context_line":"        self.assertIn(\u0027Processed 1 allocation.\u0027, output)"},{"line_number":1551,"context_line":"        self.assertEqual(4, ret)"},{"line_number":1552,"context_line":""},{"line_number":1553,"context_line":"    # TODO(sbauza): Mock this test once bug #1829479 is fixed"},{"line_number":1554,"context_line":"    def test_audit_orphaned_allocations_from_deleted_compute_evacuate(self):"},{"line_number":1555,"context_line":"        \"\"\"Evacuate a server and the delete the source node so that it will"},{"line_number":1556,"context_line":"           leave a source allocation that the audit command will find."}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_1e5b9623","line":1553,"updated":"2020-02-19 10:56:03.000000000","message":"I don\u0027t know what the TODO implies here. What are we supposed to mock?","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"8d1155b835e1acf9bccc479ca1af8254bd1667e7","unresolved":false,"context_lines":[{"line_number":1550,"context_line":"        self.assertIn(\u0027Processed 1 allocation.\u0027, output)"},{"line_number":1551,"context_line":"        self.assertEqual(4, ret)"},{"line_number":1552,"context_line":""},{"line_number":1553,"context_line":"    # TODO(sbauza): Mock this test once bug #1829479 is fixed"},{"line_number":1554,"context_line":"    def test_audit_orphaned_allocations_from_deleted_compute_evacuate(self):"},{"line_number":1555,"context_line":"        \"\"\"Evacuate a server and the delete the source node so that it will"},{"line_number":1556,"context_line":"           leave a source allocation that the audit command will find."}],"source_content_type":"text/x-python","patch_set":14,"id":"df33271e_dd2fde3c","line":1553,"in_reply_to":"3fa7e38b_1e5b9623","updated":"2020-03-30 07:22:36.000000000","message":"Done","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"}],"nova/tests/unit/cmd/test_manage.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"416bc1a5ae9093c648561911b29db07f2efb2c69","unresolved":false,"context_lines":[{"line_number":3152,"context_line":"        neutron.update_port.assert_called_once_with("},{"line_number":3153,"context_line":"            uuidsentinel.port_id, body\u003dexpected_update_body)"},{"line_number":3154,"context_line":""},{"line_number":3155,"context_line":"    def test_audit_with_wrong_provider_uuid(self):"},{"line_number":3156,"context_line":"        with mock.patch.object("},{"line_number":3157,"context_line":"                self.cli, \u0027_get_resource_provider\u0027,"},{"line_number":3158,"context_line":"                side_effect\u003dexception.ResourceProviderNotFound("}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_1af82d48","line":3155,"updated":"2019-11-15 16:11:49.000000000","message":"IMO, anything in here for unit tests should be moved to functional tests. There is not great reason to use unit tests for commands like this since it just masks errors.","commit_id":"4f95ccc91799ce45ae1325281d4feedc59841834"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"416bc1a5ae9093c648561911b29db07f2efb2c69","unresolved":false,"context_lines":[{"line_number":3184,"context_line":"               \"parent_provider_uuid\": None,"},{"line_number":3185,"context_line":"               \"root_provider_uuid\": uuidsentinel.rp2},"},{"line_number":3186,"context_line":"              ]"},{"line_number":3187,"context_line":"        get_resource_providers.return_value \u003d fake_requests.FakeResponse("},{"line_number":3188,"context_line":"            200, content\u003djsonutils.dumps({\"resource_providers\": rps}))"},{"line_number":3189,"context_line":""},{"line_number":3190,"context_line":"        if errors:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_ba9eb903","line":3187,"updated":"2019-11-15 16:11:49.000000000","message":"You\u0027re mocking the call that you have wrong, this is why unit tests are insufficient.","commit_id":"4f95ccc91799ce45ae1325281d4feedc59841834"}],"releasenotes/notes/placement-audit-59a00dcfb188c6ac.yaml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9c18b2140acba36585c3618245e94469a7152323","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"other:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    A new ``nova-manage placement audit`` CLI has been added to help identify"},{"line_number":5,"context_line":"    orphaned compute allocations in the Placement API that are no longer"},{"line_number":6,"context_line":"    related to either instances or migrations."},{"line_number":7,"context_line":"    Some race conditions in Nova could not remove allocations for some"},{"line_number":8,"context_line":"    instances or migrations when they\u0027re done and then it would create some"},{"line_number":9,"context_line":"    capacity issues. Thanks to the command, you could know the orphaned"},{"line_number":10,"context_line":"    allocations and ask to remove them."},{"line_number":11,"context_line":"    For more details on CLI usage, see the man page entry:"},{"line_number":12,"context_line":"    https://docs.openstack.org/nova/latest/cli/nova-manage.html#placement"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"3fa7e38b_43f2996b","line":10,"range":{"start_line":4,"start_character":0,"end_line":10,"end_character":39},"updated":"2020-02-19 10:56:03.000000000","message":"This reads oddly. How about something like:\n\n  A new ``nova-manage`` command, ``placement audit``, has been added. This\n  can be used to identify and optionally remove compute allocations in\n  placement that are no longer referenced by existing instances or\n  migrations. These orphaned allocations typically occur due to race\n  conditions during instance migration or removal and will result in\n  capacity issues if not addressed.","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"8d1155b835e1acf9bccc479ca1af8254bd1667e7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"other:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    A new ``nova-manage placement audit`` CLI has been added to help identify"},{"line_number":5,"context_line":"    orphaned compute allocations in the Placement API that are no longer"},{"line_number":6,"context_line":"    related to either instances or migrations."},{"line_number":7,"context_line":"    Some race conditions in Nova could not remove allocations for some"},{"line_number":8,"context_line":"    instances or migrations when they\u0027re done and then it would create some"},{"line_number":9,"context_line":"    capacity issues. Thanks to the command, you could know the orphaned"},{"line_number":10,"context_line":"    allocations and ask to remove them."},{"line_number":11,"context_line":"    For more details on CLI usage, see the man page entry:"},{"line_number":12,"context_line":"    https://docs.openstack.org/nova/latest/cli/nova-manage.html#placement"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"df33271e_1d97863c","line":10,"range":{"start_line":4,"start_character":0,"end_line":10,"end_character":39},"in_reply_to":"3fa7e38b_43f2996b","updated":"2020-03-30 07:22:36.000000000","message":"Thanks for the alternative note. Done.","commit_id":"c03716be1f3e9fd5a5e9adf95860c7ce4bfe211f"}]}
