)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e3b8ac67056abfd2314bb446f16b3b5b8d47b5dd","unresolved":false,"context_lines":[{"line_number":10,"context_line":"duplicate error message when recieving a conflict type of user"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: Ice4ae7e66245991769b792325c950cbed516551a"},{"line_number":13,"context_line":"Partial-Bug: #1599296"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a71b18c_7329fa36","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":7},"updated":"2016-12-05 04:23:15.000000000","message":"if you go with the generic solution, this can be changed to Closes*","commit_id":"44f0282551febca3649eda35865970c42dc57a1a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6ee4a40c0b118c60d9424a82d25d42a021890566","unresolved":false,"context_lines":[{"line_number":10,"context_line":"duplicate error message when recieving a conflict type of user"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: Ice4ae7e66245991769b792325c950cbed516551a"},{"line_number":13,"context_line":"Partial-Bug: #1599296"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a71b18c_9ca5a948","line":13,"in_reply_to":"3a71b18c_7329fa36","updated":"2016-12-05 17:42:17.000000000","message":"++","commit_id":"44f0282551febca3649eda35865970c42dc57a1a"}],"keystone/common/sql/core.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"84907a4b0f865fd7d4322fce49805ba45dda06c9","unresolved":false,"context_lines":[{"line_number":435,"context_line":"                                          \u0027details\u0027: six.text_type(e)})"},{"line_number":436,"context_line":"                name \u003d \u0027 \u0027"},{"line_number":437,"context_line":"                msg \u003d \"Duplicate Entry\""},{"line_number":438,"context_line":"                if conflict_type \u003d\u003d \u0027user\u0027:"},{"line_number":439,"context_line":"                    name \u003d args[2][\u0027name\u0027]"},{"line_number":440,"context_line":"                    msg \u003d name + \" - Duplicate Entry\""},{"line_number":441,"context_line":"                raise exception.Conflict(type\u003dconflict_type, details\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_d3e56e38","line":438,"range":{"start_line":438,"start_character":16,"end_line":438,"end_character":43},"updated":"2016-12-05 04:22:21.000000000","message":"why not make this more generic? plenty of things have duplicate entries","commit_id":"44f0282551febca3649eda35865970c42dc57a1a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6ee4a40c0b118c60d9424a82d25d42a021890566","unresolved":false,"context_lines":[{"line_number":435,"context_line":"                                          \u0027details\u0027: six.text_type(e)})"},{"line_number":436,"context_line":"                name \u003d \u0027 \u0027"},{"line_number":437,"context_line":"                msg \u003d \"Duplicate Entry\""},{"line_number":438,"context_line":"                if conflict_type \u003d\u003d \u0027user\u0027:"},{"line_number":439,"context_line":"                    name \u003d args[2][\u0027name\u0027]"},{"line_number":440,"context_line":"                    msg \u003d name + \" - Duplicate Entry\""},{"line_number":441,"context_line":"                raise exception.Conflict(type\u003dconflict_type, details\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_975d8217","line":438,"in_reply_to":"3a71b18c_d3e56e38","updated":"2016-12-05 17:42:17.000000000","message":"Yeah - making this more generic would be idea. The trick is going to be finding a way build the conflict message based on the unique constraint, which might be domain + user name, or domain + project name, or domain id + local id + entity type in the case of mapping.","commit_id":"44f0282551febca3649eda35865970c42dc57a1a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"84907a4b0f865fd7d4322fce49805ba45dda06c9","unresolved":false,"context_lines":[{"line_number":436,"context_line":"                name \u003d \u0027 \u0027"},{"line_number":437,"context_line":"                msg \u003d \"Duplicate Entry\""},{"line_number":438,"context_line":"                if conflict_type \u003d\u003d \u0027user\u0027:"},{"line_number":439,"context_line":"                    name \u003d args[2][\u0027name\u0027]"},{"line_number":440,"context_line":"                    msg \u003d name + \" - Duplicate Entry\""},{"line_number":441,"context_line":"                raise exception.Conflict(type\u003dconflict_type, details\u003dmsg)"},{"line_number":442,"context_line":"            except db_exception.DBError as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_13d2865c","line":439,"range":{"start_line":439,"start_character":31,"end_line":439,"end_character":34},"updated":"2016-12-05 04:22:21.000000000","message":"why are we looking at the 3rd index?","commit_id":"44f0282551febca3649eda35865970c42dc57a1a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"84907a4b0f865fd7d4322fce49805ba45dda06c9","unresolved":false,"context_lines":[{"line_number":437,"context_line":"                msg \u003d \"Duplicate Entry\""},{"line_number":438,"context_line":"                if conflict_type \u003d\u003d \u0027user\u0027:"},{"line_number":439,"context_line":"                    name \u003d args[2][\u0027name\u0027]"},{"line_number":440,"context_line":"                    msg \u003d name + \" - Duplicate Entry\""},{"line_number":441,"context_line":"                raise exception.Conflict(type\u003dconflict_type, details\u003dmsg)"},{"line_number":442,"context_line":"            except db_exception.DBError as e:"},{"line_number":443,"context_line":"                # TODO(blk-u): inspecting inner_exception breaks encapsulation;"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_93c69698","line":440,"range":{"start_line":440,"start_character":37,"end_line":440,"end_character":52},"updated":"2016-12-05 04:22:21.000000000","message":"reference msg?","commit_id":"44f0282551febca3649eda35865970c42dc57a1a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"84907a4b0f865fd7d4322fce49805ba45dda06c9","unresolved":false,"context_lines":[{"line_number":433,"context_line":"                # as it can contain raw SQL."},{"line_number":434,"context_line":"                LOG.debug(_conflict_msg, {\u0027conflict_type\u0027: conflict_type,"},{"line_number":435,"context_line":"                                          \u0027details\u0027: six.text_type(e)})"},{"line_number":436,"context_line":"                name \u003d \u0027 \u0027"},{"line_number":437,"context_line":"                msg \u003d \"Duplicate Entry\""},{"line_number":438,"context_line":"                if conflict_type \u003d\u003d \u0027user\u0027:"},{"line_number":439,"context_line":"                    name \u003d args[2][\u0027name\u0027]"},{"line_number":440,"context_line":"                    msg \u003d name + \" - Duplicate Entry\""},{"line_number":441,"context_line":"                raise exception.Conflict(type\u003dconflict_type, details\u003dmsg)"},{"line_number":442,"context_line":"            except db_exception.DBError as e:"},{"line_number":443,"context_line":"                # TODO(blk-u): inspecting inner_exception breaks encapsulation;"},{"line_number":444,"context_line":"                # oslo_db should provide exception we need."}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_f350aad6","line":441,"range":{"start_line":436,"start_character":16,"end_line":441,"end_character":73},"updated":"2016-12-05 04:22:21.000000000","message":"just spitballin\u0027 here:\n\n  name \u003d None\n  domain_id \u003d None\n\n  if \u0027name\u0027 in args[2]\n    name \u003d args[2][\u0027name\u0027]\n  if \u0027domain_id\u0027 in args[2]\n    domain_id \u003d args[2][\u0027domain_id\u0027]\n\n  msg \u003d \u0027Duplicate entry\u0027\n  if name:\n    msg \u003d msg + \u0027 found with name %s\u0027 % name\n  if domain_id\n     msg \u003d msg + \u0027 at domain ID %s\u0027 % domain_id\n\n  raise exception.Conflict(type\u003dconflict_type, details\u003dmsg)\n\nThis way, you fall back to the existing message if args[2] has nothing helpful. If if has name and domain ID (which you\u0027ll need for groups, users and projects) you have a more helpful message. And it\u0027ll work for domains, endpoints, regions and roles (maybe?), too.","commit_id":"44f0282551febca3649eda35865970c42dc57a1a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"97907a61ce5301ac71616e96901a64517418616d","unresolved":false,"context_lines":[{"line_number":435,"context_line":"                                          \u0027details\u0027: six.text_type(e)})"},{"line_number":436,"context_line":"                name \u003d None"},{"line_number":437,"context_line":"                domain_id \u003d None"},{"line_number":438,"context_line":"                if len(args) \u003e\u003d 3:"},{"line_number":439,"context_line":"                    if \u0027name\u0027 in args[2]:"},{"line_number":440,"context_line":"                        name \u003d args[2][\u0027name\u0027]"},{"line_number":441,"context_line":"                    if \u0027domain_id\u0027 in args[2] and args[2][\u0027domain_id\u0027]:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_0fda2b4c","line":438,"range":{"start_line":438,"start_character":15,"end_line":438,"end_character":34},"updated":"2016-12-06 02:27:39.000000000","message":"nice guard.\n\nyou could alternatively check all of the args, since the 3rd parameters in the handles_conflict wrapper may not always be the resource reference (but it looks like it is most of the time)","commit_id":"f940497235204dc1da0f7019f2e6b89e133ca0f2"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"ba1d12e637bb090e95a20033028d5bf45cae26e1","unresolved":false,"context_lines":[{"line_number":435,"context_line":"                                          \u0027details\u0027: six.text_type(e)})"},{"line_number":436,"context_line":"                name \u003d None"},{"line_number":437,"context_line":"                domain_id \u003d None"},{"line_number":438,"context_line":"                if len(args) \u003e\u003d 3:"},{"line_number":439,"context_line":"                    if \u0027name\u0027 in args[2]:"},{"line_number":440,"context_line":"                        name \u003d args[2][\u0027name\u0027]"},{"line_number":441,"context_line":"                    if \u0027domain_id\u0027 in args[2] and args[2][\u0027domain_id\u0027]:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_7f75df61","line":438,"range":{"start_line":438,"start_character":15,"end_line":438,"end_character":34},"in_reply_to":"3a71b18c_0fda2b4c","updated":"2016-12-06 21:42:44.000000000","message":"Done","commit_id":"f940497235204dc1da0f7019f2e6b89e133ca0f2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"97907a61ce5301ac71616e96901a64517418616d","unresolved":false,"context_lines":[{"line_number":438,"context_line":"                if len(args) \u003e\u003d 3:"},{"line_number":439,"context_line":"                    if \u0027name\u0027 in args[2]:"},{"line_number":440,"context_line":"                        name \u003d args[2][\u0027name\u0027]"},{"line_number":441,"context_line":"                    if \u0027domain_id\u0027 in args[2] and args[2][\u0027domain_id\u0027]:"},{"line_number":442,"context_line":"                        domain_id \u003d args[2][\u0027domain_id\u0027]"},{"line_number":443,"context_line":"                msg \u003d \u0027Duplicate entry\u0027"},{"line_number":444,"context_line":"                if name:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_ef2def46","line":441,"range":{"start_line":441,"start_character":46,"end_line":441,"end_character":70},"updated":"2016-12-06 02:27:39.000000000","message":"what\u0027s the point of this? you\u0027re just checking if it\u0027s not None, and we already default to that, so setting domain_id to None (on the next line) is still OK.","commit_id":"f940497235204dc1da0f7019f2e6b89e133ca0f2"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"ba1d12e637bb090e95a20033028d5bf45cae26e1","unresolved":false,"context_lines":[{"line_number":438,"context_line":"                if len(args) \u003e\u003d 3:"},{"line_number":439,"context_line":"                    if \u0027name\u0027 in args[2]:"},{"line_number":440,"context_line":"                        name \u003d args[2][\u0027name\u0027]"},{"line_number":441,"context_line":"                    if \u0027domain_id\u0027 in args[2] and args[2][\u0027domain_id\u0027]:"},{"line_number":442,"context_line":"                        domain_id \u003d args[2][\u0027domain_id\u0027]"},{"line_number":443,"context_line":"                msg \u003d \u0027Duplicate entry\u0027"},{"line_number":444,"context_line":"                if name:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_bf6bf783","line":441,"range":{"start_line":441,"start_character":46,"end_line":441,"end_character":70},"in_reply_to":"3a71b18c_ef2def46","updated":"2016-12-06 21:42:44.000000000","message":"Done","commit_id":"f940497235204dc1da0f7019f2e6b89e133ca0f2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"c5256c6965c1f92e533966b3840ec0ae49f3f1e6","unresolved":false,"context_lines":[{"line_number":435,"context_line":"                                          \u0027details\u0027: six.text_type(e)})"},{"line_number":436,"context_line":"                name \u003d None"},{"line_number":437,"context_line":"                domain_id \u003d None"},{"line_number":438,"context_line":"                args \u003d args[1:]"},{"line_number":439,"context_line":"                for arg in args:"},{"line_number":440,"context_line":"                    if \u0027name\u0027 in arg:"},{"line_number":441,"context_line":"                        name \u003d arg[\u0027name\u0027]"},{"line_number":442,"context_line":"                    if \u0027domain_id\u0027 in arg:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_3f3a87e7","line":439,"range":{"start_line":438,"start_character":0,"end_line":439,"end_character":32},"updated":"2016-12-06 22:49:00.000000000","message":"add some comments here about *why* you are doing this, it\u0027ll help future maintainers","commit_id":"2a143fa74a8f40dff13b1ab840c834d8c62bb4ce"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"96f1ff8edf14700f36499c56e2835a39bb1b04a4","unresolved":false,"context_lines":[{"line_number":435,"context_line":"                                          \u0027details\u0027: six.text_type(e)})"},{"line_number":436,"context_line":"                name \u003d None"},{"line_number":437,"context_line":"                domain_id \u003d None"},{"line_number":438,"context_line":"                args \u003d args[1:]"},{"line_number":439,"context_line":"                for arg in args:"},{"line_number":440,"context_line":"                    if \u0027name\u0027 in arg:"},{"line_number":441,"context_line":"                        name \u003d arg[\u0027name\u0027]"},{"line_number":442,"context_line":"                    if \u0027domain_id\u0027 in arg:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_3bafc995","line":439,"range":{"start_line":438,"start_character":0,"end_line":439,"end_character":32},"in_reply_to":"3a71b18c_3f3a87e7","updated":"2016-12-07 19:15:16.000000000","message":"Done","commit_id":"2a143fa74a8f40dff13b1ab840c834d8c62bb4ce"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"c5256c6965c1f92e533966b3840ec0ae49f3f1e6","unresolved":false,"context_lines":[{"line_number":446,"context_line":"                    msg \u003d msg + \u0027 found with name %s\u0027 % name"},{"line_number":447,"context_line":"                if domain_id:"},{"line_number":448,"context_line":"                    msg \u003d msg + \u0027 at domain ID %s\u0027 % domain_id"},{"line_number":449,"context_line":"                raise exception.Conflict(type\u003dconflict_type, details\u003dmsg)"},{"line_number":450,"context_line":"            except db_exception.DBError as e:"},{"line_number":451,"context_line":"                # TODO(blk-u): inspecting inner_exception breaks encapsulation;"},{"line_number":452,"context_line":"                # oslo_db should provide exception we need."}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_5f14a34b","line":449,"range":{"start_line":449,"start_character":69,"end_line":449,"end_character":72},"updated":"2016-12-06 22:49:00.000000000","message":"you\u0027ll need to mark this for translation with _()","commit_id":"2a143fa74a8f40dff13b1ab840c834d8c62bb4ce"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"96f1ff8edf14700f36499c56e2835a39bb1b04a4","unresolved":false,"context_lines":[{"line_number":446,"context_line":"                    msg \u003d msg + \u0027 found with name %s\u0027 % name"},{"line_number":447,"context_line":"                if domain_id:"},{"line_number":448,"context_line":"                    msg \u003d msg + \u0027 at domain ID %s\u0027 % domain_id"},{"line_number":449,"context_line":"                raise exception.Conflict(type\u003dconflict_type, details\u003dmsg)"},{"line_number":450,"context_line":"            except db_exception.DBError as e:"},{"line_number":451,"context_line":"                # TODO(blk-u): inspecting inner_exception breaks encapsulation;"},{"line_number":452,"context_line":"                # oslo_db should provide exception we need."}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_5b948543","line":449,"range":{"start_line":449,"start_character":69,"end_line":449,"end_character":72},"in_reply_to":"3a71b18c_5f14a34b","updated":"2016-12-07 19:15:16.000000000","message":"Done","commit_id":"2a143fa74a8f40dff13b1ab840c834d8c62bb4ce"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"20a789b0ac4ca77cfe508e36eba3ed85c412d433","unresolved":false,"context_lines":[{"line_number":436,"context_line":"                name \u003d None"},{"line_number":437,"context_line":"                domain_id \u003d None"},{"line_number":438,"context_line":"                # First element is unnessecary for extracting name and causes"},{"line_number":439,"context_line":"                # object not iterable error. Remove it."},{"line_number":440,"context_line":"                args \u003d args[1:]"},{"line_number":441,"context_line":"                for arg in args:"},{"line_number":442,"context_line":"                    if \u0027name\u0027 in arg:"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a71b18c_57dd0341","line":439,"updated":"2016-12-08 19:01:26.000000000","message":"We only use args here, right? Modifying the args list shouldn\u0027t break anything (I would hope!). I would assume a test to fail if this broke anything though.","commit_id":"9a975aad5bd9c6a4d9e5de1aadd473b3485ba55f"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"76300ba67ac2c6c7671b368eab30e872a7a3762d","unresolved":false,"context_lines":[{"line_number":436,"context_line":"                name \u003d None"},{"line_number":437,"context_line":"                domain_id \u003d None"},{"line_number":438,"context_line":"                # First element is unnessecary for extracting name and causes"},{"line_number":439,"context_line":"                # object not iterable error. Remove it."},{"line_number":440,"context_line":"                args \u003d args[1:]"},{"line_number":441,"context_line":"                for arg in args:"},{"line_number":442,"context_line":"                    if \u0027name\u0027 in arg:"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a71b18c_77b91f79","line":439,"in_reply_to":"3a71b18c_57dd0341","updated":"2016-12-08 19:09:52.000000000","message":"Right, we do not use the first element of args anywhere in handle_conflict, but I can throw the end result in another variable to iterate through for peace of mind :)","commit_id":"9a975aad5bd9c6a4d9e5de1aadd473b3485ba55f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0a8b4d8e45cc4802014e3e042ce0d37c441fb08e","unresolved":false,"context_lines":[{"line_number":437,"context_line":"                domain_id \u003d None"},{"line_number":438,"context_line":"                # First element is unnessecary for extracting name and causes"},{"line_number":439,"context_line":"                # object not iterable error. Remove it."},{"line_number":440,"context_line":"                params \u003d args[1:]"},{"line_number":441,"context_line":"                for arg in params:"},{"line_number":442,"context_line":"                    if \u0027name\u0027 in arg:"},{"line_number":443,"context_line":"                        name \u003d arg[\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_b707371c","line":440,"updated":"2016-12-08 19:13:39.000000000","message":"++","commit_id":"f5b6912e6828d23eab062273e4aff1d88dfec9bb"}],"keystone/tests/unit/common/test_database_conflicts.py":[{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"7826e7556dcab8204b97cd801fc4c681e7b87021","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        try:"},{"line_number":30,"context_line":"            self.resource_api.create_domain(domain[\u0027id\u0027], domain)"},{"line_number":31,"context_line":"        except exception.Conflict as e:"},{"line_number":32,"context_line":"            self.assertIn(\"%s\" % domain[\u0027name\u0027], unicode(e))"},{"line_number":33,"context_line":"        else:"},{"line_number":34,"context_line":"            self.fail(\"Creating duplicate domain did not raise a conflict\")"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a71b18c_1b25ad5b","line":32,"updated":"2016-12-07 19:15:33.000000000","message":"Both domains and projects at creation use a private method to print their own custom conflict duplicate message. The name of the object is already displayed to the user so testing domain and project under this class as well.","commit_id":"f9afd51873caaeb1e0e628c389114c2f4d9cd784"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"20a789b0ac4ca77cfe508e36eba3ed85c412d433","unresolved":false,"context_lines":[{"line_number":21,"context_line":"CONF \u003d keystone.conf.CONF"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class DuplicateTestCase(test_v3.RestfulTestCase, unit.TestCase):"},{"line_number":25,"context_line":"    def test_domain_duplicate_conflict_gives_name(self):"},{"line_number":26,"context_line":"        domain \u003d unit.new_domain_ref()"},{"line_number":27,"context_line":"        self.resource_api.create_domain(domain[\u0027id\u0027], domain)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a71b18c_973f9b24","line":24,"updated":"2016-12-08 19:01:26.000000000","message":"I think we could probably get by with just inheriting from test_v3.RestfulTestCase since unit.TestCase is inherited through rest.ResfulTestCase anyway: \n\nhttps://github.com/openstack/keystone/blob/bcf5676dc2b7f8bd652a3a98c3ebe6b7a448e9ca/keystone/tests/unit/rest.py#L25","commit_id":"9a975aad5bd9c6a4d9e5de1aadd473b3485ba55f"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"76300ba67ac2c6c7671b368eab30e872a7a3762d","unresolved":false,"context_lines":[{"line_number":21,"context_line":"CONF \u003d keystone.conf.CONF"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class DuplicateTestCase(test_v3.RestfulTestCase, unit.TestCase):"},{"line_number":25,"context_line":"    def test_domain_duplicate_conflict_gives_name(self):"},{"line_number":26,"context_line":"        domain \u003d unit.new_domain_ref()"},{"line_number":27,"context_line":"        self.resource_api.create_domain(domain[\u0027id\u0027], domain)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a71b18c_d74e73c0","line":24,"in_reply_to":"3a71b18c_973f9b24","updated":"2016-12-08 19:09:52.000000000","message":"Oops, totally forgot to remove unit.TestCase after adding test_v3 later when playing around with the tests. Thanks lance, nice catch :)","commit_id":"9a975aad5bd9c6a4d9e5de1aadd473b3485ba55f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e3396e7ccee3c755d6c930d79a281594e1e1989c","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    def test_project_duplicate_conflict_gives_name(self):"},{"line_number":37,"context_line":"        project \u003d unit.new_project_ref(domain_id\u003dself.domain_id)"},{"line_number":38,"context_line":"        self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":39,"context_line":"        project[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":40,"context_line":"        try:"},{"line_number":41,"context_line":"            self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":42,"context_line":"        except exception.Conflict as e:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_f1c9b8ad","line":39,"range":{"start_line":39,"start_character":8,"end_line":39,"end_character":40},"updated":"2016-12-08 21:06:29.000000000","message":"testing the conflict is raised based on the ID is weird, cause we generate the ID, it\u0027s not realistic. It\u0027ll happen on name or a combination of name and domain id. Setting up the test like this feels weird to me.","commit_id":"f5b6912e6828d23eab062273e4aff1d88dfec9bb"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"0ed4be68f054b532e30f66edd7aa7ad8b29a0d4d","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    def test_project_duplicate_conflict_gives_name(self):"},{"line_number":37,"context_line":"        project \u003d unit.new_project_ref(domain_id\u003dself.domain_id)"},{"line_number":38,"context_line":"        self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":39,"context_line":"        project[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":40,"context_line":"        try:"},{"line_number":41,"context_line":"            self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":42,"context_line":"        except exception.Conflict as e:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_fa6d04cd","line":39,"range":{"start_line":39,"start_character":8,"end_line":39,"end_character":40},"in_reply_to":"3a71b18c_f1c9b8ad","updated":"2016-12-09 06:45:18.000000000","message":"This is only changing the project[\u0027id\u0027] to avoid having to redundantly create another project and then set the name to the first project. I change the project[\u0027id\u0027] just to show that a project with a different project[\u0027id\u0027] and the same project[\u0027name\u0027] will still raise the duplicate conflict","commit_id":"f5b6912e6828d23eab062273e4aff1d88dfec9bb"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e3396e7ccee3c755d6c930d79a281594e1e1989c","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        try:"},{"line_number":41,"context_line":"            self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":42,"context_line":"        except exception.Conflict as e:"},{"line_number":43,"context_line":"            self.assertIn(\"%s\" % project[\u0027name\u0027], repr(e))"},{"line_number":44,"context_line":"        else:"},{"line_number":45,"context_line":"            self.fail(\"Creating duplicate project did not raise a conflict\")"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_314b302d","line":43,"range":{"start_line":43,"start_character":12,"end_line":43,"end_character":58},"updated":"2016-12-08 21:06:29.000000000","message":"As a heads up, we apparently eat the conflict message at the manager level and issue a new conflict: https://github.com/openstack/keystone/blob/1d35792a3d109ded688eb0263cac45646d349bde/keystone/resource/core.py#L203-L208\n\njust for projects! \\o/","commit_id":"f5b6912e6828d23eab062273e4aff1d88dfec9bb"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"0ed4be68f054b532e30f66edd7aa7ad8b29a0d4d","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        try:"},{"line_number":41,"context_line":"            self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":42,"context_line":"        except exception.Conflict as e:"},{"line_number":43,"context_line":"            self.assertIn(\"%s\" % project[\u0027name\u0027], repr(e))"},{"line_number":44,"context_line":"        else:"},{"line_number":45,"context_line":"            self.fail(\"Creating duplicate project did not raise a conflict\")"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_5a6358dd","line":43,"range":{"start_line":43,"start_character":12,"end_line":43,"end_character":58},"in_reply_to":"3a71b18c_314b302d","updated":"2016-12-09 06:45:18.000000000","message":"Yes I found this interesting. I mentioned it in patch set 6 comments and that I was testing projects and domains here anyway even though it wasn\u0027t directly related to handle_conflicts. The conflict message is different but they already had it working so that it giving the name in the error message so I just assert that here :)","commit_id":"f5b6912e6828d23eab062273e4aff1d88dfec9bb"}],"keystone/tests/unit/common/test_duplicate_objects.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"c5256c6965c1f92e533966b3840ec0ae49f3f1e6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"3a71b18c_2a2c0798","updated":"2016-12-06 22:49:00.000000000","message":"suggest naming this: test_database_conflicts","commit_id":"2a143fa74a8f40dff13b1ab840c834d8c62bb4ce"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"96f1ff8edf14700f36499c56e2835a39bb1b04a4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"3a71b18c_1baa0d86","in_reply_to":"3a71b18c_2a2c0798","updated":"2016-12-07 19:15:16.000000000","message":"Done","commit_id":"2a143fa74a8f40dff13b1ab840c834d8c62bb4ce"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"c5256c6965c1f92e533966b3840ec0ae49f3f1e6","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class DuplicateTestCase(test_v3.RestfulTestCase, unit.TestCase):"},{"line_number":23,"context_line":"    def test_user_duplicate_conflict_gives_name(self):"},{"line_number":24,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":25,"context_line":"        user \u003d self.identity_api.create_user(user)"},{"line_number":26,"context_line":"        try:"},{"line_number":27,"context_line":"            self.identity_api.create_user(user)"},{"line_number":28,"context_line":"        except exception.Conflict as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_0563bc42","line":25,"range":{"start_line":25,"start_character":8,"end_line":25,"end_character":50},"updated":"2016-12-06 22:49:00.000000000","message":"probably want to change the user ID before going to the next line","commit_id":"2a143fa74a8f40dff13b1ab840c834d8c62bb4ce"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"96f1ff8edf14700f36499c56e2835a39bb1b04a4","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class DuplicateTestCase(test_v3.RestfulTestCase, unit.TestCase):"},{"line_number":23,"context_line":"    def test_user_duplicate_conflict_gives_name(self):"},{"line_number":24,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":25,"context_line":"        user \u003d self.identity_api.create_user(user)"},{"line_number":26,"context_line":"        try:"},{"line_number":27,"context_line":"            self.identity_api.create_user(user)"},{"line_number":28,"context_line":"        except exception.Conflict as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_fba471ba","line":25,"range":{"start_line":25,"start_character":8,"end_line":25,"end_character":50},"in_reply_to":"3a71b18c_0563bc42","updated":"2016-12-07 19:15:16.000000000","message":"Done","commit_id":"2a143fa74a8f40dff13b1ab840c834d8c62bb4ce"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"c5256c6965c1f92e533966b3840ec0ae49f3f1e6","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            self.fail(\"Create role_domain did not raise a conflict\")"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def test_role_duplicate_conflict_gives_name(self):"},{"line_number":35,"context_line":"        role \u003d unit.new_role_ref(id\u003d\u0027fake1\u0027, name\u003d\u0027fake1name\u0027)"},{"line_number":36,"context_line":"        self.role_api.create_role(\u0027fake1\u0027, role)"},{"line_number":37,"context_line":"        role[\u0027id\u0027] \u003d \u0027fake2\u0027"},{"line_number":38,"context_line":"        try:"},{"line_number":39,"context_line":"            self.role_api.create_role(role[\u0027id\u0027], role)"},{"line_number":40,"context_line":"        except exception.Conflict as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_450bf47c","line":37,"range":{"start_line":35,"start_character":0,"end_line":37,"end_character":28},"updated":"2016-12-06 22:49:00.000000000","message":"we probably want to test the name conflicts, not the ID. Also, no need to pass in things as name and ID are defaulted to uuid.\n\n    role_ref \u003d unit.new_role_ref()\n    self.role_api.create_role(role_ref[\u0027name\u0027], role_ref)\n    role_ref[\u0027id\u0027] \u003d some_new_uuid\n\n  try:\n    self.role_api.create_role(role_ref[\u0027name\u0027], role_ref)\n  except:\n     ..","commit_id":"2a143fa74a8f40dff13b1ab840c834d8c62bb4ce"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"96f1ff8edf14700f36499c56e2835a39bb1b04a4","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            self.fail(\"Create role_domain did not raise a conflict\")"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def test_role_duplicate_conflict_gives_name(self):"},{"line_number":35,"context_line":"        role \u003d unit.new_role_ref(id\u003d\u0027fake1\u0027, name\u003d\u0027fake1name\u0027)"},{"line_number":36,"context_line":"        self.role_api.create_role(\u0027fake1\u0027, role)"},{"line_number":37,"context_line":"        role[\u0027id\u0027] \u003d \u0027fake2\u0027"},{"line_number":38,"context_line":"        try:"},{"line_number":39,"context_line":"            self.role_api.create_role(role[\u0027id\u0027], role)"},{"line_number":40,"context_line":"        except exception.Conflict as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_7bca2170","line":37,"range":{"start_line":35,"start_character":0,"end_line":37,"end_character":28},"in_reply_to":"3a71b18c_450bf47c","updated":"2016-12-07 19:15:16.000000000","message":"wouldn\u0027t self.role_api.create_role(role_ref[\u0027name\u0027], role_ref) pass the name as the role id? Changing the role_ref[\u0027id\u0027] and passing that as the first argument in create_role will still cause the conflict error and desired message if the role[\u0027name\u0027] inside role_ref matches anything previously created","commit_id":"2a143fa74a8f40dff13b1ab840c834d8c62bb4ce"}]}
