)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1bab0bec497d4e1937dbf2018563f535a7764e45","unresolved":false,"context_lines":[{"line_number":11,"context_line":"PUT /resource_providers/{uuid} request by providing the UUID of the"},{"line_number":12,"context_line":"parent. In this code path the loop detection was missing from the"},{"line_number":13,"context_line":"validation. Moreover there are different loop cases for create than for"},{"line_number":14,"context_line":"set. For create the only possible loop is when the RP being created is"},{"line_number":15,"context_line":"points to itself as a parent. However when the parent is provided later"},{"line_number":16,"context_line":"in a PUT the RP being updated can have descendant RPs. Setting a parent"},{"line_number":17,"context_line":"to a descendant also creates a loop."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5f7c97a3_d8b71a85","line":14,"range":{"start_line":14,"start_character":60,"end_line":14,"end_character":70},"updated":"2018-07-03 14:13:30.000000000","message":"s/created is/created/","commit_id":"00b13a2e2fab6e9a9635c4df186269a16d9fbfbd"}],"nova/api/openstack/placement/objects/resource_provider.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"66d37268dc6daa70efbbd0675ca1c924066f3237","unresolved":false,"context_lines":[{"line_number":1053,"context_line":"                        context,"},{"line_number":1054,"context_line":"                        filters\u003d{\u0027in_tree\u0027: my_ids.root_uuid})"},{"line_number":1055,"context_line":"                    rp_uuids_in_the_same_tree \u003d [rp.uuid for rp in same_tree]"},{"line_number":1056,"context_line":"                    print(\u0027rps in the current tree\u0027, rp_uuids_in_the_same_tree)"},{"line_number":1057,"context_line":"                    if parent_uuid in rp_uuids_in_the_same_tree:"},{"line_number":1058,"context_line":"                        raise exception.ObjectActionError("},{"line_number":1059,"context_line":"                            action\u003d\u0027update\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_8145c6b6","line":1056,"updated":"2018-07-02 16:02:52.000000000","message":"left a debug statement :/","commit_id":"0b81b8b04d8f9422f9d5de5ca496f04ef39e4a50"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4f1d5105def3d0a0989a4212c384b44710e318e2","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"                            reason\u003d_(\u0027re-parenting a provider is not \u0027"},{"line_number":1043,"context_line":"                                     \u0027currently allowed.\u0027))"},{"line_number":1044,"context_line":"                if my_ids.parent_uuid is None:"},{"line_number":1045,"context_line":"                    # So the user specifies a parent for and RP that doesn\u0027t"},{"line_number":1046,"context_line":"                    # have one. We have to check that by this new parent we"},{"line_number":1047,"context_line":"                    # don\u0027t create a loop in the tree. Basically the new parent"},{"line_number":1048,"context_line":"                    # cannot be the RP itself or one of its descendants."}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_a7a33243","line":1045,"range":{"start_line":1045,"start_character":57,"end_line":1045,"end_character":60},"updated":"2018-07-02 17:46:57.000000000","message":"an (or a)","commit_id":"54dce6a42b92c6b5a48b5caf7a2306b15025037b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"79b1afcae8e5049c92ba0edd59a70b518c5724bd","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"                            reason\u003d_(\u0027re-parenting a provider is not \u0027"},{"line_number":1043,"context_line":"                                     \u0027currently allowed.\u0027))"},{"line_number":1044,"context_line":"                if my_ids.parent_uuid is None:"},{"line_number":1045,"context_line":"                    # So the user specifies a parent for and RP that doesn\u0027t"},{"line_number":1046,"context_line":"                    # have one. We have to check that by this new parent we"},{"line_number":1047,"context_line":"                    # don\u0027t create a loop in the tree. Basically the new parent"},{"line_number":1048,"context_line":"                    # cannot be the RP itself or one of its descendants."}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_2fb84bc5","line":1045,"range":{"start_line":1045,"start_character":57,"end_line":1045,"end_character":60},"in_reply_to":"5f7c97a3_a7a33243","updated":"2018-07-03 08:08:42.000000000","message":"Done","commit_id":"54dce6a42b92c6b5a48b5caf7a2306b15025037b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4f1d5105def3d0a0989a4212c384b44710e318e2","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"                    # from the current RP tree\"."},{"line_number":1052,"context_line":"                    same_tree \u003d ResourceProviderList.get_all_by_filters("},{"line_number":1053,"context_line":"                        context,"},{"line_number":1054,"context_line":"                        filters\u003d{\u0027in_tree\u0027: my_ids.root_uuid})"},{"line_number":1055,"context_line":"                    rp_uuids_in_the_same_tree \u003d [rp.uuid for rp in same_tree]"},{"line_number":1056,"context_line":"                    if parent_uuid in rp_uuids_in_the_same_tree:"},{"line_number":1057,"context_line":"                        raise exception.ObjectActionError("}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_872b9693","line":1054,"range":{"start_line":1054,"start_character":44,"end_line":1054,"end_character":60},"updated":"2018-07-02 17:46:57.000000000","message":"Where are we on the data migration thingy at this point? Can root_uuid still be null? Since parent is unset, this RP *is* the root (possibly the only) node, so it should be equivalent, but safer, to use self.uuid here.","commit_id":"54dce6a42b92c6b5a48b5caf7a2306b15025037b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"79b1afcae8e5049c92ba0edd59a70b518c5724bd","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"                    # from the current RP tree\"."},{"line_number":1052,"context_line":"                    same_tree \u003d ResourceProviderList.get_all_by_filters("},{"line_number":1053,"context_line":"                        context,"},{"line_number":1054,"context_line":"                        filters\u003d{\u0027in_tree\u0027: my_ids.root_uuid})"},{"line_number":1055,"context_line":"                    rp_uuids_in_the_same_tree \u003d [rp.uuid for rp in same_tree]"},{"line_number":1056,"context_line":"                    if parent_uuid in rp_uuids_in_the_same_tree:"},{"line_number":1057,"context_line":"                        raise exception.ObjectActionError("}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_af369b4e","line":1054,"range":{"start_line":1054,"start_character":44,"end_line":1054,"end_character":60},"in_reply_to":"5f7c97a3_872b9693","updated":"2018-07-03 08:08:42.000000000","message":"Done","commit_id":"54dce6a42b92c6b5a48b5caf7a2306b15025037b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4f1d5105def3d0a0989a4212c384b44710e318e2","unresolved":false,"context_lines":[{"line_number":1057,"context_line":"                        raise exception.ObjectActionError("},{"line_number":1058,"context_line":"                            action\u003d\u0027update\u0027,"},{"line_number":1059,"context_line":"                            reason\u003d_(\u0027creating loop in the provider tree is \u0027"},{"line_number":1060,"context_line":"                                     \u0027not allowed.\u0027))"},{"line_number":1061,"context_line":""},{"line_number":1062,"context_line":"                updates[\u0027root_provider_id\u0027] \u003d parent_ids.root_id"},{"line_number":1063,"context_line":"                updates[\u0027parent_provider_id\u0027] \u003d parent_ids.id"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_a7ffb200","line":1060,"updated":"2018-07-02 17:46:57.000000000","message":"Should we add an error code for the \"loop\" conditions while we\u0027re here?","commit_id":"54dce6a42b92c6b5a48b5caf7a2306b15025037b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"79b1afcae8e5049c92ba0edd59a70b518c5724bd","unresolved":false,"context_lines":[{"line_number":1057,"context_line":"                        raise exception.ObjectActionError("},{"line_number":1058,"context_line":"                            action\u003d\u0027update\u0027,"},{"line_number":1059,"context_line":"                            reason\u003d_(\u0027creating loop in the provider tree is \u0027"},{"line_number":1060,"context_line":"                                     \u0027not allowed.\u0027))"},{"line_number":1061,"context_line":""},{"line_number":1062,"context_line":"                updates[\u0027root_provider_id\u0027] \u003d parent_ids.root_id"},{"line_number":1063,"context_line":"                updates[\u0027parent_provider_id\u0027] \u003d parent_ids.id"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_0f76af0d","line":1060,"in_reply_to":"5f7c97a3_a7ffb200","updated":"2018-07-03 08:08:42.000000000","message":"I don\u0027t see error codes set for the other exceptions in this file so I\u0027m not sure what is the expectation about error codes here.","commit_id":"54dce6a42b92c6b5a48b5caf7a2306b15025037b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1bab0bec497d4e1937dbf2018563f535a7764e45","unresolved":false,"context_lines":[{"line_number":1057,"context_line":"                        raise exception.ObjectActionError("},{"line_number":1058,"context_line":"                            action\u003d\u0027update\u0027,"},{"line_number":1059,"context_line":"                            reason\u003d_(\u0027creating loop in the provider tree is \u0027"},{"line_number":1060,"context_line":"                                     \u0027not allowed.\u0027))"},{"line_number":1061,"context_line":""},{"line_number":1062,"context_line":"                updates[\u0027root_provider_id\u0027] \u003d parent_ids.root_id"},{"line_number":1063,"context_line":"                updates[\u0027parent_provider_id\u0027] \u003d parent_ids.id"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_b837befe","line":1060,"updated":"2018-07-03 14:13:30.000000000","message":"✓","commit_id":"00b13a2e2fab6e9a9635c4df186269a16d9fbfbd"}],"nova/tests/functional/api/openstack/placement/gabbits/resource-provider.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4f1d5105def3d0a0989a4212c384b44710e318e2","unresolved":false,"context_lines":[{"line_number":735,"context_line":"  response_strings:"},{"line_number":736,"context_line":"      - \u0027creating loop in the provider tree is not allowed.\u0027"},{"line_number":737,"context_line":""},{"line_number":738,"context_line":"- name: fail updating the parent to point to its child"},{"line_number":739,"context_line":"  PUT: /resource_providers/$ENVIRON[\u0027PARENT_PROVIDER_UUID\u0027]"},{"line_number":740,"context_line":"  request_headers:"},{"line_number":741,"context_line":"      content-type: application/json"},{"line_number":742,"context_line":"  data:"},{"line_number":743,"context_line":"      name: parent"},{"line_number":744,"context_line":"      parent_provider_uuid: $ENVIRON[\u0027RP_UUID\u0027]"},{"line_number":745,"context_line":"  status: 400"},{"line_number":746,"context_line":"  response_strings:"},{"line_number":747,"context_line":"      - \u0027creating loop in the provider tree is not allowed.\u0027"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5f7c97a3_c7ae6e2e","line":747,"range":{"start_line":738,"start_character":0,"end_line":747,"end_character":60},"updated":"2018-07-02 17:46:57.000000000","message":"Did this one succeed before the fix?","commit_id":"54dce6a42b92c6b5a48b5caf7a2306b15025037b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"79b1afcae8e5049c92ba0edd59a70b518c5724bd","unresolved":false,"context_lines":[{"line_number":735,"context_line":"  response_strings:"},{"line_number":736,"context_line":"      - \u0027creating loop in the provider tree is not allowed.\u0027"},{"line_number":737,"context_line":""},{"line_number":738,"context_line":"- name: fail updating the parent to point to its child"},{"line_number":739,"context_line":"  PUT: /resource_providers/$ENVIRON[\u0027PARENT_PROVIDER_UUID\u0027]"},{"line_number":740,"context_line":"  request_headers:"},{"line_number":741,"context_line":"      content-type: application/json"},{"line_number":742,"context_line":"  data:"},{"line_number":743,"context_line":"      name: parent"},{"line_number":744,"context_line":"      parent_provider_uuid: $ENVIRON[\u0027RP_UUID\u0027]"},{"line_number":745,"context_line":"  status: 400"},{"line_number":746,"context_line":"  response_strings:"},{"line_number":747,"context_line":"      - \u0027creating loop in the provider tree is not allowed.\u0027"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5f7c97a3_6f8ac3bc","line":747,"range":{"start_line":738,"start_character":0,"end_line":747,"end_character":60},"in_reply_to":"5f7c97a3_c7ae6e2e","updated":"2018-07-03 08:08:42.000000000","message":"I\u0027ve tried now and this also fails without the fix. I only realized that this is a possible test case while I implemented the fix this is why the case added here and not in the previous patch.","commit_id":"54dce6a42b92c6b5a48b5caf7a2306b15025037b"}]}
