)]}'
{"nova/api/openstack/placement/handlers/aggregate.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"164e935103ebcbe2a52b5721c1c50a10711ab74e","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    resource_provider \u003d rp_obj.ResourceProvider.get_by_uuid("},{"line_number":85,"context_line":"        context, uuid)"},{"line_number":86,"context_line":"    data \u003d util.extract_json(req.body, put_schema)"},{"line_number":87,"context_line":"    if want_version.matches(min_version\u003d_INCLUDE_GENERATION_VERSION):"},{"line_number":88,"context_line":"        # Check for generation conflict"},{"line_number":89,"context_line":"        rp_gen \u003d data[\u0027resource_provider_generation\u0027]"},{"line_number":90,"context_line":"        if resource_provider.generation !\u003d rp_gen:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f9dbf25_0521fffb","line":87,"updated":"2018-02-28 17:18:36.000000000","message":"This is probably a reasonable short circuit, but you could also let _increment_provider_generation raise (and catch the conflict here and reraise, thus making the context cause a revert).","commit_id":"61defbdbb4ca84bb7348b92583e901b9d04cda03"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0366707d3724e0802fc23c8416b927eee4facd18","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    resource_provider \u003d rp_obj.ResourceProvider.get_by_uuid("},{"line_number":85,"context_line":"        context, uuid)"},{"line_number":86,"context_line":"    data \u003d util.extract_json(req.body, put_schema)"},{"line_number":87,"context_line":"    if want_version.matches(min_version\u003d_INCLUDE_GENERATION_VERSION):"},{"line_number":88,"context_line":"        # Check for generation conflict"},{"line_number":89,"context_line":"        rp_gen \u003d data[\u0027resource_provider_generation\u0027]"},{"line_number":90,"context_line":"        if resource_provider.generation !\u003d rp_gen:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f9dbf25_424ff8bc","line":87,"in_reply_to":"1f9dbf25_0521fffb","updated":"2018-02-28 22:49:33.000000000","message":"That\u0027s a different conflict (and based on what we talked about the other day, one that can\u0027t happen).","commit_id":"61defbdbb4ca84bb7348b92583e901b9d04cda03"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"164e935103ebcbe2a52b5721c1c50a10711ab74e","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        rp_gen \u003d data[\u0027resource_provider_generation\u0027]"},{"line_number":90,"context_line":"        if resource_provider.generation !\u003d rp_gen:"},{"line_number":91,"context_line":"            raise webob.exc.HTTPConflict("},{"line_number":92,"context_line":"                _("},{"line_number":93,"context_line":"                    \"Resource provider\u0027s generation already changed. Please \""},{"line_number":94,"context_line":"                    \"update the generation and try again.\"),"},{"line_number":95,"context_line":"                json_formatter\u003dutil.json_error_formatter)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f9dbf25_25ff5bab","line":92,"updated":"2018-02-28 17:18:36.000000000","message":"funky formatting going on here","commit_id":"61defbdbb4ca84bb7348b92583e901b9d04cda03"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0366707d3724e0802fc23c8416b927eee4facd18","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        rp_gen \u003d data[\u0027resource_provider_generation\u0027]"},{"line_number":90,"context_line":"        if resource_provider.generation !\u003d rp_gen:"},{"line_number":91,"context_line":"            raise webob.exc.HTTPConflict("},{"line_number":92,"context_line":"                _("},{"line_number":93,"context_line":"                    \"Resource provider\u0027s generation already changed. Please \""},{"line_number":94,"context_line":"                    \"update the generation and try again.\"),"},{"line_number":95,"context_line":"                json_formatter\u003dutil.json_error_formatter)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f9dbf25_22cc2c34","line":92,"in_reply_to":"1f9dbf25_25ff5bab","updated":"2018-02-28 22:49:33.000000000","message":"Done","commit_id":"61defbdbb4ca84bb7348b92583e901b9d04cda03"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"164e935103ebcbe2a52b5721c1c50a10711ab74e","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                _("},{"line_number":93,"context_line":"                    \"Resource provider\u0027s generation already changed. Please \""},{"line_number":94,"context_line":"                    \"update the generation and try again.\"),"},{"line_number":95,"context_line":"                json_formatter\u003dutil.json_error_formatter)"},{"line_number":96,"context_line":"        aggregate_uuids \u003d data[\u0027aggregates\u0027]"},{"line_number":97,"context_line":"    else:"},{"line_number":98,"context_line":"        aggregate_uuids \u003d data"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f9dbf25_651ec30d","line":95,"updated":"2018-02-28 17:18:36.000000000","message":"you don\u0027t need to do this any more, the wsgi_wrapper adds the json_formatter.","commit_id":"61defbdbb4ca84bb7348b92583e901b9d04cda03"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0366707d3724e0802fc23c8416b927eee4facd18","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                _("},{"line_number":93,"context_line":"                    \"Resource provider\u0027s generation already changed. Please \""},{"line_number":94,"context_line":"                    \"update the generation and try again.\"),"},{"line_number":95,"context_line":"                json_formatter\u003dutil.json_error_formatter)"},{"line_number":96,"context_line":"        aggregate_uuids \u003d data[\u0027aggregates\u0027]"},{"line_number":97,"context_line":"    else:"},{"line_number":98,"context_line":"        aggregate_uuids \u003d data"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f9dbf25_a2d7dcbf","line":95,"in_reply_to":"1f9dbf25_651ec30d","updated":"2018-02-28 22:49:33.000000000","message":"Done","commit_id":"61defbdbb4ca84bb7348b92583e901b9d04cda03"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"74dfbe32466780e268c694bc6bfcf1234844ff30","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        aggregate_uuids \u003d data[\u0027aggregates\u0027]"},{"line_number":97,"context_line":"    else:"},{"line_number":98,"context_line":"        aggregate_uuids \u003d data"},{"line_number":99,"context_line":"    resource_provider.set_aggregates("},{"line_number":100,"context_line":"        aggregate_uuids, increment_generation\u003dconsider_generation)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    return _send_aggregates(req, resource_provider, aggregate_uuids)"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_948b62c1","line":100,"range":{"start_line":99,"start_character":0,"end_line":100,"end_character":66},"updated":"2018-03-14 21:49:42.000000000","message":"you will need to catch the concurrent update exception that might be raised due to a race in between lines 86 and here.\n\nSee here for what needs to happen:\n\nhttps://github.com/openstack/nova/blob/master/nova/api/openstack/placement/handlers/inventory.py#L171-L174","commit_id":"4b066f693a37dbb82b3fc9030dcb55a02be5912f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"36ee047e2bbcef7a7f2951634eb9d13d509da40e","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        aggregate_uuids \u003d data[\u0027aggregates\u0027]"},{"line_number":97,"context_line":"    else:"},{"line_number":98,"context_line":"        aggregate_uuids \u003d data"},{"line_number":99,"context_line":"    resource_provider.set_aggregates("},{"line_number":100,"context_line":"        aggregate_uuids, increment_generation\u003dconsider_generation)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    return _send_aggregates(req, resource_provider, aggregate_uuids)"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_57b70c3b","line":100,"range":{"start_line":99,"start_character":0,"end_line":100,"end_character":66},"in_reply_to":"df7087c5_948b62c1","updated":"2018-03-14 22:10:34.000000000","message":"Done","commit_id":"4b066f693a37dbb82b3fc9030dcb55a02be5912f"}],"nova/api/openstack/placement/microversion.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"164e935103ebcbe2a52b5721c1c50a10711ab74e","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    \u00271.17\u0027,  # Add \u0027required\u0027 query parameter to GET /allocation_candidates and"},{"line_number":62,"context_line":"             # return traits in the provider summary."},{"line_number":63,"context_line":"    \u00271.18\u0027,  # Support ?required\u003d\u003ctraits\u003e queryparam on GET /resource_providers"},{"line_number":64,"context_line":"    \u00271.19\u0027,  # Include generation and conflict detection in RP aggregates APIs"},{"line_number":65,"context_line":"]"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1f9dbf25_05f01fc9","line":64,"updated":"2018-02-28 17:18:36.000000000","message":"prefer not RP abbreviation here","commit_id":"61defbdbb4ca84bb7348b92583e901b9d04cda03"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0366707d3724e0802fc23c8416b927eee4facd18","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    \u00271.17\u0027,  # Add \u0027required\u0027 query parameter to GET /allocation_candidates and"},{"line_number":62,"context_line":"             # return traits in the provider summary."},{"line_number":63,"context_line":"    \u00271.18\u0027,  # Support ?required\u003d\u003ctraits\u003e queryparam on GET /resource_providers"},{"line_number":64,"context_line":"    \u00271.19\u0027,  # Include generation and conflict detection in RP aggregates APIs"},{"line_number":65,"context_line":"]"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1f9dbf25_22674c50","line":64,"in_reply_to":"1f9dbf25_05f01fc9","updated":"2018-02-28 22:49:33.000000000","message":"Done","commit_id":"61defbdbb4ca84bb7348b92583e901b9d04cda03"}],"nova/api/openstack/placement/rest_api_version_history.rst":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"164e935103ebcbe2a52b5721c1c50a10711ab74e","unresolved":false,"context_lines":[{"line_number":234,"context_line":"Trait names which are empty, do not exist, or are otherwise invalid will result"},{"line_number":235,"context_line":"in a 400 error."},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"1.19 Include generation and conflict detection in RP aggregates APIs"},{"line_number":238,"context_line":"--------------------------------------------------------------------"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"Enhance the payloads for the `GET /resource_providers/{uuid}/aggregates`"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1f9dbf25_c5bb17e3","line":237,"updated":"2018-02-28 17:18:36.000000000","message":"avoid abbrev","commit_id":"61defbdbb4ca84bb7348b92583e901b9d04cda03"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0366707d3724e0802fc23c8416b927eee4facd18","unresolved":false,"context_lines":[{"line_number":234,"context_line":"Trait names which are empty, do not exist, or are otherwise invalid will result"},{"line_number":235,"context_line":"in a 400 error."},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"1.19 Include generation and conflict detection in RP aggregates APIs"},{"line_number":238,"context_line":"--------------------------------------------------------------------"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"Enhance the payloads for the `GET /resource_providers/{uuid}/aggregates`"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1f9dbf25_42e4d8ac","line":237,"in_reply_to":"1f9dbf25_c5bb17e3","updated":"2018-02-28 22:49:33.000000000","message":"Done","commit_id":"61defbdbb4ca84bb7348b92583e901b9d04cda03"}],"nova/objects/resource_provider.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"164e935103ebcbe2a52b5721c1c50a10711ab74e","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        context.session.execute(insert_aggregates)"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"    resource_provider.generation \u003d _increment_provider_generation("},{"line_number":493,"context_line":"        context, resource_provider)"},{"line_number":494,"context_line":""},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"@db_api.api_context_manager.reader"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f9dbf25_65c80355","line":493,"updated":"2018-02-28 17:18:36.000000000","message":"Based on our earlier discussion about transactions and the resource provider read you do at the begin of the web handler, does this ever conflict? Presumably not.\n\nBut if it _can_ then we need to catch the exception in the handler.","commit_id":"61defbdbb4ca84bb7348b92583e901b9d04cda03"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0366707d3724e0802fc23c8416b927eee4facd18","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        context.session.execute(insert_aggregates)"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"    resource_provider.generation \u003d _increment_provider_generation("},{"line_number":493,"context_line":"        context, resource_provider)"},{"line_number":494,"context_line":""},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"@db_api.api_context_manager.reader"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f9dbf25_424858cb","line":493,"in_reply_to":"1f9dbf25_65c80355","updated":"2018-02-28 22:49:33.000000000","message":"I was assuming not, based on our earlier discussion.","commit_id":"61defbdbb4ca84bb7348b92583e901b9d04cda03"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"672fe74107333743ed7ce48d8b993abc0968419f","unresolved":false,"context_lines":[{"line_number":768,"context_line":"        If an aggregate does not exist, one will be created using the"},{"line_number":769,"context_line":"        provided uuid."},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"        The resource provider generation is incremented if and only if the"},{"line_number":772,"context_line":"        increment_generation parameter is True."},{"line_number":773,"context_line":"        \"\"\""},{"line_number":774,"context_line":"        _set_aggregates(self._context, self, aggregate_uuids,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff6b8bd7_5745786f","line":771,"range":{"start_line":771,"start_character":44,"end_line":771,"end_character":74},"updated":"2018-03-06 07:49:25.000000000","message":"incremented only if the ?","commit_id":"5a8f93d218d23b60920a07358a43b70f35feb352"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"be3e9424cb83b0f2473ba610ee3b99105147fb9b","unresolved":false,"context_lines":[{"line_number":768,"context_line":"        If an aggregate does not exist, one will be created using the"},{"line_number":769,"context_line":"        provided uuid."},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"        The resource provider generation is incremented if and only if the"},{"line_number":772,"context_line":"        increment_generation parameter is True."},{"line_number":773,"context_line":"        \"\"\""},{"line_number":774,"context_line":"        _set_aggregates(self._context, self, aggregate_uuids,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff6b8bd7_d2a0b3a8","line":771,"range":{"start_line":771,"start_character":44,"end_line":771,"end_character":74},"in_reply_to":"ff6b8bd7_5745786f","updated":"2018-03-06 10:50:03.000000000","message":"\"If and only if\" is an idiomatic phrase in English that means \"the only time this should ever happen is if this thing is true\". It\u0027s being used correctly here.","commit_id":"5a8f93d218d23b60920a07358a43b70f35feb352"}],"nova/tests/functional/api/openstack/placement/gabbits/aggregate.yaml":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"164e935103ebcbe2a52b5721c1c50a10711ab74e","unresolved":false,"context_lines":[{"line_number":118,"context_line":"  PUT: $LAST_URL"},{"line_number":119,"context_line":"  data:"},{"line_number":120,"context_line":"      - harry"},{"line_number":121,"context_line":"      - sally"},{"line_number":122,"context_line":"  status: 400"},{"line_number":123,"context_line":"  response_strings:"},{"line_number":124,"context_line":"      - JSON does not validate"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"1f9dbf25_c505577c","side":"PARENT","line":121,"updated":"2018-02-28 17:18:36.000000000","message":"you\u0027re removing a legit test here for input that is completely the wrong format\n\nWhich, sure, we have several different kinds of throughout this. But I\u0027d suggest you create a fully new test rather than modifying this one.\n\nIt doesn\u0027t _matter_ hugely, but cleanliness.","commit_id":"cbd67030d0a5c34e24da2d87363f0f46940462ca"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0366707d3724e0802fc23c8416b927eee4facd18","unresolved":false,"context_lines":[{"line_number":118,"context_line":"  PUT: $LAST_URL"},{"line_number":119,"context_line":"  data:"},{"line_number":120,"context_line":"      - harry"},{"line_number":121,"context_line":"      - sally"},{"line_number":122,"context_line":"  status: 400"},{"line_number":123,"context_line":"  response_strings:"},{"line_number":124,"context_line":"      - JSON does not validate"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"1f9dbf25_62f0f491","side":"PARENT","line":121,"in_reply_to":"1f9dbf25_c505577c","updated":"2018-02-28 22:49:33.000000000","message":"I suppose it\u0027s somewhat ambiguous, since both versions of the test fail for JSON validation.  But the purpose both before and after is to fail on the validation of the aggregate values not being UUID-like.  So I maintain that the delta is legit; but to make it more explicit, I could look for the \"is not a \u0027uuid\u0027\" part of the error message.","commit_id":"cbd67030d0a5c34e24da2d87363f0f46940462ca"}],"nova/tests/functional/api/openstack/placement/test_report_client.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ae43dfd4fb0168442a6d09d5e3aacb9a78ea2aa2","unresolved":false,"context_lines":[{"line_number":358,"context_line":"                self.client.set_aggregates_for_provider(self.context, uuid,"},{"line_number":359,"context_line":"                                                        [uuids.agg_ip])"},{"line_number":360,"context_line":"                # Set some traits on \u0027em"},{"line_number":361,"context_line":"                self.client.set_traits_for_provider("},{"line_number":362,"context_line":"                    self.context, uuid, [\u0027CUSTOM_PHYSNET_%d\u0027 % x])"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"            # Register three shared storage pools with disk inventory"},{"line_number":365,"context_line":"            for x in (1, 2, 3):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f9dbf25_25ed1bef","line":362,"range":{"start_line":361,"start_character":16,"end_line":362,"end_character":66},"updated":"2018-02-28 17:01:29.000000000","message":"This gets a generation conflict, because L358 is incrementing the generation but our cache is not.","commit_id":"61defbdbb4ca84bb7348b92583e901b9d04cda03"}],"placement-api-ref/source/aggregates.inc":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"164e935103ebcbe2a52b5721c1c50a10711ab74e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"Normal Response Codes: 200"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Error response codes: itemNotFound(404) if the provider does not exist. (If the"},{"line_number":62,"context_line":"provider has no aggregates, the result is 200 with an empty aggregate list.)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"Request"},{"line_number":65,"context_line":"-------"}],"source_content_type":"text/x-c++src","patch_set":2,"id":"1f9dbf25_a5392b42","line":62,"updated":"2018-02-28 17:18:36.000000000","message":"legit change, but do you want it here?\n\nI certainly don\u0027t mind.","commit_id":"61defbdbb4ca84bb7348b92583e901b9d04cda03"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0366707d3724e0802fc23c8416b927eee4facd18","unresolved":false,"context_lines":[{"line_number":59,"context_line":"Normal Response Codes: 200"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Error response codes: itemNotFound(404) if the provider does not exist. (If the"},{"line_number":62,"context_line":"provider has no aggregates, the result is 200 with an empty aggregate list.)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"Request"},{"line_number":65,"context_line":"-------"}],"source_content_type":"text/x-c++src","patch_set":2,"id":"1f9dbf25_e2ee4487","line":62,"in_reply_to":"1f9dbf25_a5392b42","updated":"2018-02-28 22:49:33.000000000","message":"When I saw this, I had to go try it out to see whether \"no aggregates\" also returned 404.  And meh, since I\u0027m updating the API, I feel I can get away with changing this here.","commit_id":"61defbdbb4ca84bb7348b92583e901b9d04cda03"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"672fe74107333743ed7ce48d8b993abc0968419f","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Normal Response Codes: 200"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Error response codes: badRequest(400), itemNotFound(404)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"Request (microversion 1.1 - 1.18)"},{"line_number":110,"context_line":"---------------------------------"}],"source_content_type":"text/x-c++src","patch_set":4,"id":"ff6b8bd7_170dc03d","line":107,"range":{"start_line":107,"start_character":0,"end_line":107,"end_character":20},"updated":"2018-03-06 07:49:25.000000000","message":"conflict(409) should be added.","commit_id":"5a8f93d218d23b60920a07358a43b70f35feb352"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2cff127da94a9665b83416c4d259e305cc789627","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Normal Response Codes: 200"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Error response codes: badRequest(400), itemNotFound(404)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"Request (microversion 1.1 - 1.18)"},{"line_number":110,"context_line":"---------------------------------"}],"source_content_type":"text/x-c++src","patch_set":4,"id":"df7087c5_6fe29aa2","line":107,"range":{"start_line":107,"start_character":0,"end_line":107,"end_character":20},"in_reply_to":"ff6b8bd7_170dc03d","updated":"2018-03-13 18:19:16.000000000","message":"Done","commit_id":"5a8f93d218d23b60920a07358a43b70f35feb352"}]}
