)]}'
{"ironic/api/controllers/v1/node.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b5df9458d1bb0357ea9497b5073d5313e85a869a","unresolved":false,"context_lines":[{"line_number":2117,"context_line":"            raise wsme.exc.ClientSideError(msg,"},{"line_number":2118,"context_line":"                                           status_code\u003dhttp_client.CONFLICT)"},{"line_number":2119,"context_line":"        elif (rpc_node.provision_state \u003d\u003d ir_states.ACTIVE and"},{"line_number":2120,"context_line":"              api_utils.get_patch_values(patch, \u0027/owner\u0027)):"},{"line_number":2121,"context_line":"            try:"},{"line_number":2122,"context_line":"                api_utils.check_node_policy_and_retrieve("},{"line_number":2123,"context_line":"                    \u0027baremetal:node:update_owner_provisioned\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_189a20c4","line":2120,"updated":"2019-12-11 17:48:58.000000000","message":"Let\u0027s add another condition on rpc_node.instance_uuid !\u003d None, so that we capture nodes that have already been allocated?\n\nActually, no. We need to completely ban the situation where:\n\n node.allocation_uuid !\u003d None and allocation.owner !\u003d None\n\nThis, however, means that we need to fetch allocations, which we don\u0027t do now. Or maybe we do, because we provide the mapping from allocation_id to allocation_uuid somewhere.","commit_id":"af5981fd6bc16636d2185ee838a32fe55873fcef"},{"author":{"_account_id":7386,"name":"Tzu-Mainn Chen","email":"tzumainn@redhat.com","username":"tzumainn"},"change_message_id":"fafc316c25e29683faff4f05a5bb46e9be7a1025","unresolved":false,"context_lines":[{"line_number":2117,"context_line":"            raise wsme.exc.ClientSideError(msg,"},{"line_number":2118,"context_line":"                                           status_code\u003dhttp_client.CONFLICT)"},{"line_number":2119,"context_line":"        elif (rpc_node.provision_state \u003d\u003d ir_states.ACTIVE and"},{"line_number":2120,"context_line":"              api_utils.get_patch_values(patch, \u0027/owner\u0027)):"},{"line_number":2121,"context_line":"            try:"},{"line_number":2122,"context_line":"                api_utils.check_node_policy_and_retrieve("},{"line_number":2123,"context_line":"                    \u0027baremetal:node:update_owner_provisioned\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_f825c45b","line":2120,"in_reply_to":"3fa7e38b_189a20c4","updated":"2019-12-11 17:58:48.000000000","message":"Yep! There\u0027s a few cases in the node controller where we fetch the associated allocation, so I figure I\u0027d do something similar. I thought it would make sense as a followup, as the allocation owner doesn\u0027t exist upstream yet.","commit_id":"af5981fd6bc16636d2185ee838a32fe55873fcef"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"5816a084ba2aa61363660f11ca6a5f19b3612e68","unresolved":false,"context_lines":[{"line_number":2119,"context_line":"        elif api_utils.get_patch_values(patch, \u0027/owner\u0027):"},{"line_number":2120,"context_line":""},{"line_number":2121,"context_line":"            # check if updating a provisioned node\u0027s owner is allowed"},{"line_number":2122,"context_line":"            if rpc_node.provision_state \u003d\u003d ir_states.ACTIVE:"},{"line_number":2123,"context_line":"                try:"},{"line_number":2124,"context_line":"                    api_utils.check_node_policy("},{"line_number":2125,"context_line":"                        \u0027baremetal:node:update_owner_provisioned\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_8b462322","line":2122,"updated":"2019-12-23 14:54:01.000000000","message":"reasonable to do it while active....","commit_id":"f22ab44888e4b9fd549a5da8e907f4b8fa01faed"}],"ironic/api/controllers/v1/utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"69644241e92ac5bc911d2c6d7d169eb7c80aeac4","unresolved":false,"context_lines":[{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"    :param: policy_name: Name of the policy to check."},{"line_number":1173,"context_line":"    :param: node_ident: the UUID or logical name of a node."},{"line_number":1174,"context_line":"    :param: with_suffix: whether the RPC node should include the suffix"},{"line_number":1175,"context_line":""},{"line_number":1176,"context_line":"    :raises: HTTPForbidden if the policy forbids access."},{"line_number":1177,"context_line":"    :raises: NodeNotFound if the node is not found."}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_44953887","line":1174,"updated":"2019-12-09 21:26:29.000000000","message":"doc the new param","commit_id":"3f6a2319d74770817af85894047d4ac13a87283e"},{"author":{"_account_id":7386,"name":"Tzu-Mainn Chen","email":"tzumainn@redhat.com","username":"tzumainn"},"change_message_id":"72e92b11b8029c8c99ec823d77c73a31a8ca8e10","unresolved":false,"context_lines":[{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"    :param: policy_name: Name of the policy to check."},{"line_number":1173,"context_line":"    :param: node_ident: the UUID or logical name of a node."},{"line_number":1174,"context_line":"    :param: with_suffix: whether the RPC node should include the suffix"},{"line_number":1175,"context_line":""},{"line_number":1176,"context_line":"    :raises: HTTPForbidden if the policy forbids access."},{"line_number":1177,"context_line":"    :raises: NodeNotFound if the node is not found."}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_c2e02efb","line":1174,"in_reply_to":"3fa7e38b_44953887","updated":"2019-12-10 15:31:31.000000000","message":"Whoops - added!","commit_id":"3f6a2319d74770817af85894047d4ac13a87283e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"69644241e92ac5bc911d2c6d7d169eb7c80aeac4","unresolved":false,"context_lines":[{"line_number":1194,"context_line":"            raise"},{"line_number":1195,"context_line":""},{"line_number":1196,"context_line":"    target_dict \u003d dict(cdict)"},{"line_number":1197,"context_line":"    target_dict[\u0027node.owner\u0027] \u003d rpc_node[\u0027owner\u0027]"},{"line_number":1198,"context_line":"    policy.authorize(policy_name, target_dict, cdict)"},{"line_number":1199,"context_line":""},{"line_number":1200,"context_line":"    return rpc_node"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_84ec9028","line":1197,"updated":"2019-12-09 21:26:29.000000000","message":"I guess this is the major difference between the policy check here and in check_policy above. I was wondering if you could just call check_policy from the patch API code and then not deal with the \"retrieve\" part of this method but I guess policy check should be scoped to the owner (if there was one before the patch call?).","commit_id":"3f6a2319d74770817af85894047d4ac13a87283e"},{"author":{"_account_id":7386,"name":"Tzu-Mainn Chen","email":"tzumainn@redhat.com","username":"tzumainn"},"change_message_id":"72e92b11b8029c8c99ec823d77c73a31a8ca8e10","unresolved":false,"context_lines":[{"line_number":1194,"context_line":"            raise"},{"line_number":1195,"context_line":""},{"line_number":1196,"context_line":"    target_dict \u003d dict(cdict)"},{"line_number":1197,"context_line":"    target_dict[\u0027node.owner\u0027] \u003d rpc_node[\u0027owner\u0027]"},{"line_number":1198,"context_line":"    policy.authorize(policy_name, target_dict, cdict)"},{"line_number":1199,"context_line":""},{"line_number":1200,"context_line":"    return rpc_node"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_62c4da60","line":1197,"in_reply_to":"3fa7e38b_84ec9028","updated":"2019-12-10 15:31:31.000000000","message":"Yeah, exactly - I figured it was possible that someone would want node owners to be able to transfer ownership of their provisioned node, for whatever reason.","commit_id":"3f6a2319d74770817af85894047d4ac13a87283e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e5708175bb2ef56a8a7dfff265f923795fe32034","unresolved":false,"context_lines":[{"line_number":1166,"context_line":""},{"line_number":1167,"context_line":""},{"line_number":1168,"context_line":"def check_node_policy_and_retrieve(policy_name, node_ident,"},{"line_number":1169,"context_line":"                                   with_suffix\u003dFalse, node\u003dNone):"},{"line_number":1170,"context_line":"    \"\"\"Check if the specified policy authorizes this request on a node."},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"    :param: policy_name: Name of the policy to check."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_78aeb4e4","line":1169,"updated":"2019-12-11 17:50:17.000000000","message":"I\u0027d rather introduce check_node_policy(node, policy_name) and then call it from here.","commit_id":"af5981fd6bc16636d2185ee838a32fe55873fcef"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b409b7efecf6ccf18437da7e1891a0e0613e4105","unresolved":false,"context_lines":[{"line_number":1166,"context_line":""},{"line_number":1167,"context_line":""},{"line_number":1168,"context_line":"def check_node_policy_and_retrieve(policy_name, node_ident,"},{"line_number":1169,"context_line":"                                   with_suffix\u003dFalse, node\u003dNone):"},{"line_number":1170,"context_line":"    \"\"\"Check if the specified policy authorizes this request on a node."},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"    :param: policy_name: Name of the policy to check."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_b882eca3","line":1169,"in_reply_to":"3fa7e38b_18d22035","updated":"2019-12-11 18:24:03.000000000","message":"Given the CI state right now, you can probably fix it.","commit_id":"af5981fd6bc16636d2185ee838a32fe55873fcef"},{"author":{"_account_id":7386,"name":"Tzu-Mainn Chen","email":"tzumainn@redhat.com","username":"tzumainn"},"change_message_id":"fafc316c25e29683faff4f05a5bb46e9be7a1025","unresolved":false,"context_lines":[{"line_number":1166,"context_line":""},{"line_number":1167,"context_line":""},{"line_number":1168,"context_line":"def check_node_policy_and_retrieve(policy_name, node_ident,"},{"line_number":1169,"context_line":"                                   with_suffix\u003dFalse, node\u003dNone):"},{"line_number":1170,"context_line":"    \"\"\"Check if the specified policy authorizes this request on a node."},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"    :param: policy_name: Name of the policy to check."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_18d22035","line":1169,"in_reply_to":"3fa7e38b_78aeb4e4","updated":"2019-12-11 17:58:48.000000000","message":"Ah, that would be cleaner! Want me to fix it now?","commit_id":"af5981fd6bc16636d2185ee838a32fe55873fcef"},{"author":{"_account_id":7386,"name":"Tzu-Mainn Chen","email":"tzumainn@redhat.com","username":"tzumainn"},"change_message_id":"2785432c3fbcf60a4618188330bacf399900b115","unresolved":false,"context_lines":[{"line_number":1166,"context_line":""},{"line_number":1167,"context_line":""},{"line_number":1168,"context_line":"def check_node_policy_and_retrieve(policy_name, node_ident,"},{"line_number":1169,"context_line":"                                   with_suffix\u003dFalse, node\u003dNone):"},{"line_number":1170,"context_line":"    \"\"\"Check if the specified policy authorizes this request on a node."},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"    :param: policy_name: Name of the policy to check."}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_4b176447","line":1169,"in_reply_to":"3fa7e38b_b882eca3","updated":"2019-12-11 18:33:17.000000000","message":"Okay - fixed!","commit_id":"af5981fd6bc16636d2185ee838a32fe55873fcef"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"27f3d08a737fe6e76becb6a732fdff7f124fee63","unresolved":false,"context_lines":[{"line_number":1165,"context_line":"    policy.authorize(policy_name, cdict, cdict)"},{"line_number":1166,"context_line":""},{"line_number":1167,"context_line":""},{"line_number":1168,"context_line":"def check_node_policy(policy_name, node):"},{"line_number":1169,"context_line":"    \"\"\"Check if the specified policy authorizes this request on a node."},{"line_number":1170,"context_line":""},{"line_number":1171,"context_line":"    :param: policy_name: Name of the policy to check."}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_691ee174","line":1168,"range":{"start_line":1168,"start_character":35,"end_line":1168,"end_character":39},"updated":"2019-12-12 10:53:07.000000000","message":"wondering if we can just pass the node owner instead, and return True or False\nthat would prevent to pass an entire object between methods just to check on a single parameter.\nI get this will change the logic, but at the moment the name of the method is misleading so at least that needs a change IMHO","commit_id":"c3675b776ed15a76f409254c803a2bb02675a97b"},{"author":{"_account_id":7386,"name":"Tzu-Mainn Chen","email":"tzumainn@redhat.com","username":"tzumainn"},"change_message_id":"74cd7058e5744cf6c25ddf7e6910bc46d9140ac7","unresolved":false,"context_lines":[{"line_number":1165,"context_line":"    policy.authorize(policy_name, cdict, cdict)"},{"line_number":1166,"context_line":""},{"line_number":1167,"context_line":""},{"line_number":1168,"context_line":"def check_node_policy(policy_name, node):"},{"line_number":1169,"context_line":"    \"\"\"Check if the specified policy authorizes this request on a node."},{"line_number":1170,"context_line":""},{"line_number":1171,"context_line":"    :param: policy_name: Name of the policy to check."}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_c0779f9e","line":1168,"range":{"start_line":1168,"start_character":35,"end_line":1168,"end_character":39},"in_reply_to":"3fa7e38b_691ee174","updated":"2019-12-12 17:54:13.000000000","message":"Ah, that makes sense. Done!","commit_id":"c3675b776ed15a76f409254c803a2bb02675a97b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"37a86ff8ca03570d3ace6866007418f21711cb62","unresolved":false,"context_lines":[{"line_number":1176,"context_line":"    cdict \u003d api.request.context.to_policy_values()"},{"line_number":1177,"context_line":""},{"line_number":1178,"context_line":"    target_dict \u003d dict(cdict)"},{"line_number":1179,"context_line":"    target_dict[\u0027node.owner\u0027] \u003d node_owner"},{"line_number":1180,"context_line":"    policy.authorize(policy_name, target_dict, cdict)"},{"line_number":1181,"context_line":""},{"line_number":1182,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_b759f28d","line":1179,"updated":"2019-12-26 11:34:18.000000000","message":"Not sure I get your concern, is it about \"node.owner\" key? This line is copied from the already merged code (former line 1193).","commit_id":"f22ab44888e4b9fd549a5da8e907f4b8fa01faed"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"5816a084ba2aa61363660f11ca6a5f19b3612e68","unresolved":false,"context_lines":[{"line_number":1176,"context_line":"    cdict \u003d api.request.context.to_policy_values()"},{"line_number":1177,"context_line":""},{"line_number":1178,"context_line":"    target_dict \u003d dict(cdict)"},{"line_number":1179,"context_line":"    target_dict[\u0027node.owner\u0027] \u003d node_owner"},{"line_number":1180,"context_line":"    policy.authorize(policy_name, target_dict, cdict)"},{"line_number":1181,"context_line":""},{"line_number":1182,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_0b5c73ee","line":1179,"updated":"2019-12-23 14:54:01.000000000","message":"This doesn\u0027t... seem right? Node is the top level and an object, the owner is a string field attached to the object...","commit_id":"f22ab44888e4b9fd549a5da8e907f4b8fa01faed"}],"ironic/tests/unit/api/controllers/v1/test_node.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"69644241e92ac5bc911d2c6d7d169eb7c80aeac4","unresolved":false,"context_lines":[{"line_number":3166,"context_line":"        self.assertEqual(\u0027application/json\u0027, response.content_type)"},{"line_number":3167,"context_line":"        self.assertEqual(http_client.CONFLICT, response.status_code)"},{"line_number":3168,"context_line":"        self.assertTrue(response.json[\u0027error_message\u0027])"},{"line_number":3169,"context_line":""},{"line_number":3170,"context_line":"    def test_update_protected_old_api(self):"},{"line_number":3171,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"},{"line_number":3172,"context_line":"                                          uuid\u003duuidutils.generate_uuid())"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_e4d46449","line":3169,"updated":"2019-12-09 21:26:29.000000000","message":"How about a test where the node owner is changed but the provision_state is not active? Assert the new policy rule is not checked in that case.","commit_id":"3f6a2319d74770817af85894047d4ac13a87283e"},{"author":{"_account_id":7386,"name":"Tzu-Mainn Chen","email":"tzumainn@redhat.com","username":"tzumainn"},"change_message_id":"72e92b11b8029c8c99ec823d77c73a31a8ca8e10","unresolved":false,"context_lines":[{"line_number":3166,"context_line":"        self.assertEqual(\u0027application/json\u0027, response.content_type)"},{"line_number":3167,"context_line":"        self.assertEqual(http_client.CONFLICT, response.status_code)"},{"line_number":3168,"context_line":"        self.assertTrue(response.json[\u0027error_message\u0027])"},{"line_number":3169,"context_line":""},{"line_number":3170,"context_line":"    def test_update_protected_old_api(self):"},{"line_number":3171,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"},{"line_number":3172,"context_line":"                                          uuid\u003duuidutils.generate_uuid())"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_82d0f6f5","line":3169,"in_reply_to":"3fa7e38b_e4d46449","updated":"2019-12-10 15:31:31.000000000","message":"Good point! I\u0027ve added a check to test_update_owner as I think it tests the exact situation you describe; let me know if you think I\u0027m wrong!","commit_id":"3f6a2319d74770817af85894047d4ac13a87283e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"86479491f8d4c379af184949a67cdf26472c22e1","unresolved":false,"context_lines":[{"line_number":3124,"context_line":"            if rule \u003d\u003d \u0027baremetal:node:update_owner_provisioned\u0027:"},{"line_number":3125,"context_line":"                raise exception.HTTPForbidden(resource\u003d\u0027fake\u0027)"},{"line_number":3126,"context_line":"            return True"},{"line_number":3127,"context_line":"        mock_authorize.side_effect \u003d mock_authorize_function"},{"line_number":3128,"context_line":""},{"line_number":3129,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"},{"line_number":3130,"context_line":"                                          uuid\u003duuidutils.generate_uuid())"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_31a06aa5","line":3127,"range":{"start_line":3127,"start_character":8,"end_line":3127,"end_character":22},"updated":"2019-12-10 18:47:26.000000000","message":"I was wondering if we could assert this is not called but I\u0027m guessing we can\u0027t because the PATCH handler will check the \u0027baremetal:node:update\u0027 policy rule.","commit_id":"efc6134fad1a6791d405a64d06eef52ff5d489b1"},{"author":{"_account_id":7386,"name":"Tzu-Mainn Chen","email":"tzumainn@redhat.com","username":"tzumainn"},"change_message_id":"c94ed16827159d596cf425616ae7a0fa91c8b1da","unresolved":false,"context_lines":[{"line_number":3124,"context_line":"            if rule \u003d\u003d \u0027baremetal:node:update_owner_provisioned\u0027:"},{"line_number":3125,"context_line":"                raise exception.HTTPForbidden(resource\u003d\u0027fake\u0027)"},{"line_number":3126,"context_line":"            return True"},{"line_number":3127,"context_line":"        mock_authorize.side_effect \u003d mock_authorize_function"},{"line_number":3128,"context_line":""},{"line_number":3129,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"},{"line_number":3130,"context_line":"                                          uuid\u003duuidutils.generate_uuid())"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_51bac6bf","line":3127,"range":{"start_line":3127,"start_character":8,"end_line":3127,"end_character":22},"in_reply_to":"3fa7e38b_31a06aa5","updated":"2019-12-10 18:56:30.000000000","message":"Yep, that was the problem I ran into; this was the closest I could figure for having the test fail if it reached the new policy check.","commit_id":"efc6134fad1a6791d405a64d06eef52ff5d489b1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"86479491f8d4c379af184949a67cdf26472c22e1","unresolved":false,"context_lines":[{"line_number":3126,"context_line":"            return True"},{"line_number":3127,"context_line":"        mock_authorize.side_effect \u003d mock_authorize_function"},{"line_number":3128,"context_line":""},{"line_number":3129,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"},{"line_number":3130,"context_line":"                                          uuid\u003duuidutils.generate_uuid())"},{"line_number":3131,"context_line":"        self.mock_update_node.return_value \u003d node"},{"line_number":3132,"context_line":"        headers \u003d {api_base.Version.string: \u00271.50\u0027}"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_71c4a260","line":3129,"updated":"2019-12-10 18:47:26.000000000","message":"OK I guess for this node provision_state defaults to available:\n\nhttps://opendev.org/openstack/ironic/src/branch/master/ironic/tests/unit/db/utils.py#L191","commit_id":"efc6134fad1a6791d405a64d06eef52ff5d489b1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"37a86ff8ca03570d3ace6866007418f21711cb62","unresolved":false,"context_lines":[{"line_number":3117,"context_line":"        self.assertEqual(\u0027application/json\u0027, response.content_type)"},{"line_number":3118,"context_line":"        self.assertEqual(http_client.OK, response.status_code)"},{"line_number":3119,"context_line":""},{"line_number":3120,"context_line":"    @mock.patch.object(policy, \u0027authorize\u0027, spec\u003dTrue)"},{"line_number":3121,"context_line":"    def test_update_owner(self, mock_authorize):"},{"line_number":3122,"context_line":"        def mock_authorize_function(rule, target, creds):"},{"line_number":3123,"context_line":"            # test should not check this policy rule"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_5752fe69","line":3120,"updated":"2019-12-26 11:34:18.000000000","message":"nit: autospec?","commit_id":"f22ab44888e4b9fd549a5da8e907f4b8fa01faed"}],"releasenotes/notes/node-owner-provision-fix-ee2348b5922f7648.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"86479491f8d4c379af184949a67cdf26472c22e1","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - Fixes an issue where a provisioned node could have its owner changed. For"},{"line_number":4,"context_line":"    backwards compatibility, we preserve the ability to do so through the use"},{"line_number":5,"context_line":"    of the baremetal:node:update_owner_provisioned rule."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"3fa7e38b_f1b092ff","line":5,"range":{"start_line":5,"start_character":11,"end_line":5,"end_character":50},"updated":"2019-12-10 18:47:26.000000000","message":"Format this in backticks:\n\n``baremetal:node:update_owner_provisioned``","commit_id":"efc6134fad1a6791d405a64d06eef52ff5d489b1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"86479491f8d4c379af184949a67cdf26472c22e1","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - Fixes an issue where a provisioned node could have its owner changed. For"},{"line_number":4,"context_line":"    backwards compatibility, we preserve the ability to do so through the use"},{"line_number":5,"context_line":"    of the baremetal:node:update_owner_provisioned rule."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"3fa7e38b_11b44ef0","line":5,"range":{"start_line":5,"start_character":51,"end_line":5,"end_character":55},"updated":"2019-12-10 18:47:26.000000000","message":"nit: policy rule","commit_id":"efc6134fad1a6791d405a64d06eef52ff5d489b1"},{"author":{"_account_id":7386,"name":"Tzu-Mainn Chen","email":"tzumainn@redhat.com","username":"tzumainn"},"change_message_id":"c94ed16827159d596cf425616ae7a0fa91c8b1da","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - Fixes an issue where a provisioned node could have its owner changed. For"},{"line_number":4,"context_line":"    backwards compatibility, we preserve the ability to do so through the use"},{"line_number":5,"context_line":"    of the baremetal:node:update_owner_provisioned rule."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"3fa7e38b_b1ca1a4c","line":5,"range":{"start_line":5,"start_character":11,"end_line":5,"end_character":50},"in_reply_to":"3fa7e38b_9194be42","updated":"2019-12-10 18:56:30.000000000","message":"Fixed, and thanks for the note on the pipe!","commit_id":"efc6134fad1a6791d405a64d06eef52ff5d489b1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fff56f5d3b7813d2755286b56281ce7012e2a8cc","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - Fixes an issue where a provisioned node could have its owner changed. For"},{"line_number":4,"context_line":"    backwards compatibility, we preserve the ability to do so through the use"},{"line_number":5,"context_line":"    of the baremetal:node:update_owner_provisioned rule."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"3fa7e38b_9194be42","line":5,"range":{"start_line":5,"start_character":11,"end_line":5,"end_character":50},"in_reply_to":"3fa7e38b_f1b092ff","updated":"2019-12-10 18:50:21.000000000","message":"Note that if you add the `` formatting you need to add a pipe to escape the text:\n\n---\nfixes:\n  - |\n    Fixes...\n\nhttps://docs.openstack.org/reno/latest/user/usage.html#note-file-syntax","commit_id":"efc6134fad1a6791d405a64d06eef52ff5d489b1"}]}
