)]}'
{"osc_placement/resources/trait.py":[{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"b06dda4e763aac15cec5e70eebff73834a8a58c9","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        parser.add_argument("},{"line_number":44,"context_line":"            \u0027--associated\u0027,"},{"line_number":45,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":46,"context_line":"            help\u003d(\u0027If this parameter has a true value, the returned \u0027"},{"line_number":47,"context_line":"                  \u0027traits will be those that are associated with at \u0027"},{"line_number":48,"context_line":"                  \u0027least one resource provider. Available values \u0027"},{"line_number":49,"context_line":"                  \u0027for the parameter are true and false.\u0027)"},{"line_number":50,"context_line":"        )"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        parser.add_argument("}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa0c359_d8b1a791","line":49,"range":{"start_line":46,"start_character":1,"end_line":49,"end_character":58},"updated":"2018-02-06 14:47:08.000000000","message":"In the CLI this is an option, not a parameter. It does not have a true or false value. It\u0027s either present (\u003dtrue) or not (\u003dfalse).","commit_id":"9de9d7c1a53a20465b554745a222df6e1657ba22"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"7eee5ee021d4a9d32aafd52f7c72a9bec2f66b89","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        parser.add_argument("},{"line_number":44,"context_line":"            \u0027--associated\u0027,"},{"line_number":45,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":46,"context_line":"            help\u003d(\u0027If this parameter has a true value, the returned \u0027"},{"line_number":47,"context_line":"                  \u0027traits will be those that are associated with at \u0027"},{"line_number":48,"context_line":"                  \u0027least one resource provider. Available values \u0027"},{"line_number":49,"context_line":"                  \u0027for the parameter are true and false.\u0027)"},{"line_number":50,"context_line":"        )"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        parser.add_argument("}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa0c359_cdabeb86","line":49,"range":{"start_line":46,"start_character":1,"end_line":49,"end_character":58},"in_reply_to":"3fa0c359_d8b1a791","updated":"2018-02-08 11:42:35.000000000","message":"Done","commit_id":"9de9d7c1a53a20465b554745a222df6e1657ba22"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"b06dda4e763aac15cec5e70eebff73834a8a58c9","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        return FIELDS, [parsed_args.name]"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class SetTrait(command.Command):"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    \"\"\"Insert a new custom trait.\"\"\""},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa0c359_bb19357a","line":102,"range":{"start_line":102,"start_character":6,"end_line":102,"end_character":14},"updated":"2018-02-06 14:47:08.000000000","message":"I find this confusing. IMHO a naive placement user (including me) would be looking for \u0027trait create\u0027 (not \u0027trait set\u0027) when trying to make a new custom trait exist.","commit_id":"9de9d7c1a53a20465b554745a222df6e1657ba22"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"7eee5ee021d4a9d32aafd52f7c72a9bec2f66b89","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        return FIELDS, [parsed_args.name]"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class SetTrait(command.Command):"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    \"\"\"Insert a new custom trait.\"\"\""},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa0c359_4d9fdb5e","line":102,"range":{"start_line":102,"start_character":6,"end_line":102,"end_character":14},"in_reply_to":"3fa0c359_bb19357a","updated":"2018-02-08 11:42:35.000000000","message":"Yes, create is more appropriate here. Updated.","commit_id":"9de9d7c1a53a20465b554745a222df6e1657ba22"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"b06dda4e763aac15cec5e70eebff73834a8a58c9","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"class DeleteTrait(command.Command):"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    \"\"\"Delete the trait specified be {name}.\"\"\""},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def get_parser(self, prog_name):"},{"line_number":130,"context_line":"        parser \u003d super(DeleteTrait, self).get_parser(prog_name)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa0c359_fb66dded","line":127,"range":{"start_line":127,"start_character":34,"end_line":127,"end_character":36},"updated":"2018-02-06 14:47:08.000000000","message":"by","commit_id":"9de9d7c1a53a20465b554745a222df6e1657ba22"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"7eee5ee021d4a9d32aafd52f7c72a9bec2f66b89","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"class DeleteTrait(command.Command):"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    \"\"\"Delete the trait specified be {name}.\"\"\""},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def get_parser(self, prog_name):"},{"line_number":130,"context_line":"        parser \u003d super(DeleteTrait, self).get_parser(prog_name)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa0c359_6d9ad76e","line":127,"range":{"start_line":127,"start_character":34,"end_line":127,"end_character":36},"in_reply_to":"3fa0c359_fb66dded","updated":"2018-02-08 11:42:35.000000000","message":"Done","commit_id":"9de9d7c1a53a20465b554745a222df6e1657ba22"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"b06dda4e763aac15cec5e70eebff73834a8a58c9","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        parser.add_argument("},{"line_number":187,"context_line":"            \u0027--trait\u0027,"},{"line_number":188,"context_line":"            metavar\u003d\u0027\u003ctrait\u003e\u0027,"},{"line_number":189,"context_line":"            help\u003d\u0027Name of the trait.\u0027,"},{"line_number":190,"context_line":"            default\u003d[],"},{"line_number":191,"context_line":"            action\u003d\u0027append\u0027"},{"line_number":192,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa0c359_58627740","line":189,"range":{"start_line":189,"start_character":18,"end_line":189,"end_character":36},"updated":"2018-02-06 14:47:08.000000000","message":"Would be useful to add: \"Can be repeated.\"","commit_id":"9de9d7c1a53a20465b554745a222df6e1657ba22"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"7eee5ee021d4a9d32aafd52f7c72a9bec2f66b89","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        parser.add_argument("},{"line_number":187,"context_line":"            \u0027--trait\u0027,"},{"line_number":188,"context_line":"            metavar\u003d\u0027\u003ctrait\u003e\u0027,"},{"line_number":189,"context_line":"            help\u003d\u0027Name of the trait.\u0027,"},{"line_number":190,"context_line":"            default\u003d[],"},{"line_number":191,"context_line":"            action\u003d\u0027append\u0027"},{"line_number":192,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa0c359_2d8e0f2e","line":189,"range":{"start_line":189,"start_character":18,"end_line":189,"end_character":36},"in_reply_to":"3fa0c359_58627740","updated":"2018-02-08 11:42:35.000000000","message":"Done","commit_id":"9de9d7c1a53a20465b554745a222df6e1657ba22"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"0a8f2910e8610bf4dddebb4f2d0cab99fab90534","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        )"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        parser.add_argument("},{"line_number":55,"context_line":"            \u0027--uuid\u0027,"},{"line_number":56,"context_line":"            metavar\u003d\u0027uuid\u0027,"},{"line_number":57,"context_line":"            help\u003d\u0027UUID of the resource provider.\u0027"},{"line_number":58,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf659307_ed56e606","line":55,"range":{"start_line":55,"start_character":13,"end_line":55,"end_character":19},"updated":"2018-04-10 10:08:53.000000000","message":"I think ``--uuid`` is not a best choice in here, even we have a help to descripe it.\n\nBecause the user maybe confused (trait uuid or some others) by this at first sight.\n\nMaybe we could get some other idea from others.","commit_id":"9cb41ce383e7a962ef871d0f582e5defe2720f63"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"27ccf33d7c3ea601faf3fc86149709742f484ebb","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        )"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        parser.add_argument("},{"line_number":55,"context_line":"            \u0027--uuid\u0027,"},{"line_number":56,"context_line":"            metavar\u003d\u0027uuid\u0027,"},{"line_number":57,"context_line":"            help\u003d\u0027UUID of the resource provider.\u0027"},{"line_number":58,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf659307_c0af0428","line":55,"range":{"start_line":55,"start_character":13,"end_line":55,"end_character":19},"in_reply_to":"bf659307_3418851c","updated":"2018-04-11 12:32:30.000000000","message":"you\u0027re right, my mistake","commit_id":"9cb41ce383e7a962ef871d0f582e5defe2720f63"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"0ea909be03430ae1b1e4340cd2b13521144448a5","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        )"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        parser.add_argument("},{"line_number":55,"context_line":"            \u0027--uuid\u0027,"},{"line_number":56,"context_line":"            metavar\u003d\u0027uuid\u0027,"},{"line_number":57,"context_line":"            help\u003d\u0027UUID of the resource provider.\u0027"},{"line_number":58,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf659307_3418851c","line":55,"range":{"start_line":55,"start_character":13,"end_line":55,"end_character":19},"in_reply_to":"bf659307_b931f05b","updated":"2018-04-11 10:16:12.000000000","message":"emm? But I try this command, the result is: list the all traits for specific RP.\n\nhttps://review.openstack.org/#/c/514643/12/osc_placement/resources/trait.py@69\n\nhttps://developer.openstack.org/api-ref/placement/#resource-provider-traits\n\nSo, I just want to sure should we change uuid to something like: rp_uuid, resource_provider_uuid.","commit_id":"9cb41ce383e7a962ef871d0f582e5defe2720f63"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"958c86b13835157172ed5f868f21f080cc1ad8ae","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        )"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        parser.add_argument("},{"line_number":55,"context_line":"            \u0027--uuid\u0027,"},{"line_number":56,"context_line":"            metavar\u003d\u0027uuid\u0027,"},{"line_number":57,"context_line":"            help\u003d\u0027UUID of the resource provider.\u0027"},{"line_number":58,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf659307_b931f05b","line":55,"range":{"start_line":55,"start_character":13,"end_line":55,"end_character":19},"in_reply_to":"bf659307_ed56e606","updated":"2018-04-11 09:39:24.000000000","message":"heh, that looks like copypaste. Actually the uuid param is not used. Will delete it on the next reroll.","commit_id":"9cb41ce383e7a962ef871d0f582e5defe2720f63"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"b8d1dc91db4ec410f2a12eaf61ca803b093a6bb7","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        )"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        parser.add_argument("},{"line_number":55,"context_line":"            \u0027--uuid\u0027,"},{"line_number":56,"context_line":"            metavar\u003d\u0027uuid\u0027,"},{"line_number":57,"context_line":"            help\u003d\u0027UUID of the resource provider.\u0027"},{"line_number":58,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":16,"id":"9f6a8fd7_58a550b4","line":55,"range":{"start_line":55,"start_character":13,"end_line":55,"end_character":19},"updated":"2018-04-19 12:12:34.000000000","message":"I see that previously there were comments for this uuid param, now I try to check it from another direction: by the API ref this is not a trait operation, but instead a resource provider traits operation.\nLater in this file you add command for listing rp traits by uuid. \n\n\nBy adding --uuid the url will be RP_TRAITS_URL (/placement/resource_providers/\u003crp_uuid\u003e/traits) instead of BASE_URL (/placement/traits) which also shows for me that this --uuid param is cheating what is in the API ref.\n\n\nFrom another perspective it could be helpful to the user, but in that case the help should be more detailed, and the name of the param should be rp_uuid or similar as Kero suggested in ps12.\n\n\nSummary: I can live with this --(rp_)uuid param here, but with some more help for the user.","commit_id":"9bb0ee113b27493ef2ed6bc92d34bcf646071f49"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"2e71221f4dbda2b88c9736c1f9970b005e77d1bb","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    \"\"\"Return a list of valid trait strings."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    This command requires at least --os-placement-api-version 1.6."},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f6a8fd7_2b908895","line":28,"range":{"start_line":28,"start_character":35,"end_line":28,"end_character":65},"updated":"2018-04-28 08:54:54.000000000","message":"``--os-placement-api-version 1.6``","commit_id":"83bd3f9e586d86bb496c53f314b34ec9c095eab8"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"49297ca0303326873c0601825b84bf507e0af83e","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    \"\"\"Return a list of valid trait strings."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    This command requires at least --os-placement-api-version 1.6."},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_d0682fba","line":28,"range":{"start_line":28,"start_character":35,"end_line":28,"end_character":65},"in_reply_to":"9f6a8fd7_2b908895","updated":"2018-05-11 08:38:17.000000000","message":"done for all","commit_id":"83bd3f9e586d86bb496c53f314b34ec9c095eab8"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"2e71221f4dbda2b88c9736c1f9970b005e77d1bb","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        )"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        parser.add_argument("},{"line_number":55,"context_line":"            \u0027--uuid\u0027,"},{"line_number":56,"context_line":"            metavar\u003d\u0027uuid\u0027,"},{"line_number":57,"context_line":"            help\u003d\u0027UUID of the resource provider.\u0027"},{"line_number":58,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f6a8fd7_cb11ccae","line":55,"range":{"start_line":55,"start_character":15,"end_line":55,"end_character":19},"updated":"2018-04-28 08:54:54.000000000","message":"Don\u0027t forget this. :)","commit_id":"83bd3f9e586d86bb496c53f314b34ec9c095eab8"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"74d270835af5163d7945b06b7178381ed0428b59","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        )"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        parser.add_argument("},{"line_number":55,"context_line":"            \u0027--uuid\u0027,"},{"line_number":56,"context_line":"            metavar\u003d\u0027uuid\u0027,"},{"line_number":57,"context_line":"            help\u003d\u0027UUID of the resource provider.\u0027"},{"line_number":58,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_6424c65e","line":55,"range":{"start_line":55,"start_character":15,"end_line":55,"end_character":19},"in_reply_to":"5f7c97a3_10cf87b0","updated":"2018-05-15 02:58:34.000000000","message":"It\u0027s okay to me, thanks.","commit_id":"83bd3f9e586d86bb496c53f314b34ec9c095eab8"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"49297ca0303326873c0601825b84bf507e0af83e","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        )"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        parser.add_argument("},{"line_number":55,"context_line":"            \u0027--uuid\u0027,"},{"line_number":56,"context_line":"            metavar\u003d\u0027uuid\u0027,"},{"line_number":57,"context_line":"            help\u003d\u0027UUID of the resource provider.\u0027"},{"line_number":58,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_10cf87b0","line":55,"range":{"start_line":55,"start_character":15,"end_line":55,"end_character":19},"in_reply_to":"9f6a8fd7_cb11ccae","updated":"2018-05-11 08:38:17.000000000","message":"I decided to delete this. After some time passed it looks confusing to me and I found no tests for this logic.\nSo the only way now to see traits related to RP is:\nopenstack resource provider trait list \u003crp-uuid\u003e","commit_id":"83bd3f9e586d86bb496c53f314b34ec9c095eab8"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"2e71221f4dbda2b88c9736c1f9970b005e77d1bb","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        parser.add_argument("},{"line_number":55,"context_line":"            \u0027--uuid\u0027,"},{"line_number":56,"context_line":"            metavar\u003d\u0027uuid\u0027,"},{"line_number":57,"context_line":"            help\u003d\u0027UUID of the resource provider.\u0027"},{"line_number":58,"context_line":"        )"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9f6a8fd7_eb1290b4","line":56,"range":{"start_line":56,"start_character":21,"end_line":56,"end_character":25},"updated":"2018-04-28 08:54:54.000000000","message":"\u003cxxxx\u003e","commit_id":"83bd3f9e586d86bb496c53f314b34ec9c095eab8"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"2e71221f4dbda2b88c9736c1f9970b005e77d1bb","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    \"\"\"Check if a trait name exists in this cloud."},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    This command requires at least --os-placement-api-version 1.6."},{"line_number":84,"context_line":"    \"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f6a8fd7_4b1dbcbb","line":83,"range":{"start_line":83,"start_character":35,"end_line":83,"end_character":65},"updated":"2018-04-28 08:54:54.000000000","message":"ditto","commit_id":"83bd3f9e586d86bb496c53f314b34ec9c095eab8"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"2e71221f4dbda2b88c9736c1f9970b005e77d1bb","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    \"\"\"Create a new custom trait."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    This command requires at least --os-placement-api-version 1.6."},{"line_number":112,"context_line":"    \"\"\""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f6a8fd7_eb77f007","line":111,"range":{"start_line":111,"start_character":34,"end_line":111,"end_character":65},"updated":"2018-04-28 08:54:54.000000000","message":"ditto","commit_id":"83bd3f9e586d86bb496c53f314b34ec9c095eab8"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"2e71221f4dbda2b88c9736c1f9970b005e77d1bb","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    \"\"\"Delete the trait specified by {name}."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    This command requires at least --os-placement-api-version 1.6."},{"line_number":138,"context_line":"    \"\"\""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f6a8fd7_cb86acdc","line":137,"range":{"start_line":137,"start_character":35,"end_line":137,"end_character":65},"updated":"2018-04-28 08:54:54.000000000","message":"ditto","commit_id":"83bd3f9e586d86bb496c53f314b34ec9c095eab8"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"2e71221f4dbda2b88c9736c1f9970b005e77d1bb","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    \"\"\"Associate traits with the resource provider identified by {uuid}."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    This command requires at least --os-placement-api-version 1.6."},{"line_number":165,"context_line":"    \"\"\""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f6a8fd7_6b6be01e","line":164,"range":{"start_line":164,"start_character":35,"end_line":164,"end_character":65},"updated":"2018-04-28 08:54:54.000000000","message":"ditto","commit_id":"83bd3f9e586d86bb496c53f314b34ec9c095eab8"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"2e71221f4dbda2b88c9736c1f9970b005e77d1bb","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    \"\"\"Associate traits with the resource provider identified by {uuid}."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    This command requires at least --os-placement-api-version 1.6."},{"line_number":192,"context_line":"    \"\"\""},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f6a8fd7_8b68b421","line":191,"range":{"start_line":191,"start_character":35,"end_line":191,"end_character":65},"updated":"2018-04-28 08:54:54.000000000","message":"ditto","commit_id":"83bd3f9e586d86bb496c53f314b34ec9c095eab8"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"2e71221f4dbda2b88c9736c1f9970b005e77d1bb","unresolved":false,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    \"\"\"Dissociate all the traits from the resource provider."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    This command requires at least --os-placement-api-version 1.6."},{"line_number":233,"context_line":"    \"\"\""},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f6a8fd7_2b75e8fa","line":232,"range":{"start_line":232,"start_character":35,"end_line":232,"end_character":65},"updated":"2018-04-28 08:54:54.000000000","message":"ditto","commit_id":"83bd3f9e586d86bb496c53f314b34ec9c095eab8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a07ef369a59820906a21a075a860e9bcdf7fcd2a","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        parser.add_argument("},{"line_number":35,"context_line":"            \u0027--name\u0027,"},{"line_number":36,"context_line":"            metavar\u003d\u0027\u003cname\u003e\u0027,"},{"line_number":37,"context_line":"            help\u003d(\u0027A string to filter traits. The following options \u0027"},{"line_number":38,"context_line":"                  \u0027are available: startswith operator filters the \u0027"},{"line_number":39,"context_line":"                  \u0027traits whose name begins with a specific prefix, \u0027"},{"line_number":40,"context_line":"                  \u0027e.g. name\u003dstartswith:CUSTOM, in operator filters \u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_792d5aa6","line":37,"updated":"2018-05-14 18:32:47.000000000","message":"Hmm, I wonder if this would be better split into separate options --startswith and --in. I guess we could add those later if people found the --name syntax confusing.","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a07ef369a59820906a21a075a860e9bcdf7fcd2a","unresolved":false,"context_lines":[{"line_number":98,"context_line":"class CreateTrait(command.Command):"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    \"\"\"Create a new custom trait."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    This command requires at least ``--os-placement-api-version 1.6``."},{"line_number":103,"context_line":"    \"\"\""},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_ec20c69d","line":101,"updated":"2018-05-14 18:32:47.000000000","message":"nit: we could also mention:\n\n\"Custom traits must begin with the prefix \"CUSTOM_\" and contain only the letters A through Z, the numbers 0 through 9 and the underscore \"_\" character.\"","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2fcff1f9670fa561dc1ab94ce14f5b6b6527f0de","unresolved":false,"context_lines":[{"line_number":98,"context_line":"class CreateTrait(command.Command):"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    \"\"\"Create a new custom trait."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    This command requires at least ``--os-placement-api-version 1.6``."},{"line_number":103,"context_line":"    \"\"\""},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_6ff2689c","line":101,"in_reply_to":"5f7c97a3_ec20c69d","updated":"2018-05-14 19:41:02.000000000","message":"Done","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a07ef369a59820906a21a075a860e9bcdf7fcd2a","unresolved":false,"context_lines":[{"line_number":178,"context_line":"class SetResourceProviderTrait(command.Lister):"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    \"\"\"Associate traits with the resource provider identified by {uuid}."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    This command requires at least ``--os-placement-api-version 1.6``."},{"line_number":183,"context_line":"    \"\"\""},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_6c49165e","line":181,"updated":"2018-05-14 18:32:47.000000000","message":"We should mention this is an overwrite option, not additive, so add \"All the associated traits will be replaced by the traits specified.\".","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2fcff1f9670fa561dc1ab94ce14f5b6b6527f0de","unresolved":false,"context_lines":[{"line_number":178,"context_line":"class SetResourceProviderTrait(command.Lister):"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    \"\"\"Associate traits with the resource provider identified by {uuid}."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    This command requires at least ``--os-placement-api-version 1.6``."},{"line_number":183,"context_line":"    \"\"\""},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_4f31ac59","line":181,"in_reply_to":"5f7c97a3_6c49165e","updated":"2018-05-14 19:41:02.000000000","message":"Done","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a07ef369a59820906a21a075a860e9bcdf7fcd2a","unresolved":false,"context_lines":[{"line_number":219,"context_line":"class DeleteResourceProviderTrait(command.Command):"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    \"\"\"Dissociate all the traits from the resource provider."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    This command requires at least ``--os-placement-api-version 1.6``."},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_8cb27248","line":222,"updated":"2018-05-14 18:32:47.000000000","message":"There is a note in https://developer.openstack.org/api-ref/placement/#delete-resource-provider-traits which I wonder if we should repeat that here somehow. Maybe, \"Note that this command is not atomic if multiple processes are managing traits for the same provider. To atomically remove traits for a given resource provider, use \"openstack resource provider traits set --trait\".","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2fcff1f9670fa561dc1ab94ce14f5b6b6527f0de","unresolved":false,"context_lines":[{"line_number":219,"context_line":"class DeleteResourceProviderTrait(command.Command):"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    \"\"\"Dissociate all the traits from the resource provider."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    This command requires at least ``--os-placement-api-version 1.6``."},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_8f4264aa","line":222,"in_reply_to":"5f7c97a3_8cb27248","updated":"2018-05-14 19:41:02.000000000","message":"Done","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9f5d536059805be345381f51526cc9379643834e","unresolved":false,"context_lines":[{"line_number":219,"context_line":"class DeleteResourceProviderTrait(command.Command):"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    \"\"\"Dissociate all the traits from the resource provider."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    This command requires at least ``--os-placement-api-version 1.6``."},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_cafb6abe","line":222,"in_reply_to":"5f7c97a3_8f4264aa","updated":"2018-05-14 19:47:26.000000000","message":"Nevermind, I guess you can\u0027t do this:\n\n$ openstack resource provider trait set --trait 20ea6bed-1058-49a4-a76d-6d8599586bc5\nusage: openstack resource provider trait set [-h]\n                                             [-f {csv,json,table,value,yaml}]\n                                             [-c COLUMN]\n                                             [--max-width \u003cinteger\u003e]\n                                             [--fit-width] [--print-empty]\n                                             [--noindent]\n                                             [--quote {all,minimal,none,nonnumeric}]\n                                             [--sort-column SORT_COLUMN]\n                                             [--trait \u003ctrait\u003e]\n                                             \u003cuuid\u003e\nopenstack resource provider trait set: error: too few arguments\nstack@rocky:~/osc-placement$ \n\nBecause it thinks the resource provider uuid is the trait --trait value and then it doesn\u0027t have a resource provider uuid argument.","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1057f2ecf4138976fa68b24c712ef0dee5867bb2","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"class DeleteTrait(command.Command):"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    \"\"\"Delete the trait specified by {name}."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    This command requires at least ``--os-placement-api-version 1.6``."},{"line_number":133,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_873ebfbe","line":130,"updated":"2018-05-15 10:53:13.000000000","message":"Deleting a standard trait will result in BadRequest but neither this help message nor the printed error message \"Bad request (HTTP 400)\" helps to understand what happens. \n\nThe API returns a description in the \u0027detail\u0027 field but that is not printed by the CLI.\n\n{\"errors\": [{\"status\": 400, \"request_id\": \"req-01797e6d-bf30-4b61-8eb0-18b56b2943c8\", \n                 \"detail\": \"Cannot delete standard trait HW_NIC_DCB_ETS.\\n\\n   \", \"title\": \"Bad \n                 Request\"}]}\n\nWe described what is a CUSTOM trait in the CreateTrait help message so we either need to print the \u0027detail\u0027 field or add a sentence to the help message that standard traits cannot be deleted.\n\n--- later ---\nIt is actually a placement bug as the \u0027detail\u0027 field is inconsistent across placement API. I filed a bug to fix it https://bugs.launchpad.net/nova/+bug/1771325","commit_id":"8dcc44b2a63549334a1ef455acd3e380b4f58b4b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1057f2ecf4138976fa68b24c712ef0dee5867bb2","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"class ListResourceProviderTrait(command.Lister):"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    \"\"\"Associate traits with the resource provider identified by {uuid}."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    This command requires at least ``--os-placement-api-version 1.6``."},{"line_number":160,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_67712344","line":157,"range":{"start_line":157,"start_character":7,"end_line":157,"end_character":16},"updated":"2018-05-15 10:53:13.000000000","message":"This command just list traits","commit_id":"8dcc44b2a63549334a1ef455acd3e380b4f58b4b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a9c39bc9a66fbf5ed21e66fc21126c57bf09c2b","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"class ListResourceProviderTrait(command.Lister):"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    \"\"\"Associate traits with the resource provider identified by {uuid}."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    This command requires at least ``--os-placement-api-version 1.6``."},{"line_number":160,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_ee4e6895","line":157,"range":{"start_line":157,"start_character":7,"end_line":157,"end_character":16},"in_reply_to":"5f7c97a3_67712344","updated":"2018-05-15 12:37:19.000000000","message":"Done","commit_id":"8dcc44b2a63549334a1ef455acd3e380b4f58b4b"}],"osc_placement/tests/functional/base.py":[{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"0a8f2910e8610bf4dddebb4f2d0cab99fab90534","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        cmd +\u003d \u0027 \u0027.join(\u0027--trait %s\u0027 % trait for trait in traits)"},{"line_number":240,"context_line":"        return self.openstack(cmd, use_json\u003dTrue)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def resource_provider_trait_delete(self, uuid):"},{"line_number":243,"context_line":"        cmd \u003d \u0027resource provider trait delete %s \u0027 % uuid"},{"line_number":244,"context_line":"        self.openstack(cmd)"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf659307_4d8d922f","line":242,"range":{"start_line":242,"start_character":8,"end_line":242,"end_character":38},"updated":"2018-04-10 10:08:53.000000000","message":"We need add some test case for ``resource provider trait delete ``.","commit_id":"9cb41ce383e7a962ef871d0f582e5defe2720f63"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"958c86b13835157172ed5f868f21f080cc1ad8ae","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        cmd +\u003d \u0027 \u0027.join(\u0027--trait %s\u0027 % trait for trait in traits)"},{"line_number":240,"context_line":"        return self.openstack(cmd, use_json\u003dTrue)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def resource_provider_trait_delete(self, uuid):"},{"line_number":243,"context_line":"        cmd \u003d \u0027resource provider trait delete %s \u0027 % uuid"},{"line_number":244,"context_line":"        self.openstack(cmd)"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf659307_f979a8fb","line":242,"range":{"start_line":242,"start_character":8,"end_line":242,"end_character":38},"in_reply_to":"bf659307_4d8d922f","updated":"2018-04-11 09:39:24.000000000","message":"Why you don\u0027t like test_delete_trait? ) or I didn\u0027t get your comment.","commit_id":"9cb41ce383e7a962ef871d0f582e5defe2720f63"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"0ea909be03430ae1b1e4340cd2b13521144448a5","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        cmd +\u003d \u0027 \u0027.join(\u0027--trait %s\u0027 % trait for trait in traits)"},{"line_number":240,"context_line":"        return self.openstack(cmd, use_json\u003dTrue)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def resource_provider_trait_delete(self, uuid):"},{"line_number":243,"context_line":"        cmd \u003d \u0027resource provider trait delete %s \u0027 % uuid"},{"line_number":244,"context_line":"        self.openstack(cmd)"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf659307_54c3b957","line":242,"range":{"start_line":242,"start_character":8,"end_line":242,"end_character":38},"in_reply_to":"bf659307_f979a8fb","updated":"2018-04-11 10:16:12.000000000","message":"Sorry, LOL, I misread it, I regard it a function which we need add some unit test. But it just a test helper, so just ignore my previous comment!","commit_id":"9cb41ce383e7a962ef871d0f582e5defe2720f63"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a07ef369a59820906a21a075a860e9bcdf7fcd2a","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                             use_json\u003dTrue)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        def cleanup():"},{"line_number":74,"context_line":"            # TODO(avolkov): placement should delete trait accociations"},{"line_number":75,"context_line":"            # automatically"},{"line_number":76,"context_line":"            if self.VERSION and version.compare("},{"line_number":77,"context_line":"                    self.VERSION, version.ge(\u00271.6\u0027), exc\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_8ce03228","line":74,"updated":"2018-05-14 18:32:47.000000000","message":"This is already resolved:\n\nhttps://review.openstack.org/#/c/516880/","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2fcff1f9670fa561dc1ab94ce14f5b6b6527f0de","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                             use_json\u003dTrue)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        def cleanup():"},{"line_number":74,"context_line":"            # TODO(avolkov): placement should delete trait accociations"},{"line_number":75,"context_line":"            # automatically"},{"line_number":76,"context_line":"            if self.VERSION and version.compare("},{"line_number":77,"context_line":"                    self.VERSION, version.ge(\u00271.6\u0027), exc\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_cf25bc0a","line":74,"in_reply_to":"5f7c97a3_8ce03228","updated":"2018-05-14 19:41:02.000000000","message":"Done","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2fcff1f9670fa561dc1ab94ce14f5b6b6527f0de","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        cmd +\u003d \u0027 \u0027.join(\u0027--trait %s\u0027 % trait for trait in traits)"},{"line_number":239,"context_line":"        return self.openstack(cmd, use_json\u003dTrue)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    def resource_provider_trait_delete(self, uuid):"},{"line_number":242,"context_line":"        cmd \u003d \u0027resource provider trait delete %s \u0027 % uuid"},{"line_number":243,"context_line":"        self.openstack(cmd)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_0fa17446","line":241,"range":{"start_line":241,"start_character":8,"end_line":241,"end_character":38},"updated":"2018-05-14 19:41:02.000000000","message":"This is never used so it\u0027s never tested.","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"}],"osc_placement/tests/functional/test_trait.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a07ef369a59820906a21a075a860e9bcdf7fcd2a","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        self.assertIn(TRAIT,"},{"line_number":33,"context_line":"                      {t[\u0027name\u0027] for t in self.trait_list(associated\u003dTrue)})"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_list_traits_startswith(self):"},{"line_number":36,"context_line":"        self.trait_create(TRAIT)"},{"line_number":37,"context_line":"        rp \u003d self.resource_provider_create()"},{"line_number":38,"context_line":"        self.resource_provider_trait_set("}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_ec58c6fa","line":35,"range":{"start_line":35,"start_character":8,"end_line":35,"end_character":35},"updated":"2018-05-14 18:32:47.000000000","message":"We could have a negative test for this also to do something --name\u003dstartswith:CUSTOM_FOO and assert nothing is returned.","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2fcff1f9670fa561dc1ab94ce14f5b6b6527f0de","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        self.assertIn(TRAIT,"},{"line_number":33,"context_line":"                      {t[\u0027name\u0027] for t in self.trait_list(associated\u003dTrue)})"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_list_traits_startswith(self):"},{"line_number":36,"context_line":"        self.trait_create(TRAIT)"},{"line_number":37,"context_line":"        rp \u003d self.resource_provider_create()"},{"line_number":38,"context_line":"        self.resource_provider_trait_set("}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_8fdee4d7","line":35,"range":{"start_line":35,"start_character":8,"end_line":35,"end_character":35},"in_reply_to":"5f7c97a3_ec58c6fa","updated":"2018-05-14 19:41:02.000000000","message":"Done","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a07ef369a59820906a21a075a860e9bcdf7fcd2a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    def test_list_traits_startswith(self):"},{"line_number":36,"context_line":"        self.trait_create(TRAIT)"},{"line_number":37,"context_line":"        rp \u003d self.resource_provider_create()"},{"line_number":38,"context_line":"        self.resource_provider_trait_set("},{"line_number":39,"context_line":"            rp[\u0027uuid\u0027], TRAIT)"},{"line_number":40,"context_line":"        traits \u003d {t[\u0027name\u0027] for t in self.trait_list("},{"line_number":41,"context_line":"            name\u003d\u0027startswith:\u0027 + TRAIT)}"},{"line_number":42,"context_line":"        self.assertEqual(1, len(traits))"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_cc486a2e","line":39,"range":{"start_line":38,"start_character":8,"end_line":39,"end_character":30},"updated":"2018-05-14 18:32:47.000000000","message":"nit: this can go on one line","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2fcff1f9670fa561dc1ab94ce14f5b6b6527f0de","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    def test_list_traits_startswith(self):"},{"line_number":36,"context_line":"        self.trait_create(TRAIT)"},{"line_number":37,"context_line":"        rp \u003d self.resource_provider_create()"},{"line_number":38,"context_line":"        self.resource_provider_trait_set("},{"line_number":39,"context_line":"            rp[\u0027uuid\u0027], TRAIT)"},{"line_number":40,"context_line":"        traits \u003d {t[\u0027name\u0027] for t in self.trait_list("},{"line_number":41,"context_line":"            name\u003d\u0027startswith:\u0027 + TRAIT)}"},{"line_number":42,"context_line":"        self.assertEqual(1, len(traits))"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_2ff31076","line":39,"range":{"start_line":38,"start_character":8,"end_line":39,"end_character":30},"in_reply_to":"5f7c97a3_cc486a2e","updated":"2018-05-14 19:41:02.000000000","message":"Done","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a07ef369a59820906a21a075a860e9bcdf7fcd2a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        self.assertEqual(1, len(traits))"},{"line_number":43,"context_line":"        self.assertIn(TRAIT, traits)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def test_list_traits_in(self):"},{"line_number":46,"context_line":"        self.trait_create(TRAIT)"},{"line_number":47,"context_line":"        rp \u003d self.resource_provider_create()"},{"line_number":48,"context_line":"        self.resource_provider_trait_set(rp[\u0027uuid\u0027], TRAIT)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_cc714a78","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":27},"updated":"2018-05-14 18:32:47.000000000","message":"Could have a negative test for this also where we do --name\u003din:CUSTOM_FOO and assert nothing is returned.","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2fcff1f9670fa561dc1ab94ce14f5b6b6527f0de","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        self.assertEqual(1, len(traits))"},{"line_number":43,"context_line":"        self.assertIn(TRAIT, traits)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def test_list_traits_in(self):"},{"line_number":46,"context_line":"        self.trait_create(TRAIT)"},{"line_number":47,"context_line":"        rp \u003d self.resource_provider_create()"},{"line_number":48,"context_line":"        self.resource_provider_trait_set(rp[\u0027uuid\u0027], TRAIT)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f7c97a3_4ff68c65","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":27},"in_reply_to":"5f7c97a3_cc714a78","updated":"2018-05-14 19:41:02.000000000","message":"Done","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1057f2ecf4138976fa68b24c712ef0dee5867bb2","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        rp \u003d self.resource_provider_create()"},{"line_number":38,"context_line":"        self.resource_provider_trait_set(rp[\u0027uuid\u0027], TRAIT)"},{"line_number":39,"context_line":"        traits \u003d {t[\u0027name\u0027] for t in self.trait_list("},{"line_number":40,"context_line":"            name\u003d\u0027startswith:\u0027 + TRAIT)}"},{"line_number":41,"context_line":"        self.assertEqual(1, len(traits))"},{"line_number":42,"context_line":"        self.assertIn(TRAIT, traits)"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_47aae718","line":40,"range":{"start_line":40,"start_character":33,"end_line":40,"end_character":38},"updated":"2018-05-15 10:53:13.000000000","message":"nit: TRAIT[0:-1] might be a real prefix to search for","commit_id":"8dcc44b2a63549334a1ef455acd3e380b4f58b4b"}],"releasenotes/notes/microversion-1.6-54a85ef9ae79f15d.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a07ef369a59820906a21a075a860e9bcdf7fcd2a","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    .. _1.6: https://docs.openstack.org/nova/latest/user/placement.html#traits-api"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    .. __: https://docs.openstack.org/osc-placement/latest/cli/index.html##trait-list"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5f7c97a3_cce4ea0f","line":17,"range":{"start_line":17,"start_character":73,"end_line":17,"end_character":75},"updated":"2018-05-14 18:32:47.000000000","message":"One too many hash marks.","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a07ef369a59820906a21a075a860e9bcdf7fcd2a","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    .. _1.6: https://docs.openstack.org/nova/latest/user/placement.html#traits-api"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    .. __: https://docs.openstack.org/osc-placement/latest/cli/index.html##trait-list"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5f7c97a3_4cc21a5b","line":17,"range":{"start_line":17,"start_character":75,"end_line":17,"end_character":85},"updated":"2018-05-14 18:32:47.000000000","message":"You probably don\u0027t even need this, we should just link to the command list index since there are several commands added here.","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"738f6ff950465d12c3dc1e1d226ca51782fb6ffa","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    .. _1.6: https://docs.openstack.org/nova/latest/user/placement.html#traits-api"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    .. __: https://docs.openstack.org/osc-placement/latest/cli/index.html##trait-list"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5f7c97a3_eadae675","line":17,"range":{"start_line":17,"start_character":73,"end_line":17,"end_character":75},"in_reply_to":"5f7c97a3_cce4ea0f","updated":"2018-05-14 19:41:13.000000000","message":"Done","commit_id":"b9461dfe3792711acfb5863cdafb75d2dcdfbee4"}]}
