)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"43cd2d2515e3840970733aa6828724c6c819d50e","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2018-03-23 14:10:15 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"RP list: member_of and resources parameters (v1.3, v1.4)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I380ac35d72ee45cd064805bdb4bac4977d436831"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bf659307_fc70ec0a","line":8,"updated":"2018-04-09 16:45:27.000000000","message":"Add:\n\nPart of blueprint placement-osc-plugin-rocky","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"b68bc866f001105744a11b407c2ba641228a4467","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2018-03-23 14:10:15 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"RP list: member_of and resources parameters (v1.3, v1.4)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I380ac35d72ee45cd064805bdb4bac4977d436831"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bf659307_9e7bb226","line":8,"in_reply_to":"bf659307_fc70ec0a","updated":"2018-04-11 08:54:23.000000000","message":"Done","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"}],"osc_placement/plugin.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f2a5173d1f48b860c51e96528379f5d4f15a71f9","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    \u00271.1\u0027,"},{"line_number":27,"context_line":"    \u00271.2\u0027,"},{"line_number":28,"context_line":"    \u00271.3\u0027,"},{"line_number":29,"context_line":"    \u00271.4\u0027"},{"line_number":30,"context_line":"]"},{"line_number":31,"context_line":"API_VERSIONS \u003d {v: \u0027osc_placement.http.SessionClient\u0027"},{"line_number":32,"context_line":"                for v in SUPPORTED_VERSIONS}"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f6a8fd7_1dd34a62","line":29,"updated":"2018-04-19 11:19:47.000000000","message":"super tiny nit: if you put coma after 1.4 here then in the next patch the diff would not include this line.","commit_id":"844414861a90e251cc4f61ee6908009130284353"}],"osc_placement/resources/resource_provider.py":[{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"909caecde13bbec4070201a81959ca83cf3b0135","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        parser.add_argument("},{"line_number":74,"context_line":"            \u0027--member-of\u0027,"},{"line_number":75,"context_line":"            metavar\u003d\u0027\u003cmember_of\u003e\u0027,"},{"line_number":76,"context_line":"            help\u003d\u0027A comma-separated list of strings \u0027"},{"line_number":77,"context_line":"                 \u0027representing aggregate uuids\u0027"},{"line_number":78,"context_line":"        )"},{"line_number":79,"context_line":"        parser.add_argument("},{"line_number":80,"context_line":"            \u0027--resource\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa0c359_b134fb4b","line":77,"range":{"start_line":76,"start_character":0,"end_line":77,"end_character":47},"updated":"2018-02-06 10:54:49.000000000","message":"The api ref says the following formats are accepted:\n\n* 5e08ea53-c4c6-448e-9334-ac4953de3cfa\n* in:42896e0d-205d-4fe3-bd1e-100924931787,5e08ea53-c4c6-448e-9334-ac4953de3cfa\n\nBut a plain comma-separated list of uuids (without the \u0027in\u0027 operator at the front) is not valid input.\n\nhttps://developer.openstack.org/api-ref/placement/#list-resource-providers","commit_id":"5e6e025dd62504557ea70218c8832f81e5f8c13b"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"24dd8db3ca2d55c61cdd9b7f8d16aaa5c4b13a29","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        parser.add_argument("},{"line_number":74,"context_line":"            \u0027--member-of\u0027,"},{"line_number":75,"context_line":"            metavar\u003d\u0027\u003cmember_of\u003e\u0027,"},{"line_number":76,"context_line":"            help\u003d\u0027A comma-separated list of strings \u0027"},{"line_number":77,"context_line":"                 \u0027representing aggregate uuids\u0027"},{"line_number":78,"context_line":"        )"},{"line_number":79,"context_line":"        parser.add_argument("},{"line_number":80,"context_line":"            \u0027--resource\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa0c359_eacfadad","line":77,"range":{"start_line":76,"start_character":0,"end_line":77,"end_character":47},"in_reply_to":"3fa0c359_b134fb4b","updated":"2018-02-08 10:46:26.000000000","message":"Good catch, thank you, fixed.\nI wrote that api-ref and missed this part, it was changed later )","commit_id":"5e6e025dd62504557ea70218c8832f81e5f8c13b"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"909caecde13bbec4070201a81959ca83cf3b0135","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            action\u003d\u0027append\u0027,"},{"line_number":84,"context_line":"            help\u003d\u0027A resource class values pair indicating an \u0027"},{"line_number":85,"context_line":"                 \u0027amount of resource of a specified class that a provider \u0027"},{"line_number":86,"context_line":"                 \u0027must have the capacity to serve\u0027"},{"line_number":87,"context_line":"        )"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        return parser"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa0c359_ecbdcc68","line":86,"updated":"2018-02-06 10:54:49.000000000","message":"Would be informative to mention: \"May be repeated.\"","commit_id":"5e6e025dd62504557ea70218c8832f81e5f8c13b"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"24dd8db3ca2d55c61cdd9b7f8d16aaa5c4b13a29","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            action\u003d\u0027append\u0027,"},{"line_number":84,"context_line":"            help\u003d\u0027A resource class values pair indicating an \u0027"},{"line_number":85,"context_line":"                 \u0027amount of resource of a specified class that a provider \u0027"},{"line_number":86,"context_line":"                 \u0027must have the capacity to serve\u0027"},{"line_number":87,"context_line":"        )"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        return parser"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa0c359_aac1a582","line":86,"in_reply_to":"3fa0c359_ecbdcc68","updated":"2018-02-08 10:46:26.000000000","message":"Done","commit_id":"5e6e025dd62504557ea70218c8832f81e5f8c13b"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"8c0965f8c3a0ed88e7c9414398a61e3757b3b55b","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            metavar\u003d\u0027\u003cresource_class\u003e\u003d\u003cvalue\u003e\u0027,"},{"line_number":83,"context_line":"            default\u003d[],"},{"line_number":84,"context_line":"            action\u003d\u0027append\u0027,"},{"line_number":85,"context_line":"            help\u003d\u0027A resource class values pair indicating an \u0027"},{"line_number":86,"context_line":"                 \u0027amount of resource of a specified class that a provider \u0027"},{"line_number":87,"context_line":"                 \u0027must have the capacity to serve. May be repeated. \u0027"},{"line_number":88,"context_line":"                 \u0027This param requires at least --os-placement-api-version 1.4.\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa0c359_04cdd3b5","line":85,"range":{"start_line":85,"start_character":40,"end_line":85,"end_character":41},"updated":"2018-02-23 08:45:52.000000000","message":"nit: value, or even better: resource_class:value","commit_id":"20f053feb85c24b04ada1f6c1c0365ddf0a3a7e9"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"73427fd5b0d4e4982eae9468b633a9e5ad3c6a2f","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            metavar\u003d\u0027\u003cresource_class\u003e\u003d\u003cvalue\u003e\u0027,"},{"line_number":83,"context_line":"            default\u003d[],"},{"line_number":84,"context_line":"            action\u003d\u0027append\u0027,"},{"line_number":85,"context_line":"            help\u003d\u0027A resource class values pair indicating an \u0027"},{"line_number":86,"context_line":"                 \u0027amount of resource of a specified class that a provider \u0027"},{"line_number":87,"context_line":"                 \u0027must have the capacity to serve. May be repeated. \u0027"},{"line_number":88,"context_line":"                 \u0027This param requires at least --os-placement-api-version 1.4.\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"bf659307_1e0b22d6","line":85,"range":{"start_line":85,"start_character":40,"end_line":85,"end_character":41},"in_reply_to":"3fa0c359_04cdd3b5","updated":"2018-04-11 08:48:09.000000000","message":"Done","commit_id":"20f053feb85c24b04ada1f6c1c0365ddf0a3a7e9"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"8c0965f8c3a0ed88e7c9414398a61e3757b3b55b","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            filters[\u0027uuid\u0027] \u003d parsed_args.uuid"},{"line_number":101,"context_line":"        if \u0027member_of\u0027 in parsed_args and parsed_args.member_of:"},{"line_number":102,"context_line":"            self.check_version(version.ge(\u00271.3\u0027))"},{"line_number":103,"context_line":"            filters[\u0027member_of\u0027] \u003d \u0027in:\u0027 + parsed_args.member_of"},{"line_number":104,"context_line":"        if \u0027resource\u0027 in parsed_args and parsed_args.resource:"},{"line_number":105,"context_line":"            self.check_version(version.ge(\u00271.4\u0027))"},{"line_number":106,"context_line":"            filters[\u0027resources\u0027] \u003d \u0027,\u0027.join("}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa0c359_44d75b4c","line":103,"range":{"start_line":103,"start_character":36,"end_line":103,"end_character":38},"updated":"2018-02-23 08:45:52.000000000","message":"Assuming there will be no other operators beyond \u0027in\u0027 I like how you simplified the syntax here. Actually even the placement API could drop the single-uuid syntax without loss of functionality.","commit_id":"20f053feb85c24b04ada1f6c1c0365ddf0a3a7e9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a08e59b5e075f519be9b623b2895c886e8c84116","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            help\u003d\u0027Name of the resource provider\u0027"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        parser.add_argument("},{"line_number":74,"context_line":"            \u0027--member-of\u0027,"},{"line_number":75,"context_line":"            metavar\u003d\u0027\u003cmember_of\u003e\u0027,"},{"line_number":76,"context_line":"            help\u003d\u0027A comma-separated list of strings \u0027"},{"line_number":77,"context_line":"                 \u0027representing aggregate uuids. \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_bc86f464","line":74,"updated":"2018-04-09 16:40:01.000000000","message":"I don\u0027t know if the user doing a comma-separated list is better than being able to specify --member-of multiple times? I don\u0027t know if there is a precedent style-wise that we should be following.","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5ea9d4ad25279b0063716505cf1ed561398a0f35","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            help\u003d\u0027Name of the resource provider\u0027"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        parser.add_argument("},{"line_number":74,"context_line":"            \u0027--member-of\u0027,"},{"line_number":75,"context_line":"            metavar\u003d\u0027\u003cmember_of\u003e\u0027,"},{"line_number":76,"context_line":"            help\u003d\u0027A comma-separated list of strings \u0027"},{"line_number":77,"context_line":"                 \u0027representing aggregate uuids. \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_dc2088fa","line":74,"in_reply_to":"bf659307_bc86f464","updated":"2018-04-09 16:44:33.000000000","message":"Given --resource below is an append-style list, I tend to think we should be doing the same here. I\u0027ve pinged Dean Troyer to see if he has a preference or some guidance.","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"86148b6b0a8ef92766b29bedb7a089ff01299b81","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            help\u003d\u0027Name of the resource provider\u0027"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        parser.add_argument("},{"line_number":74,"context_line":"            \u0027--member-of\u0027,"},{"line_number":75,"context_line":"            metavar\u003d\u0027\u003cmember_of\u003e\u0027,"},{"line_number":76,"context_line":"            help\u003d\u0027A comma-separated list of strings \u0027"},{"line_number":77,"context_line":"                 \u0027representing aggregate uuids. \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_efa6f0ab","line":74,"in_reply_to":"bf659307_dc2088fa","updated":"2018-04-09 17:13:56.000000000","message":"(11:51:57 AM) dtroyer_zz: mriedem: in that case I\u0027d concur with your suggestion to repeat —member-of.   In general that is the pattern OSC tried to use.  We added more of the comma-separated stuff in network commands but like compute\u0027s block device mapping there just wan\u0027t a better way to do it","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"8be1b80d57d4a078ed628d4b22f663c35da04ace","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            help\u003d\u0027Name of the resource provider\u0027"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        parser.add_argument("},{"line_number":74,"context_line":"            \u0027--member-of\u0027,"},{"line_number":75,"context_line":"            metavar\u003d\u0027\u003cmember_of\u003e\u0027,"},{"line_number":76,"context_line":"            help\u003d\u0027A comma-separated list of strings \u0027"},{"line_number":77,"context_line":"                 \u0027representing aggregate uuids. \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_be247661","line":74,"in_reply_to":"bf659307_efa6f0ab","updated":"2018-04-11 08:53:54.000000000","message":"Changed to --aggregate-uuid could be specified multiple times.","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a08e59b5e075f519be9b623b2895c886e8c84116","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        parser.add_argument("},{"line_number":74,"context_line":"            \u0027--member-of\u0027,"},{"line_number":75,"context_line":"            metavar\u003d\u0027\u003cmember_of\u003e\u0027,"},{"line_number":76,"context_line":"            help\u003d\u0027A comma-separated list of strings \u0027"},{"line_number":77,"context_line":"                 \u0027representing aggregate uuids. \u0027"},{"line_number":78,"context_line":"                 \u0027This param requires at least --os-placement-api-version 1.3.\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_dcc88875","line":75,"range":{"start_line":75,"start_character":22,"end_line":75,"end_character":31},"updated":"2018-04-09 16:40:01.000000000","message":"Rename this to aggregate_uuid? Only reason I mention it, is it looks like that\u0027s what goes into the docs and it would be a bit more clear on usage:\n\nhttp://logs.openstack.org/83/511183/14/check/build-openstack-sphinx-docs/2e000b9/html/cli/index.html#cmdoption-openstack-resource-provider-list-member-of","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"8be1b80d57d4a078ed628d4b22f663c35da04ace","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        parser.add_argument("},{"line_number":74,"context_line":"            \u0027--member-of\u0027,"},{"line_number":75,"context_line":"            metavar\u003d\u0027\u003cmember_of\u003e\u0027,"},{"line_number":76,"context_line":"            help\u003d\u0027A comma-separated list of strings \u0027"},{"line_number":77,"context_line":"                 \u0027representing aggregate uuids. \u0027"},{"line_number":78,"context_line":"                 \u0027This param requires at least --os-placement-api-version 1.3.\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_de292a37","line":75,"range":{"start_line":75,"start_character":22,"end_line":75,"end_character":31},"in_reply_to":"bf659307_dcc88875","updated":"2018-04-11 08:53:54.000000000","message":"Done","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a08e59b5e075f519be9b623b2895c886e8c84116","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        parser.add_argument("},{"line_number":74,"context_line":"            \u0027--member-of\u0027,"},{"line_number":75,"context_line":"            metavar\u003d\u0027\u003cmember_of\u003e\u0027,"},{"line_number":76,"context_line":"            help\u003d\u0027A comma-separated list of strings \u0027"},{"line_number":77,"context_line":"                 \u0027representing aggregate uuids. \u0027"},{"line_number":78,"context_line":"                 \u0027This param requires at least --os-placement-api-version 1.3.\u0027"},{"line_number":79,"context_line":"        )"},{"line_number":80,"context_line":"        parser.add_argument("}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_dcb7283a","line":77,"range":{"start_line":76,"start_character":17,"end_line":77,"end_character":49},"updated":"2018-04-09 16:40:01.000000000","message":"We should probably also mention what the API reference docs say for this, \"The returned resource providers must be associated with at least one of the aggregates identified by uuid.\".","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a08e59b5e075f519be9b623b2895c886e8c84116","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            metavar\u003d\u0027\u003cmember_of\u003e\u0027,"},{"line_number":76,"context_line":"            help\u003d\u0027A comma-separated list of strings \u0027"},{"line_number":77,"context_line":"                 \u0027representing aggregate uuids. \u0027"},{"line_number":78,"context_line":"                 \u0027This param requires at least --os-placement-api-version 1.3.\u0027"},{"line_number":79,"context_line":"        )"},{"line_number":80,"context_line":"        parser.add_argument("},{"line_number":81,"context_line":"            \u0027--resource\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_9c9a10c3","line":78,"range":{"start_line":78,"start_character":47,"end_line":78,"end_character":77},"updated":"2018-04-09 16:40:01.000000000","message":"nit: based on how this renders, I wonder if we should enclose this in ``--os-placement-api-version 1.3``:\n\nhttp://logs.openstack.org/83/511183/14/check/build-openstack-sphinx-docs/2e000b9/html/cli/index.html#cmdoption-openstack-resource-provider-list-member-of\n\nWhich might fix it on the rendered docs but may also make the CLI help text output uglier. Also, I know this is just following what other CLIs are already doing, so we could hold off on changing that to a separate patch.","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"8be1b80d57d4a078ed628d4b22f663c35da04ace","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            metavar\u003d\u0027\u003cmember_of\u003e\u0027,"},{"line_number":76,"context_line":"            help\u003d\u0027A comma-separated list of strings \u0027"},{"line_number":77,"context_line":"                 \u0027representing aggregate uuids. \u0027"},{"line_number":78,"context_line":"                 \u0027This param requires at least --os-placement-api-version 1.3.\u0027"},{"line_number":79,"context_line":"        )"},{"line_number":80,"context_line":"        parser.add_argument("},{"line_number":81,"context_line":"            \u0027--resource\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_bea796bc","line":78,"range":{"start_line":78,"start_character":47,"end_line":78,"end_character":77},"in_reply_to":"bf659307_9c9a10c3","updated":"2018-04-11 08:53:54.000000000","message":"Added quotes and newlines as quotes don\u0027t help with line breaks.","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a08e59b5e075f519be9b623b2895c886e8c84116","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            \u0027--resource\u0027,"},{"line_number":82,"context_line":"            metavar\u003d\u0027\u003cresource_class\u003e\u003d\u003cvalue\u003e\u0027,"},{"line_number":83,"context_line":"            default\u003d[],"},{"line_number":84,"context_line":"            action\u003d\u0027append\u0027,"},{"line_number":85,"context_line":"            help\u003d\u0027A resource class values pair indicating an \u0027"},{"line_number":86,"context_line":"                 \u0027amount of resource of a specified class that a provider \u0027"},{"line_number":87,"context_line":"                 \u0027must have the capacity to serve. May be repeated. \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_1cdcc072","line":84,"range":{"start_line":84,"start_character":12,"end_line":84,"end_character":28},"updated":"2018-04-09 16:40:01.000000000","message":"See here we append the values, unlike --member-of, which seems a bit inconsistent to me.","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"8be1b80d57d4a078ed628d4b22f663c35da04ace","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            \u0027--resource\u0027,"},{"line_number":82,"context_line":"            metavar\u003d\u0027\u003cresource_class\u003e\u003d\u003cvalue\u003e\u0027,"},{"line_number":83,"context_line":"            default\u003d[],"},{"line_number":84,"context_line":"            action\u003d\u0027append\u0027,"},{"line_number":85,"context_line":"            help\u003d\u0027A resource class values pair indicating an \u0027"},{"line_number":86,"context_line":"                 \u0027amount of resource of a specified class that a provider \u0027"},{"line_number":87,"context_line":"                 \u0027must have the capacity to serve. May be repeated. \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_deaccaa0","line":84,"range":{"start_line":84,"start_character":12,"end_line":84,"end_character":28},"in_reply_to":"bf659307_1cdcc072","updated":"2018-04-11 08:53:54.000000000","message":"Done","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a08e59b5e075f519be9b623b2895c886e8c84116","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            metavar\u003d\u0027\u003cresource_class\u003e\u003d\u003cvalue\u003e\u0027,"},{"line_number":83,"context_line":"            default\u003d[],"},{"line_number":84,"context_line":"            action\u003d\u0027append\u0027,"},{"line_number":85,"context_line":"            help\u003d\u0027A resource class values pair indicating an \u0027"},{"line_number":86,"context_line":"                 \u0027amount of resource of a specified class that a provider \u0027"},{"line_number":87,"context_line":"                 \u0027must have the capacity to serve. May be repeated. \u0027"},{"line_number":88,"context_line":"                 \u0027This param requires at least --os-placement-api-version 1.4.\u0027"},{"line_number":89,"context_line":"        )"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_9c5f70e4","line":87,"range":{"start_line":85,"start_character":17,"end_line":87,"end_character":69},"updated":"2018-04-09 16:40:01.000000000","message":"I was going to ask that we add an example here, but the rendered help is pretty clear:\n\nhttp://logs.openstack.org/83/511183/14/check/build-openstack-sphinx-docs/2e000b9/html/cli/index.html#cmdoption-openstack-resource-provider-list-resource","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5c57d402e2676c8b398872bbdefb33eeece5bf3c","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        http \u003d self.app.client_manager.placement"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        filters \u003d {}"},{"line_number":79,"context_line":"        if \u0027name\u0027 in parsed_args and parsed_args.name:"},{"line_number":80,"context_line":"            filters[\u0027name\u0027] \u003d parsed_args.name"},{"line_number":81,"context_line":"        if \u0027uuid\u0027 in parsed_args and parsed_args.uuid:"},{"line_number":82,"context_line":"            filters[\u0027uuid\u0027] \u003d parsed_args.uuid"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        url \u003d common.url_with_filters(BASE_URL, filters)"},{"line_number":85,"context_line":"        resources \u003d http.request(\u0027GET\u0027, url).json()[\u0027resource_providers\u0027]"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf659307_cea175f9","side":"PARENT","line":82,"range":{"start_line":79,"start_character":8,"end_line":82,"end_character":46},"updated":"2018-04-11 13:23:33.000000000","message":"Why is this changing?","commit_id":"16bb97c779d44fe489eb92bd7f565337f311d235"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"0a5c680551cde341301eb38ae7e846f280e9cc2c","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        http \u003d self.app.client_manager.placement"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        filters \u003d {}"},{"line_number":79,"context_line":"        if \u0027name\u0027 in parsed_args and parsed_args.name:"},{"line_number":80,"context_line":"            filters[\u0027name\u0027] \u003d parsed_args.name"},{"line_number":81,"context_line":"        if \u0027uuid\u0027 in parsed_args and parsed_args.uuid:"},{"line_number":82,"context_line":"            filters[\u0027uuid\u0027] \u003d parsed_args.uuid"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        url \u003d common.url_with_filters(BASE_URL, filters)"},{"line_number":85,"context_line":"        resources \u003d http.request(\u0027GET\u0027, url).json()[\u0027resource_providers\u0027]"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf659307_50dabe77","side":"PARENT","line":82,"range":{"start_line":79,"start_character":8,"end_line":82,"end_character":46},"in_reply_to":"bf659307_cea175f9","updated":"2018-04-12 13:37:49.000000000","message":"Looks like it was incorrect before. No need to check that an option is in parsed_args.","commit_id":"16bb97c779d44fe489eb92bd7f565337f311d235"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5c57d402e2676c8b398872bbdefb33eeece5bf3c","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            default\u003d[],"},{"line_number":76,"context_line":"            action\u003d\u0027append\u0027,"},{"line_number":77,"context_line":"            metavar\u003d\u0027\u003caggregate_uuid\u003e\u0027,"},{"line_number":78,"context_line":"            help\u003d\u0027UUID of the resource provider aggregate. \u0027"},{"line_number":79,"context_line":"                 \u0027May be repeated.\\n\\n\u0027"},{"line_number":80,"context_line":"                 \u0027This param requires at least \u0027"},{"line_number":81,"context_line":"                 \u0027``--os-placement-api-version 1.3``.\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf659307_2ea111f9","line":78,"range":{"start_line":78,"start_character":18,"end_line":78,"end_character":58},"updated":"2018-04-11 13:23:33.000000000","message":"I was OK with --member-of since that was more clear about the relationship of the resource providers being listed to the aggregate filter. I\u0027m also OK with --aggregate-uuid as the option name, but we should then update the help to explain the relationship, i.e. something like, \"UUID of the resource provider aggregate of which the listed resource providers are a member. The returned resource providers must be associated with at least one of the aggregates identified by uuid.\"","commit_id":"0aabc276019d8bfb07fc7b1dfffa1574a1d96723"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"0a5c680551cde341301eb38ae7e846f280e9cc2c","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            default\u003d[],"},{"line_number":76,"context_line":"            action\u003d\u0027append\u0027,"},{"line_number":77,"context_line":"            metavar\u003d\u0027\u003caggregate_uuid\u003e\u0027,"},{"line_number":78,"context_line":"            help\u003d\u0027UUID of the resource provider aggregate. \u0027"},{"line_number":79,"context_line":"                 \u0027May be repeated.\\n\\n\u0027"},{"line_number":80,"context_line":"                 \u0027This param requires at least \u0027"},{"line_number":81,"context_line":"                 \u0027``--os-placement-api-version 1.3``.\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf659307_50c39e89","line":78,"range":{"start_line":78,"start_character":18,"end_line":78,"end_character":58},"in_reply_to":"bf659307_2ea111f9","updated":"2018-04-12 13:37:49.000000000","message":"Understood, aggregate-uuid makes more sense for me, it sounds like a filter option. Help is updated.","commit_id":"0aabc276019d8bfb07fc7b1dfffa1574a1d96723"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f2a5173d1f48b860c51e96528379f5d4f15a71f9","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            action\u003d\u0027append\u0027,"},{"line_number":77,"context_line":"            metavar\u003d\u0027\u003caggregate_uuid\u003e\u0027,"},{"line_number":78,"context_line":"            help\u003d\u0027UUID of the resource provider aggregate of which the \u0027"},{"line_number":79,"context_line":"                 \u0027listed resource providers are a member. The returned \u0027"},{"line_number":80,"context_line":"                 \u0027resource providers must be associated with at least one of \u0027"},{"line_number":81,"context_line":"                 \u0027the aggregates identified by uuid. \u0027"},{"line_number":82,"context_line":"                 \u0027May be repeated.\\n\\n\u0027"},{"line_number":83,"context_line":"                 \u0027This param requires at least \u0027"},{"line_number":84,"context_line":"                 \u0027``--os-placement-api-version 1.3``.\u0027"},{"line_number":85,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f6a8fd7_3d640eb9","line":82,"range":{"start_line":79,"start_character":57,"end_line":82,"end_character":39},"updated":"2018-04-19 11:19:47.000000000","message":"I would switch the order of these two sentences as the first one only meaningful if the reader knows that more than one UUID can be specified by repeating this argument.","commit_id":"844414861a90e251cc4f61ee6908009130284353"}],"osc_placement/tests/functional/base.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a08e59b5e075f519be9b623b2895c886e8c84116","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        return self.openstack(cmd, use_json\u003dTrue)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def resource_provider_list(self, *args, **kwargs):"},{"line_number":94,"context_line":"        to_exec \u003d \u0027resource provider list\u0027"},{"line_number":95,"context_line":"        if kwargs.get(\u0027uuid\u0027):"},{"line_number":96,"context_line":"            to_exec +\u003d \u0027 --uuid \u0027 + kwargs.get(\u0027uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_5caa3885","line":93,"range":{"start_line":93,"start_character":37,"end_line":93,"end_character":52},"updated":"2018-04-09 16:40:01.000000000","message":"I\u0027m not crazy about this, why not just add two new named kwargs?","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5c57d402e2676c8b398872bbdefb33eeece5bf3c","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        return self.openstack(cmd, use_json\u003dTrue)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def resource_provider_list(self, uuid\u003dNone, name\u003dNone, aggregate_uuid\u003dNone,"},{"line_number":97,"context_line":"                               resources\u003dNone):"},{"line_number":98,"context_line":"        to_exec \u003d \u0027resource provider list\u0027"},{"line_number":99,"context_line":"        if uuid:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf659307_0e852d5a","line":96,"range":{"start_line":96,"start_character":59,"end_line":96,"end_character":73},"updated":"2018-04-11 13:23:33.000000000","message":"nit: aggregate_uuids? To make it more clear that it\u0027s an iterable.","commit_id":"0aabc276019d8bfb07fc7b1dfffa1574a1d96723"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"0a5c680551cde341301eb38ae7e846f280e9cc2c","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        return self.openstack(cmd, use_json\u003dTrue)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def resource_provider_list(self, uuid\u003dNone, name\u003dNone, aggregate_uuid\u003dNone,"},{"line_number":97,"context_line":"                               resources\u003dNone):"},{"line_number":98,"context_line":"        to_exec \u003d \u0027resource provider list\u0027"},{"line_number":99,"context_line":"        if uuid:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf659307_b0379ab0","line":96,"range":{"start_line":96,"start_character":59,"end_line":96,"end_character":73},"in_reply_to":"bf659307_0e852d5a","updated":"2018-04-12 13:37:49.000000000","message":"Done","commit_id":"0aabc276019d8bfb07fc7b1dfffa1574a1d96723"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"329628e82337615fb13c2c48e72aec3e19d7560d","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        if use_json:"},{"line_number":45,"context_line":"            try:"},{"line_number":46,"context_line":"                return json.loads(result)"},{"line_number":47,"context_line":"            except ValueError:"},{"line_number":48,"context_line":"                raise ValueError(\u0027Failed to load json from \"%s\"\u0027 % result)"},{"line_number":49,"context_line":"        else:"},{"line_number":50,"context_line":"            return result"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f6a8fd7_09d0fe1e","line":47,"updated":"2018-04-18 21:27:02.000000000","message":"Looks like this was here to deal with what https://review.openstack.org/#/c/560004/ already fixed, so I just removed it.","commit_id":"87e10ba10a0c908a5ec04c4dfadb01b7396920da"}],"osc_placement/tests/functional/test_resource_provider.py":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"2ed1a7396e21d82451dfcd92e998494c0a35b9ec","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            member_of\u003d\u0027fake_uuid\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def test_return_empty_list_for_nonexistent_aggregate(self):"},{"line_number":162,"context_line":"        self.resource_provider_create(\u0027rp\u0027)"},{"line_number":163,"context_line":"        agg \u003d str(uuid.uuid4())"},{"line_number":164,"context_line":"        self.assertEqual([], self.resource_provider_list("},{"line_number":165,"context_line":"            member_of\u003dagg))"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa0c359_b184b10d","line":162,"range":{"start_line":162,"start_character":8,"end_line":162,"end_character":43},"updated":"2018-02-08 15:51:05.000000000","message":"For me these tests failed randomly with \n\"output: Conflicting resource provider name: rp1 already exists. (HTTP 409)\" due to parallel execution.\nSome solution like in tempest to have random generated part of the resource names should solve that.\nhttps://github.com/openstack/tempest-lib/blob/master/tempest_lib/common/utils/data_utils.py#LC41","commit_id":"cfe4933029437856bea992ab7292d9cdc4fbbf5d"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"d0884ee6ebc1d30af143217592349202dedb49db","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            member_of\u003d\u0027fake_uuid\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def test_return_empty_list_for_nonexistent_aggregate(self):"},{"line_number":162,"context_line":"        self.resource_provider_create(\u0027rp\u0027)"},{"line_number":163,"context_line":"        agg \u003d str(uuid.uuid4())"},{"line_number":164,"context_line":"        self.assertEqual([], self.resource_provider_list("},{"line_number":165,"context_line":"            member_of\u003dagg))"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa0c359_e47b4078","line":162,"range":{"start_line":162,"start_character":8,"end_line":162,"end_character":43},"in_reply_to":"3fa0c359_b184b10d","updated":"2018-02-12 07:05:18.000000000","message":"I uploaded a patch with rand_name:\nhttps://review.openstack.org/542745\nPerhaps do a try with that.","commit_id":"cfe4933029437856bea992ab7292d9cdc4fbbf5d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a08e59b5e075f519be9b623b2895c886e8c84116","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        by_uuid \u003d self.resource_provider_list(uuid\u003dstr(uuid.uuid4()))"},{"line_number":144,"context_line":"        self.assertEqual([], by_uuid)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def test_fail_if_incorrect_options(self):"},{"line_number":147,"context_line":"        self.assertCommandFailed(\u0027Operation or argument is not supported\u0027,"},{"line_number":148,"context_line":"                                 self.resource_provider_list, member_of\u003d\u00271\u0027)"},{"line_number":149,"context_line":"        self.assertCommandFailed(\u0027Operation or argument is not supported\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_dc9de866","line":146,"range":{"start_line":146,"start_character":8,"end_line":146,"end_character":38},"updated":"2018-04-09 16:40:01.000000000","message":"nit: add comments in here about why these are incorrect, i.e. member_of requires \u003e\u003d 1.3 and resources requires \u003e\u003d 1.4.","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a08e59b5e075f519be9b623b2895c886e8c84116","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def test_fail_if_incorrect_member_of(self):"},{"line_number":157,"context_line":"        self.assertCommandFailed("},{"line_number":158,"context_line":"            \u0027Invalid uuid value\u0027, self.resource_provider_list,"},{"line_number":159,"context_line":"            member_of\u003d\u0027fake_uuid\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def test_return_empty_list_for_nonexistent_aggregate(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf659307_dcaba872","line":158,"range":{"start_line":158,"start_character":12,"end_line":158,"end_character":32},"updated":"2018-04-09 16:40:01.000000000","message":"Yup:\n\nhttps://github.com/openstack/nova/blob/e2d5dc4e2c5f69fcbcb04c29b2ed469725122787/nova/api/openstack/placement/handlers/resource_provider.py#L215","commit_id":"bc8242c7061c23aba0391202ec36e759b3d5fda2"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f2a5173d1f48b860c51e96528379f5d4f15a71f9","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"class TestResourceProvider14(base.BaseTestCase):"},{"line_number":157,"context_line":"    VERSION \u003d \u00271.4\u0027"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def test_fail_if_incorrect_aggregate_uuid(self):"},{"line_number":160,"context_line":"        # aggregate_uuid requires the uuid like format"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f6a8fd7_9d22fa51","line":157,"updated":"2018-04-19 11:19:47.000000000","message":"This does not explicitly test that 1.3 does not support  resources filter but 1.4 does. But I feel it is not serious problem.","commit_id":"844414861a90e251cc4f61ee6908009130284353"}]}
