)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"09576bcefdc839a1bf6aff1c50faf06fa390afed","unresolved":false,"context_lines":[{"line_number":19,"context_line":"   * Do we need a microversion for this? Strictly speaking we do"},{"line_number":20,"context_line":"     because things that were previously a 400 will now sometimes"},{"line_number":21,"context_line":"     work. On the other hand, stuff that already worked will"},{"line_number":22,"context_line":"     continue to work without additional signalling."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"   * If we do a microversion how much of the large collection of"},{"line_number":25,"context_line":"     nested-related improvements should be in the same microversion?"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"dfbec78f_47bdb8b5","line":22,"updated":"2019-05-06 18:23:33.000000000","message":"I think it\u0027s okay without a microversion. What client is going to be counting on getting an error for a malformed suffix?\n\nBut meh, either way, and see below.","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"baf2acea8eaf738bd98f3096d165c2c53410c1ab","unresolved":false,"context_lines":[{"line_number":19,"context_line":"   * Do we need a microversion for this? Strictly speaking we do"},{"line_number":20,"context_line":"     because things that were previously a 400 will now sometimes"},{"line_number":21,"context_line":"     work. On the other hand, stuff that already worked will"},{"line_number":22,"context_line":"     continue to work without additional signalling."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"   * If we do a microversion how much of the large collection of"},{"line_number":25,"context_line":"     nested-related improvements should be in the same microversion?"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"dfbec78f_e7838c03","line":22,"updated":"2019-05-06 18:18:20.000000000","message":"Sounds like a new microversion to me.","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"09576bcefdc839a1bf6aff1c50faf06fa390afed","unresolved":false,"context_lines":[{"line_number":21,"context_line":"     work. On the other hand, stuff that already worked will"},{"line_number":22,"context_line":"     continue to work without additional signalling."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"   * If we do a microversion how much of the large collection of"},{"line_number":25,"context_line":"     nested-related improvements should be in the same microversion?"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"   * See the TODO within about error messages with poorly formed"},{"line_number":28,"context_line":"     grouping params."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"dfbec78f_07b7c0d7","line":25,"range":{"start_line":24,"start_character":0,"end_line":25,"end_character":68},"updated":"2019-05-06 18:23:33.000000000","message":"I was going to say we may as well throw this feature in the same microversion (though not the same patch (series)) with [some] other stuff, though I\u0027m not sure what other stuff...","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"baf2acea8eaf738bd98f3096d165c2c53410c1ab","unresolved":false,"context_lines":[{"line_number":22,"context_line":"     continue to work without additional signalling."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"   * If we do a microversion how much of the large collection of"},{"line_number":25,"context_line":"     nested-related improvements should be in the same microversion?"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"   * See the TODO within about error messages with poorly formed"},{"line_number":28,"context_line":"     grouping params."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"dfbec78f_87741037","line":25,"updated":"2019-05-06 18:18:20.000000000","message":"Only those that are format-related like this. If any have significant behavioral changes, they should be separate, if only for documentation purposes.","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"}],"api-ref/source/parameters.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e2da6db5b983f658a482fff6b7437ad2716c932f","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    A string representing a resource provider uuid. The parameter key is"},{"line_number":71,"context_line":"    ``in_treeN``, where ``N`` represents a suffix corresponding with a"},{"line_number":72,"context_line":"    ``resourcesN`` parameter. When supplied, it will filter the returned"},{"line_number":73,"context_line":"    allocation candidates for that numbered group to only those resource"},{"line_number":74,"context_line":"    providers that are in the same tree with the given resource provider."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    **In microversions 1.25 - 1.32** the suffix is a number."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"bfb3d3c7_1f194984","line":73,"range":{"start_line":73,"start_character":35,"end_line":73,"end_character":43},"updated":"2019-05-20 22:06:38.000000000","message":"why?","commit_id":"0bd6853fc2f1d1ea9ea50d035961870f6b05dd59"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"c4cbbfa5e2bb6f0c090c7a37e8e531be0e967f64","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    A string representing a resource provider uuid. The parameter key is"},{"line_number":71,"context_line":"    ``in_treeN``, where ``N`` represents a suffix corresponding with a"},{"line_number":72,"context_line":"    ``resourcesN`` parameter. When supplied, it will filter the returned"},{"line_number":73,"context_line":"    allocation candidates for that numbered group to only those resource"},{"line_number":74,"context_line":"    providers that are in the same tree with the given resource provider."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    **In microversions 1.25 - 1.32** the suffix is a number."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"bfb3d3c7_b6213fb7","line":73,"range":{"start_line":73,"start_character":35,"end_line":73,"end_character":43},"in_reply_to":"bfb3d3c7_1f194984","updated":"2019-05-28 09:54:50.000000000","message":"oversight\n\nI was merging old and middle versions into this new version","commit_id":"0bd6853fc2f1d1ea9ea50d035961870f6b05dd59"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e2da6db5b983f658a482fff6b7437ad2716c932f","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    **In microversions 1.25 - 1.32** the suffix is a number."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    **Starting from microversion 1.33** the suffix is a string that may be 1-64"},{"line_number":79,"context_line":"    characters long and consists of numbers, ``a-z``, ``A-Z``, ``-``, and"},{"line_number":80,"context_line":"    ``_``."},{"line_number":81,"context_line":"allocation_candidates_limit:"},{"line_number":82,"context_line":"  type: integer"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"bfb3d3c7_bf24bdc7","line":79,"range":{"start_line":79,"start_character":24,"end_line":79,"end_character":32},"updated":"2019-05-20 22:06:38.000000000","message":"consist (throughout)","commit_id":"0bd6853fc2f1d1ea9ea50d035961870f6b05dd59"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"c4cbbfa5e2bb6f0c090c7a37e8e531be0e967f64","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    **In microversions 1.25 - 1.32** the suffix is a number."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    **Starting from microversion 1.33** the suffix is a string that may be 1-64"},{"line_number":79,"context_line":"    characters long and consists of numbers, ``a-z``, ``A-Z``, ``-``, and"},{"line_number":80,"context_line":"    ``_``."},{"line_number":81,"context_line":"allocation_candidates_limit:"},{"line_number":82,"context_line":"  type: integer"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"bfb3d3c7_d63ab3e5","line":79,"range":{"start_line":79,"start_character":24,"end_line":79,"end_character":32},"in_reply_to":"bfb3d3c7_bf24bdc7","updated":"2019-05-28 09:54:50.000000000","message":"I think I must have had a version of this somewhere where the \"may be\" was not there. But yeah, fixing.","commit_id":"0bd6853fc2f1d1ea9ea50d035961870f6b05dd59"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bacf4620a4c77d0688ad094907a9d94d545c6b49","unresolved":false,"context_lines":[{"line_number":50,"context_line":"  description: \u003e"},{"line_number":51,"context_line":"    When more than one ``resourcesN`` query parameter is supplied,"},{"line_number":52,"context_line":"    ``group_policy`` is required to indicate how the groups should interact."},{"line_number":53,"context_line":"    With ``group_policy\u003dnone``, separate groupings - numbered or unnumbered -"},{"line_number":54,"context_line":"    may or may not be satisfied by the same provider. With"},{"line_number":55,"context_line":"    ``group_policy\u003disolate``, numbered groups are guaranteed to be satisfied by"},{"line_number":56,"context_line":"    *different* providers - though there may still be overlap with the"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"bfb3d3c7_7ea7b2be","side":"PARENT","line":53,"range":{"start_line":53,"start_character":65,"end_line":53,"end_character":75},"updated":"2019-05-28 09:17:55.000000000","message":"There is plenty of places in the placement repo where it is still called unnumbered. Do we want o fix those in a followup?\n\n\n~/upstream/git/placement$ grep unnumbered -R .\n./placement/rest_api_version_history.rst:unnumbered - may or may not be satisfied by the same provider. With\n./placement/rest_api_version_history.rst:*different* providers - though there may still be overlap with the unnumbered\n./placement/rest_api_version_history.rst:The semantic of the (unnumbered) ``resources``, ``required``, and ``member_of``\n./placement/rest_api_version_history.rst:(including the unnumbered group). However, it can be useful in cases where a\n./placement/tests/unit/test_util.py:    def test_unnumbered_only(self):\n./placement/tests/unit/test_util.py:    def test_unnumbered_resources_only(self):\n./placement/tests/unit/test_util.py:    def test_numbered_and_unnumbered(self):\n./placement/tests/unit/test_util.py:    def test_400_traits_no_resources_unnumbered(self):\n./placement/tests/functional/gabbits/allocation-candidates.yaml:- name: get allocation candidates in tree unnumbered compute granular disk from shared storage only\n./placement/tests/functional/gabbits/allocation-candidates.yaml:- name: get allocation candidates in tree unnumbered compute granular disk from shared or local\n./releasenotes/notes/alloc-candidates-in-tree-f69b0de5ba33096b.yaml:    in other groups (including the unnumbered group). However, it can be\n./api-ref/source/allocation_candidates.inc:  - required: required_traits_unnumbered\n./api-ref/source/parameters.yaml:required_traits_unnumbered:","commit_id":"1281806c99ceb80fed78237b39aa34b9097a39e6"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"c4cbbfa5e2bb6f0c090c7a37e8e531be0e967f64","unresolved":false,"context_lines":[{"line_number":50,"context_line":"  description: \u003e"},{"line_number":51,"context_line":"    When more than one ``resourcesN`` query parameter is supplied,"},{"line_number":52,"context_line":"    ``group_policy`` is required to indicate how the groups should interact."},{"line_number":53,"context_line":"    With ``group_policy\u003dnone``, separate groupings - numbered or unnumbered -"},{"line_number":54,"context_line":"    may or may not be satisfied by the same provider. With"},{"line_number":55,"context_line":"    ``group_policy\u003disolate``, numbered groups are guaranteed to be satisfied by"},{"line_number":56,"context_line":"    *different* providers - though there may still be overlap with the"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"bfb3d3c7_916a977e","side":"PARENT","line":53,"range":{"start_line":53,"start_character":65,"end_line":53,"end_character":75},"in_reply_to":"bfb3d3c7_7ea7b2be","updated":"2019-05-28 09:54:50.000000000","message":"My thinking was that we didn\u0027t want to change things where we didn\u0027t have to because:\n\n* we want to avoid churn that isn\u0027t that meaningful\n* in older microversions numbered is the correct term\n\nIt\u0027s not perfect, especially in some test names and this file, but I felt it would get too hairy to try to be perfect.","commit_id":"1281806c99ceb80fed78237b39aa34b9097a39e6"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bacf4620a4c77d0688ad094907a9d94d545c6b49","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    **Starting from microversion 1.33** the suffix is a string that may be 1-64"},{"line_number":167,"context_line":"    characters long and consist of numbers, ``a-z``, ``A-Z``, ``-``, and ``_``."},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    Separate groupings - with or without a suffix - may or may not be satisfied"},{"line_number":170,"context_line":"    by the same provider, depending on the value of the ``group_policy``"},{"line_number":171,"context_line":"    parameter."},{"line_number":172,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":7,"id":"bfb3d3c7_fe92c256","line":169,"range":{"start_line":169,"start_character":33,"end_line":169,"end_character":49},"updated":"2019-05-28 09:17:55.000000000","message":"does group policy affects the unsuffixed group ?","commit_id":"fb0f6f2608b64546c61fa7aa359e8fdbef83a8a5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f5c5c43a6cad9bc6ac9d7ce7a99ca9706e3dff9a","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    **Starting from microversion 1.33** the suffix is a string that may be 1-64"},{"line_number":167,"context_line":"    characters long and consist of numbers, ``a-z``, ``A-Z``, ``-``, and ``_``."},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    Separate groupings - with or without a suffix - may or may not be satisfied"},{"line_number":170,"context_line":"    by the same provider, depending on the value of the ``group_policy``"},{"line_number":171,"context_line":"    parameter."},{"line_number":172,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":7,"id":"bfb3d3c7_aa2ba492","line":169,"range":{"start_line":169,"start_character":33,"end_line":169,"end_character":49},"in_reply_to":"bfb3d3c7_11c9c7aa","updated":"2019-05-28 13:24:38.000000000","message":"Another way to look at it is that group_policy does not affect the unsuffixed group, which has always (at any microversion, before and after granular was a thing) been able to be satisfied by multiple providers.","commit_id":"fb0f6f2608b64546c61fa7aa359e8fdbef83a8a5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"c4cbbfa5e2bb6f0c090c7a37e8e531be0e967f64","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    **Starting from microversion 1.33** the suffix is a string that may be 1-64"},{"line_number":167,"context_line":"    characters long and consist of numbers, ``a-z``, ``A-Z``, ``-``, and ``_``."},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    Separate groupings - with or without a suffix - may or may not be satisfied"},{"line_number":170,"context_line":"    by the same provider, depending on the value of the ``group_policy``"},{"line_number":171,"context_line":"    parameter."},{"line_number":172,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":7,"id":"bfb3d3c7_11c9c7aa","line":169,"range":{"start_line":169,"start_character":33,"end_line":169,"end_character":49},"in_reply_to":"bfb3d3c7_fe92c256","updated":"2019-05-28 09:54:50.000000000","message":"According to the spec when group_policy is \u0027none\u0027 it works on both and \u0027isolate\u0027 only works on suffixed.\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/rocky/implemented/granular-resource-requests.html#semantics\n\nIn any case, this change merely maintains what was already said in the docs, just adjusting the \u0027numbered\u0027 to \u0027suffix\u0027.","commit_id":"fb0f6f2608b64546c61fa7aa359e8fdbef83a8a5"}],"doc/source/usage/provider-tree.rst":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"06c4405f7e6bfe3fbe6afd5436796e44b71be6d3","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    proposed separately and in progress. See the `Support subtree filter`_"},{"line_number":359,"context_line":"    specification for details."},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"The suffixed syntax ``in_tree\u003cN\u003e`` is also supported according to"},{"line_number":362,"context_line":"`Granular Resource Requests`_. This restricts providers satisfying the Nth"},{"line_number":363,"context_line":"granular request group to the tree of the specified provider."},{"line_number":364,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_672ff387","line":361,"range":{"start_line":361,"start_character":4,"end_line":361,"end_character":10},"updated":"2019-05-16 13:40:59.000000000","message":"Are we calling this \u0027suffixed\u0027 or \u0027granular\u0027, or are we just going to use both?","commit_id":"3e24cd859d8fa8802453bb37283a41474afb80be"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d3802b5b135a2f3b29c76de49d4727d6c6b75913","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    proposed separately and in progress. See the `Support subtree filter`_"},{"line_number":359,"context_line":"    specification for details."},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"The suffixed syntax ``in_tree\u003cN\u003e`` is also supported according to"},{"line_number":362,"context_line":"`Granular Resource Requests`_. This restricts providers satisfying the Nth"},{"line_number":363,"context_line":"granular request group to the tree of the specified provider."},{"line_number":364,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_a2dab974","line":361,"range":{"start_line":361,"start_character":4,"end_line":361,"end_character":10},"in_reply_to":"dfbec78f_672ff387","updated":"2019-05-16 14:33:23.000000000","message":"I used both because in some cases it made sense to talk about the concept as granular and the syntax as suffixed. Also, sometimes the surrounding words made one seems better than the other.\n\nIf you need something for the spec I do as I\u0027ve said in the first sentence: concept v syntax. If that works.","commit_id":"3e24cd859d8fa8802453bb37283a41474afb80be"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6d7053881d372a1eae4e5981a97030b8b5a7fa0c","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    proposed separately and in progress. See the `Support subtree filter`_"},{"line_number":359,"context_line":"    specification for details."},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"The suffixed syntax ``in_tree\u003cN\u003e`` is also supported according to"},{"line_number":362,"context_line":"`Granular Resource Requests`_. This restricts providers satisfying the Nth"},{"line_number":363,"context_line":"granular request group to the tree of the specified provider."},{"line_number":364,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_7d58e3f8","line":361,"range":{"start_line":361,"start_character":4,"end_line":361,"end_character":10},"in_reply_to":"dfbec78f_a2dab974","updated":"2019-05-16 16:03:45.000000000","message":"Okay, wfm.","commit_id":"3e24cd859d8fa8802453bb37283a41474afb80be"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"06c4405f7e6bfe3fbe6afd5436796e44b71be6d3","unresolved":false,"context_lines":[{"line_number":377,"context_line":"5. ``NUMA1_1`` (``VCPU``) + ``SS2`` (``DISK_GB``)"},{"line_number":378,"context_line":"6. ``NUMA1_2`` (``VCPU``) + ``SS2`` (``DISK_GB``)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"This is because the unsuffixed ``in_tree`` is applied to only the unsuffixed"},{"line_number":381,"context_line":"resource of ``VCPU``, and not applied to the suffixed resource, ``DISK_GB``."},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"When you want to have ``VCPU`` from wherever and ``DISK_GB`` from ``SS1``,"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dfbec78f_87430742","line":380,"range":{"start_line":380,"start_character":20,"end_line":380,"end_character":30},"updated":"2019-05-16 13:40:59.000000000","message":"Are we calling this \"unsuffixed\" or \"unspecified\", or are we just going to use both?\n\nI\u0027m not stuck on either term in either case, but it would be nice for the sake of the consumer of our docs if we were consistent.\n\nAlso, I want to know what to put in the spec :)","commit_id":"3e24cd859d8fa8802453bb37283a41474afb80be"}],"placement/lib.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"09576bcefdc839a1bf6aff1c50faf06fa390afed","unresolved":false,"context_lines":[{"line_number":27,"context_line":"_QS_REQUIRED \u003d \u0027required\u0027"},{"line_number":28,"context_line":"_QS_MEMBER_OF \u003d \u0027member_of\u0027"},{"line_number":29,"context_line":"_QS_IN_TREE \u003d \u0027in_tree\u0027"},{"line_number":30,"context_line":"_QS_KEY_PATTERN \u003d re.compile("},{"line_number":31,"context_line":"    r\"^(%s)([a-zA-Z0-9_-]{1,32})?$\" % \u0027|\u0027.join("},{"line_number":32,"context_line":"        (_QS_RESOURCES, _QS_REQUIRED, _QS_MEMBER_OF, _QS_IN_TREE)))"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_674f9cbd","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":15},"updated":"2019-05-06 18:23:33.000000000","message":"Hmph, this should be deduped with placement.schemas.allocation_candidate._GROUP_PAT_FMT.\n\n...unless we decide to do more granular error messaging as noted later...","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"5c28577ec675a6655d3e052072272da02489a252","unresolved":false,"context_lines":[{"line_number":27,"context_line":"_QS_REQUIRED \u003d \u0027required\u0027"},{"line_number":28,"context_line":"_QS_MEMBER_OF \u003d \u0027member_of\u0027"},{"line_number":29,"context_line":"_QS_IN_TREE \u003d \u0027in_tree\u0027"},{"line_number":30,"context_line":"_QS_KEY_PATTERN \u003d re.compile("},{"line_number":31,"context_line":"    r\"^(%s)([a-zA-Z0-9_-]{1,32})?$\" % \u0027|\u0027.join("},{"line_number":32,"context_line":"        (_QS_RESOURCES, _QS_REQUIRED, _QS_MEMBER_OF, _QS_IN_TREE)))"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_42528615","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":15},"in_reply_to":"dfbec78f_674f9cbd","updated":"2019-05-06 20:38:28.000000000","message":"yeah","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"09576bcefdc839a1bf6aff1c50faf06fa390afed","unresolved":false,"context_lines":[{"line_number":28,"context_line":"_QS_MEMBER_OF \u003d \u0027member_of\u0027"},{"line_number":29,"context_line":"_QS_IN_TREE \u003d \u0027in_tree\u0027"},{"line_number":30,"context_line":"_QS_KEY_PATTERN \u003d re.compile("},{"line_number":31,"context_line":"    r\"^(%s)([a-zA-Z0-9_-]{1,32})?$\" % \u0027|\u0027.join("},{"line_number":32,"context_line":"        (_QS_RESOURCES, _QS_REQUIRED, _QS_MEMBER_OF, _QS_IN_TREE)))"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_67f0fcca","line":31,"updated":"2019-05-06 18:23:33.000000000","message":"Mmph, it would be nice for readability if an underscore were required whenever the suffix isn\u0027t a simple integer, but that\u0027s tougher to regex, tougher to explain, and not really necessary. We can and should enact it by convention from the client though.","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"baf2acea8eaf738bd98f3096d165c2c53410c1ab","unresolved":false,"context_lines":[{"line_number":28,"context_line":"_QS_MEMBER_OF \u003d \u0027member_of\u0027"},{"line_number":29,"context_line":"_QS_IN_TREE \u003d \u0027in_tree\u0027"},{"line_number":30,"context_line":"_QS_KEY_PATTERN \u003d re.compile("},{"line_number":31,"context_line":"    r\"^(%s)([a-zA-Z0-9_-]{1,32})?$\" % \u0027|\u0027.join("},{"line_number":32,"context_line":"        (_QS_RESOURCES, _QS_REQUIRED, _QS_MEMBER_OF, _QS_IN_TREE)))"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_c7cd285e","line":31,"range":{"start_line":31,"start_character":13,"end_line":31,"end_character":19},"updated":"2019-05-06 18:18:20.000000000","message":"My usual preference is that distinguishing things via case differences is brittle. E.g., resourcesa vs. resourcesA. Also, since the initial part is lower case, adding more lower case letters makes for odd-looking, unreadable names (e.g., \"resourcess\"). So my vote would be to limit to [A-Z0-9_-]","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c8ef26f2eabafbc8e34bf46623904bd49143aa00","unresolved":false,"context_lines":[{"line_number":28,"context_line":"_QS_MEMBER_OF \u003d \u0027member_of\u0027"},{"line_number":29,"context_line":"_QS_IN_TREE \u003d \u0027in_tree\u0027"},{"line_number":30,"context_line":"_QS_KEY_PATTERN \u003d re.compile("},{"line_number":31,"context_line":"    r\"^(%s)([a-zA-Z0-9_-]{1,32})?$\" % \u0027|\u0027.join("},{"line_number":32,"context_line":"        (_QS_RESOURCES, _QS_REQUIRED, _QS_MEMBER_OF, _QS_IN_TREE)))"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_3b3e338b","line":31,"range":{"start_line":31,"start_character":13,"end_line":31,"end_character":19},"in_reply_to":"dfbec78f_a2cfc27d","updated":"2019-05-13 16:13:44.000000000","message":"The spec uses the example \u0027resources_PORT_$UUID\u0027 which something I would definitely use. I\u0027m not sure I ever want to write resourcePORT_$UUID even if the API supports it. I understand that the API needs to accept resources1 still. So meh.","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"398c89975433aac4e1ac452173d9b8e0eeb77bb5","unresolved":false,"context_lines":[{"line_number":28,"context_line":"_QS_MEMBER_OF \u003d \u0027member_of\u0027"},{"line_number":29,"context_line":"_QS_IN_TREE \u003d \u0027in_tree\u0027"},{"line_number":30,"context_line":"_QS_KEY_PATTERN \u003d re.compile("},{"line_number":31,"context_line":"    r\"^(%s)([a-zA-Z0-9_-]{1,32})?$\" % \u0027|\u0027.join("},{"line_number":32,"context_line":"        (_QS_RESOURCES, _QS_REQUIRED, _QS_MEMBER_OF, _QS_IN_TREE)))"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_47f5b856","line":31,"range":{"start_line":31,"start_character":13,"end_line":31,"end_character":19},"in_reply_to":"dfbec78f_c7cd285e","updated":"2019-05-06 18:24:50.000000000","message":"\u003e So my vote would be to limit to [A-Z0-9_-]\n\n+1. That also reduces my yen for an inconvenient intervening underscore.","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"5c28577ec675a6655d3e052072272da02489a252","unresolved":false,"context_lines":[{"line_number":28,"context_line":"_QS_MEMBER_OF \u003d \u0027member_of\u0027"},{"line_number":29,"context_line":"_QS_IN_TREE \u003d \u0027in_tree\u0027"},{"line_number":30,"context_line":"_QS_KEY_PATTERN \u003d re.compile("},{"line_number":31,"context_line":"    r\"^(%s)([a-zA-Z0-9_-]{1,32})?$\" % \u0027|\u0027.join("},{"line_number":32,"context_line":"        (_QS_RESOURCES, _QS_REQUIRED, _QS_MEMBER_OF, _QS_IN_TREE)))"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_a2cfc27d","line":31,"range":{"start_line":31,"start_character":13,"end_line":31,"end_character":19},"in_reply_to":"dfbec78f_c7cd285e","updated":"2019-05-06 20:38:28.000000000","message":"i\u0027ll make that so","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"09576bcefdc839a1bf6aff1c50faf06fa390afed","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        \u0026resources2\u003d$RESOURCE_CLASS_NAME:$AMOUNT,RESOURCE_CLASS_NAME:$AMOUNT"},{"line_number":175,"context_line":"        \u0026required2\u003d$TRAIT_NAME,$TRAIT_NAME\u0026member_of2\u003d$AGG_UUID"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        These are parsed in groups according to the arbitrary suffix of the key."},{"line_number":178,"context_line":"        For each group, a RequestGroup instance is created containing that"},{"line_number":179,"context_line":"        group\u0027s resources, required traits, and member_of. For the (single)"},{"line_number":180,"context_line":"        group with no suffix, the RequestGroup.use_same_provider attribute is"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_87edf0f0","line":177,"range":{"start_line":177,"start_character":52,"end_line":177,"end_character":61},"updated":"2019-05-06 18:23:33.000000000","message":"o gods, the doc update for this is going to be a nightmare","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"84671fc6f773fd16083212179d0399414d44d896","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            if not match:"},{"line_number":84,"context_line":"                continue"},{"line_number":85,"context_line":"            # `prefix` is \u0027resources\u0027, \u0027required\u0027, \u0027member_of\u0027, or \u0027in_tree\u0027"},{"line_number":86,"context_line":"            # `suffix` is an integer string, or None"},{"line_number":87,"context_line":"            prefix, suffix \u003d match.groups()"},{"line_number":88,"context_line":"            suffix \u003d suffix or \u0027\u0027"},{"line_number":89,"context_line":"            if suffix not in ret:"}],"source_content_type":"text/x-python","patch_set":4,"id":"dfbec78f_084b4d84","line":86,"range":{"start_line":86,"start_character":29,"end_line":86,"end_character":36},"updated":"2019-05-16 11:29:24.000000000","message":"not true any more","commit_id":"25c5cb054e93996ae16f12908bcf3e589b6b9137"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"bd744d485c2e4230d05b662ee307eb75e25c1e40","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        # The above would still pass if there were no request groups"},{"line_number":138,"context_line":"        if not by_suffix:"},{"line_number":139,"context_line":"            msg \u003d ("},{"line_number":140,"context_line":"                \"At least one request group (`resources` or `resources{*}`) \""},{"line_number":141,"context_line":"                \"is required.\")"},{"line_number":142,"context_line":"            raise webob.exc.HTTPBadRequest(msg)"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_7151ca0e","line":140,"range":{"start_line":140,"start_character":71,"end_line":140,"end_character":72},"updated":"2019-05-16 20:53:36.000000000","message":"nit: `*` generally mean zero or more, so in the zero case it\u0027s redundant.","commit_id":"3e24cd859d8fa8802453bb37283a41474afb80be"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"752eac45136b9edb70a58153798c9dd2be83c414","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        # The above would still pass if there were no request groups"},{"line_number":138,"context_line":"        if not by_suffix:"},{"line_number":139,"context_line":"            msg \u003d ("},{"line_number":140,"context_line":"                \"At least one request group (`resources` or `resources{*}`) \""},{"line_number":141,"context_line":"                \"is required.\")"},{"line_number":142,"context_line":"            raise webob.exc.HTTPBadRequest(msg)"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_c817a4ed","line":140,"range":{"start_line":140,"start_character":71,"end_line":140,"end_character":72},"in_reply_to":"bfb3d3c7_7151ca0e","updated":"2019-05-17 09:36:14.000000000","message":"I was trying to mean the globby (not regex) meaning of \"anything\" here to distinguish from N which implies a numeral.\n\nBut elsewhere N is being used in an \"anything\" sense so I might switch back. Preference?","commit_id":"3e24cd859d8fa8802453bb37283a41474afb80be"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"71286e75f3c14b8ea0f06abb81d404804891e3e3","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        # The above would still pass if there were no request groups"},{"line_number":138,"context_line":"        if not by_suffix:"},{"line_number":139,"context_line":"            msg \u003d ("},{"line_number":140,"context_line":"                \"At least one request group (`resources` or `resources{*}`) \""},{"line_number":141,"context_line":"                \"is required.\")"},{"line_number":142,"context_line":"            raise webob.exc.HTTPBadRequest(msg)"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"bfb3d3c7_3d21d9b5","line":140,"range":{"start_line":140,"start_character":71,"end_line":140,"end_character":72},"in_reply_to":"bfb3d3c7_c817a4ed","updated":"2019-05-17 16:04:27.000000000","message":"\u0027*\u0027 can be \u0027nothing\u0027 in glob too, but that super doesn\u0027t concern me. I\u0027ve been using $S (\u0027S\u0027uffix) in the spec fwiw.","commit_id":"3e24cd859d8fa8802453bb37283a41474afb80be"}],"placement/rest_api_version_history.rst":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e2da6db5b983f658a482fff6b7437ad2716c932f","unresolved":false,"context_lines":[{"line_number":622,"context_line":""},{"line_number":623,"context_line":"it is now possible to use::"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"    resources_COMPUTE\u003dXXX\u0026required_COMPUTE\u003dYYY\u0026member_of_COMPUTE\u003dZZZ"}],"source_content_type":"text/x-rst","patch_set":6,"id":"bfb3d3c7_6a1c456a","line":625,"updated":"2019-05-20 22:06:38.000000000","message":"An example with a uuid, though painful to look at, might be nice to include.","commit_id":"0bd6853fc2f1d1ea9ea50d035961870f6b05dd59"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"c4cbbfa5e2bb6f0c090c7a37e8e531be0e967f64","unresolved":false,"context_lines":[{"line_number":622,"context_line":""},{"line_number":623,"context_line":"it is now possible to use::"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"    resources_COMPUTE\u003dXXX\u0026required_COMPUTE\u003dYYY\u0026member_of_COMPUTE\u003dZZZ"}],"source_content_type":"text/x-rst","patch_set":6,"id":"bfb3d3c7_d682b3c8","line":625,"in_reply_to":"bfb3d3c7_6a1c456a","updated":"2019-05-28 09:54:50.000000000","message":"sure","commit_id":"0bd6853fc2f1d1ea9ea50d035961870f6b05dd59"}],"placement/schemas/allocation_candidate.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"09576bcefdc839a1bf6aff1c50faf06fa390afed","unresolved":false,"context_lines":[{"line_number":60,"context_line":"del GET_SCHEMA_1_25[\"properties\"][\"required\"]"},{"line_number":61,"context_line":"del GET_SCHEMA_1_25[\"properties\"][\"member_of\"]"},{"line_number":62,"context_line":"# Pattern property key format for a numbered or un-numbered grouping"},{"line_number":63,"context_line":"_GROUP_PAT_FMT \u003d \"^%s([1-9][0-9]*)?$\""},{"line_number":64,"context_line":"GET_SCHEMA_1_25[\"patternProperties\"] \u003d {"},{"line_number":65,"context_line":"    _GROUP_PAT_FMT % \"resources\": {"},{"line_number":66,"context_line":"        \"type\": \"string\","}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_67ac7c8c","line":63,"range":{"start_line":63,"start_character":0,"end_line":63,"end_character":14},"updated":"2019-05-06 18:23:33.000000000","message":"This","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"4d652f5bb7080cff8e004916e68945c41c83333b","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"# The suffix used with request groups is upper case alphanumeric and"},{"line_number":18,"context_line":"# \u0027_\u0027, \u0027-\u0027."},{"line_number":19,"context_line":"GROUP_PAT \u003d \"[A-Z0-9_-]{1,32}\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"# Represents the allowed query string parameters to the GET"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfbec78f_a2034242","line":19,"updated":"2019-05-06 19:34:45.000000000","message":"Better. One question, though: will it be odd to have a group named:\n\n  resources-\n\nNot trying to bikeshed, just wondering. I suppose that any tool used to create such groupings should be configured not to be so obtuse.","commit_id":"fda7305bfe86292500dad59065b914d1378fa4eb"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2f59fc9d7951ea0b407c3b4eff4183b5b56cb16c","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"# The suffix used with request groups is upper case alphanumeric and"},{"line_number":18,"context_line":"# \u0027_\u0027, \u0027-\u0027."},{"line_number":19,"context_line":"GROUP_PAT \u003d \"[A-Z0-9_-]{1,32}\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"# Represents the allowed query string parameters to the GET"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfbec78f_c273d6e6","line":19,"in_reply_to":"dfbec78f_a2034242","updated":"2019-05-06 19:39:57.000000000","message":"or resources_, resources__, resources___, etc. We shouldn\u0027t get into the business of trying to restrict what we deem to be weird or unreadable patterns (my previous niggle on this line notwithstanding).","commit_id":"fda7305bfe86292500dad59065b914d1378fa4eb"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ddae05389188ac53c25675ef0314259057bd49e1","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"# The suffix used with request groups is upper case alphanumeric and"},{"line_number":18,"context_line":"# \u0027_\u0027, \u0027-\u0027."},{"line_number":19,"context_line":"GROUP_PAT \u003d \"[A-Z0-9_-]{1,32}\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"# Represents the allowed query string parameters to the GET"}],"source_content_type":"text/x-python","patch_set":4,"id":"dfbec78f_e5d331d4","line":19,"range":{"start_line":19,"start_character":26,"end_line":19,"end_character":28},"updated":"2019-05-10 22:40:10.000000000","message":"If we want to allow UUIDs with hyphens, this should be \u003e32. I\u0027m going to say at least 37, so we can have an extra delimiter between the prefix and the UUID.\n\n resources_$UUID\n\nAnd I wouldn\u0027t mind allowing some extra so we can say e.g.\n\n resources_port_$UUID\n\nWould it be awful to make this like 64?","commit_id":"25c5cb054e93996ae16f12908bcf3e589b6b9137"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7959edb478ac9601eaf4b779d0365f03d6f9f48a","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"# The suffix used with request groups is upper case alphanumeric and"},{"line_number":18,"context_line":"# \u0027_\u0027, \u0027-\u0027."},{"line_number":19,"context_line":"GROUP_PAT \u003d \"[A-Z0-9_-]{1,32}\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"# Represents the allowed query string parameters to the GET"}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_adf3f709","line":19,"range":{"start_line":19,"start_character":26,"end_line":19,"end_character":28},"in_reply_to":"bfb3d3c7_3c26c9b9","updated":"2019-05-23 16:22:28.000000000","message":"+1 on returning the same name in the mapping  (even regarding case) in the response that was in the request.","commit_id":"25c5cb054e93996ae16f12908bcf3e589b6b9137"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7bd83ff100082cbddc7a05c1ef8552c6d3e62499","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"# The suffix used with request groups is upper case alphanumeric and"},{"line_number":18,"context_line":"# \u0027_\u0027, \u0027-\u0027."},{"line_number":19,"context_line":"GROUP_PAT \u003d \"[A-Z0-9_-]{1,32}\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"# Represents the allowed query string parameters to the GET"}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_3c26c9b9","line":19,"range":{"start_line":19,"start_character":26,"end_line":19,"end_character":28},"in_reply_to":"bfb3d3c7_519a86c5","updated":"2019-05-16 21:54:17.000000000","message":"I almost mentioned the idea of making the suffixes case-insensitive in my last review - and that we shouldn\u0027t do it.\n\nIf for no other reason, when we\u0027re return rg/rp mappings, the consumer would have to sanitize (upper() or lower()) the keys in the same way as the API did it, which sucks.\n\nGive the consumer the rope.","commit_id":"25c5cb054e93996ae16f12908bcf3e589b6b9137"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"bd744d485c2e4230d05b662ee307eb75e25c1e40","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"# The suffix used with request groups is upper case alphanumeric and"},{"line_number":18,"context_line":"# \u0027_\u0027, \u0027-\u0027."},{"line_number":19,"context_line":"GROUP_PAT \u003d \"[A-Z0-9_-]{1,32}\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"# Represents the allowed query string parameters to the GET"}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_519a86c5","line":19,"range":{"start_line":19,"start_character":26,"end_line":19,"end_character":28},"in_reply_to":"dfbec78f_e5d331d4","updated":"2019-05-16 20:53:36.000000000","message":"I wasn\u0027t thinking about UUIDs when I recommended only allowing upper case. If suffixing with UUIDs is going to be a thing, then I would allow both upper and lower. We can add code so that suffixes of \u0027Foo\u0027, \u0027FOO\u0027, \u0027fOO\u0027 and \u0027foo\u0027 are all treated the same.","commit_id":"25c5cb054e93996ae16f12908bcf3e589b6b9137"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e2da6db5b983f658a482fff6b7437ad2716c932f","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"# The suffix used with request groups. Prior to 1.33, the group were numbered."},{"line_number":18,"context_line":"# With 1.33 they become alphanumber, \u0027_\u0027, and \u0027-\u0027 with a length limit of 64."},{"line_number":19,"context_line":"GROUP_PAT \u003d r\u0027[1-9][0-9]*\u0027"},{"line_number":20,"context_line":"GROUP_PAT_1_33 \u003d r\u0027[a-zA-Z0-9_-]{1,64}\u0027"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bfb3d3c7_4a2dc193","line":18,"range":{"start_line":18,"start_character":24,"end_line":18,"end_character":35},"updated":"2019-05-20 22:06:38.000000000","message":"is this a thing?","commit_id":"0bd6853fc2f1d1ea9ea50d035961870f6b05dd59"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"c4cbbfa5e2bb6f0c090c7a37e8e531be0e967f64","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"# The suffix used with request groups. Prior to 1.33, the group were numbered."},{"line_number":18,"context_line":"# With 1.33 they become alphanumber, \u0027_\u0027, and \u0027-\u0027 with a length limit of 64."},{"line_number":19,"context_line":"GROUP_PAT \u003d r\u0027[1-9][0-9]*\u0027"},{"line_number":20,"context_line":"GROUP_PAT_1_33 \u003d r\u0027[a-zA-Z0-9_-]{1,64}\u0027"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bfb3d3c7_16c7eb14","line":18,"range":{"start_line":18,"start_character":24,"end_line":18,"end_character":35},"in_reply_to":"bfb3d3c7_4a2dc193","updated":"2019-05-28 09:54:50.000000000","message":"Done","commit_id":"0bd6853fc2f1d1ea9ea50d035961870f6b05dd59"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e2da6db5b983f658a482fff6b7437ad2716c932f","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"# Microversion 1.33 allows more complex resource group suffixes."},{"line_number":92,"context_line":"GET_SCHEMA_1_33 \u003d copy.deepcopy(GET_SCHEMA_1_31)"},{"line_number":93,"context_line":"_GROUP_PAT_FMT_1_33 \u003d \"^%s(\" + GROUP_PAT_1_33 + \")?$\""},{"line_number":94,"context_line":"GET_SCHEMA_1_33[\"patternProperties\"] \u003d {"},{"line_number":95,"context_line":"    _GROUP_PAT_FMT_1_33 % group_type: {\"type\": \"string\"}"},{"line_number":96,"context_line":"    for group_type in (\u0027resources\u0027, \u0027required\u0027, \u0027member_of\u0027, \u0027in_tree\u0027)}"}],"source_content_type":"text/x-python","patch_set":6,"id":"bfb3d3c7_6a4a0556","line":93,"range":{"start_line":93,"start_character":22,"end_line":93,"end_character":53},"updated":"2019-05-20 22:06:38.000000000","message":"hm, I see this is copied from above, but should it technically be r\"\"?","commit_id":"0bd6853fc2f1d1ea9ea50d035961870f6b05dd59"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"c4cbbfa5e2bb6f0c090c7a37e8e531be0e967f64","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"# Microversion 1.33 allows more complex resource group suffixes."},{"line_number":92,"context_line":"GET_SCHEMA_1_33 \u003d copy.deepcopy(GET_SCHEMA_1_31)"},{"line_number":93,"context_line":"_GROUP_PAT_FMT_1_33 \u003d \"^%s(\" + GROUP_PAT_1_33 + \")?$\""},{"line_number":94,"context_line":"GET_SCHEMA_1_33[\"patternProperties\"] \u003d {"},{"line_number":95,"context_line":"    _GROUP_PAT_FMT_1_33 % group_type: {\"type\": \"string\"}"},{"line_number":96,"context_line":"    for group_type in (\u0027resources\u0027, \u0027required\u0027, \u0027member_of\u0027, \u0027in_tree\u0027)}"}],"source_content_type":"text/x-python","patch_set":6,"id":"bfb3d3c7_76e1879a","line":93,"range":{"start_line":93,"start_character":22,"end_line":93,"end_character":53},"in_reply_to":"bfb3d3c7_6a4a0556","updated":"2019-05-28 09:54:50.000000000","message":"Given that we\u0027re using raw above, it should be fine as is here in the concatenation","commit_id":"0bd6853fc2f1d1ea9ea50d035961870f6b05dd59"}],"placement/tests/unit/test_util.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"09576bcefdc839a1bf6aff1c50faf06fa390afed","unresolved":false,"context_lines":[{"line_number":904,"context_line":"        qs \u003d \u0027resources_0123456789012345678901234567890123\u003dCUSTOM_MAGIC:1\u0027"},{"line_number":905,"context_line":"        exc \u003d self.assertRaises(webob.exc.HTTPBadRequest, self.do_parse, qs)"},{"line_number":906,"context_line":"        # TODO(cdent): Do we wish to make a more distinguishing error"},{"line_number":907,"context_line":"        # message?"},{"line_number":908,"context_line":"        self.assertIn(\u0027least one request group\u0027, str(exc))"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"    def test_group_suffix_character_limits(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_47a618c4","line":907,"updated":"2019-05-06 18:23:33.000000000","message":"If we decided to do that later, would it require a separate microversion? If not, I say we punt on it for now, especially since we\u0027re not doing it for the existing numerics.\n\nIn general, I think it would be nice, but would require having a very permissive schema pattern and doing the regex validation in the handler. Which is doable, but slightly ick.","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"baf2acea8eaf738bd98f3096d165c2c53410c1ab","unresolved":false,"context_lines":[{"line_number":904,"context_line":"        qs \u003d \u0027resources_0123456789012345678901234567890123\u003dCUSTOM_MAGIC:1\u0027"},{"line_number":905,"context_line":"        exc \u003d self.assertRaises(webob.exc.HTTPBadRequest, self.do_parse, qs)"},{"line_number":906,"context_line":"        # TODO(cdent): Do we wish to make a more distinguishing error"},{"line_number":907,"context_line":"        # message?"},{"line_number":908,"context_line":"        self.assertIn(\u0027least one request group\u0027, str(exc))"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"    def test_group_suffix_character_limits(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_47305857","line":907,"updated":"2019-05-06 18:18:20.000000000","message":"Yeah, since the error is the length of the string here, and the illegal characters below.","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"5c28577ec675a6655d3e052072272da02489a252","unresolved":false,"context_lines":[{"line_number":904,"context_line":"        qs \u003d \u0027resources_0123456789012345678901234567890123\u003dCUSTOM_MAGIC:1\u0027"},{"line_number":905,"context_line":"        exc \u003d self.assertRaises(webob.exc.HTTPBadRequest, self.do_parse, qs)"},{"line_number":906,"context_line":"        # TODO(cdent): Do we wish to make a more distinguishing error"},{"line_number":907,"context_line":"        # message?"},{"line_number":908,"context_line":"        self.assertIn(\u0027least one request group\u0027, str(exc))"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"    def test_group_suffix_character_limits(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_a27d821d","line":907,"in_reply_to":"dfbec78f_47a618c4","updated":"2019-05-06 20:38:28.000000000","message":"\u003e If we decided to do that later, would it require a separate\n \u003e microversion? If not, I say we punt on it for now, especially since\n \u003e we\u0027re not doing it for the existing numerics.\n\nChanging error text hasn\u0027t historically been a microversion.\n\n\"not doing it for the existing numerics\" is why I was thinking it was probably fine for now.\n\nWith the schema adjustments suggested here, some things will fail sooner and with more information than _these_ tests because they will be caught by the schema.","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"09576bcefdc839a1bf6aff1c50faf06fa390afed","unresolved":false,"context_lines":[{"line_number":911,"context_line":"        qs \u003d \u0027resources!#%\u003dCUSTOM_MAGIC:1\u0027"},{"line_number":912,"context_line":"        exc \u003d self.assertRaises(webob.exc.HTTPBadRequest, self.do_parse, qs)"},{"line_number":913,"context_line":"        # TODO(cdent): Do we wish to make a more distinguishing error"},{"line_number":914,"context_line":"        # message?"},{"line_number":915,"context_line":"        self.assertIn(\u0027least one request group\u0027, str(exc))"},{"line_number":916,"context_line":""},{"line_number":917,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_a76cb436","line":914,"updated":"2019-05-06 18:23:33.000000000","message":"as above","commit_id":"1a776f4b1494931cf9a46274dbe66afc06d3bf09"}],"releasenotes/notes/granular-request-suffix-a7fd857eadc16b56.yaml":[{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"bd744d485c2e4230d05b662ee307eb75e25c1e40","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    emerge in situations where multiple services are collaborating to make"},{"line_number":10,"context_line":"    requests. Note that this change is not being done in a microversion"},{"line_number":11,"context_line":"    because all existing request groups (introduced with microversion `1.25`_)"},{"line_number":12,"context_line":"    will continue to work within the new constraints."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    .. _1.25: https://docs.openstack.org/placement/latest/placement-api-microversion-history.html#granular-resource-requests-to-get-allocation-candidates"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"bfb3d3c7_51836657","line":12,"updated":"2019-05-16 20:53:36.000000000","message":"To reiterate my reasoning for a new microversion: prior to this change, requesting a group like \u0027resources_COMPUTE\u0027 would have returned a 400, and now it will not. Running code against clouds that either do or don\u0027t have this change will result in different behaviors.","commit_id":"3e24cd859d8fa8802453bb37283a41474afb80be"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"752eac45136b9edb70a58153798c9dd2be83c414","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    emerge in situations where multiple services are collaborating to make"},{"line_number":10,"context_line":"    requests. Note that this change is not being done in a microversion"},{"line_number":11,"context_line":"    because all existing request groups (introduced with microversion `1.25`_)"},{"line_number":12,"context_line":"    will continue to work within the new constraints."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    .. _1.25: https://docs.openstack.org/placement/latest/placement-api-microversion-history.html#granular-resource-requests-to-get-allocation-candidates"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"bfb3d3c7_a89d9067","line":12,"in_reply_to":"bfb3d3c7_3c5b292f","updated":"2019-05-17 09:36:14.000000000","message":"That all works. My feeling on microversions these days tends to be \"say no until the concrete breakage case is revealed, then say yes\". Not because I hate microversions or something, but because I think that ritual is good insurance and refreshment.\n\nThat said, if we\u0027re going to microversion on this should we:\n\n* microversion this change in isolation\n* associate it with a change that also includes request groups without resources\n* bundle it with a whole suite nested magic related changes\n\nMy preference would be to separate it into multiple different versions so that the code can merge independently and we don\u0027t need something like a feature flag to hide the functionality through a stack of changes that ends with the grand microversion reveal.\n\nPreferences?","commit_id":"3e24cd859d8fa8802453bb37283a41474afb80be"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7bd83ff100082cbddc7a05c1ef8552c6d3e62499","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    emerge in situations where multiple services are collaborating to make"},{"line_number":10,"context_line":"    requests. Note that this change is not being done in a microversion"},{"line_number":11,"context_line":"    because all existing request groups (introduced with microversion `1.25`_)"},{"line_number":12,"context_line":"    will continue to work within the new constraints."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    .. _1.25: https://docs.openstack.org/placement/latest/placement-api-microversion-history.html#granular-resource-requests-to-get-allocation-candidates"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"bfb3d3c7_3c5b292f","line":12,"in_reply_to":"bfb3d3c7_51836657","updated":"2019-05-16 21:54:17.000000000","message":"So like, I write my code against new-cloud and it works fine, then I run it against old-cloud and it breaks, but not on version negotiation. Yeah, I can buy that as a good enough reason to spin a microversion for this.","commit_id":"3e24cd859d8fa8802453bb37283a41474afb80be"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"26212a4ee85578899cd6ef43af2269dba0083e00","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    emerge in situations where multiple services are collaborating to make"},{"line_number":10,"context_line":"    requests. Note that this change is not being done in a microversion"},{"line_number":11,"context_line":"    because all existing request groups (introduced with microversion `1.25`_)"},{"line_number":12,"context_line":"    will continue to work within the new constraints."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    .. _1.25: https://docs.openstack.org/placement/latest/placement-api-microversion-history.html#granular-resource-requests-to-get-allocation-candidates"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"bfb3d3c7_5957cf03","line":12,"in_reply_to":"bfb3d3c7_7d18b180","updated":"2019-05-21 15:18:20.000000000","message":"You could always wrap change this with a microversion like 1.999, and when all your desired changes are ready to merge, drop that back to the actual new microversion. This way you turn on all the features with a single microversion change.","commit_id":"3e24cd859d8fa8802453bb37283a41474afb80be"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"71286e75f3c14b8ea0f06abb81d404804891e3e3","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    emerge in situations where multiple services are collaborating to make"},{"line_number":10,"context_line":"    requests. Note that this change is not being done in a microversion"},{"line_number":11,"context_line":"    because all existing request groups (introduced with microversion `1.25`_)"},{"line_number":12,"context_line":"    will continue to work within the new constraints."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    .. _1.25: https://docs.openstack.org/placement/latest/placement-api-microversion-history.html#granular-resource-requests-to-get-allocation-candidates"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"bfb3d3c7_7d18b180","line":12,"in_reply_to":"bfb3d3c7_a89d9067","updated":"2019-05-17 16:04:27.000000000","message":"\u003e My preference would be to separate it into multiple different\n \u003e versions so that the code can merge independently and we don\u0027t need\n \u003e something like a feature flag to hide the functionality through a\n \u003e stack of changes that ends with the grand microversion reveal.\n\nThis exactly.\n\nAPI-wise, thinking about what that microversion history entry and reno would look like, it would be a bit hard to justify the introduction of the many different pieces together. Some of them are arguably interrelated (from a placement standpoint) but most aren\u0027t.","commit_id":"3e24cd859d8fa8802453bb37283a41474afb80be"}]}
