)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8f5679c9d6a2351b7f045f9e001fea1c6d6ea622","unresolved":false,"context_lines":[{"line_number":2,"context_line":"Author:     Roman Podoliaka \u003crpodolyaka@mirantis.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2017-04-12 19:04:05 +0300"},{"line_number":4,"context_line":"Commit:     Andrey Volkov \u003cavolkov@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-10-24 15:37:14 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"CLI for inventories"},{"line_number":8,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3f4b6375_5091af4d","line":5,"updated":"2017-10-24 14:12:13.000000000","message":"The commit message should describe the syntax being added.","commit_id":"d6e223a191e51333426fa8d8e9d85b2a0b4fc77f"}],"osc_placement/resources/inventory.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9d5c5fc02a87c5407c070739909133f354bfa015","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"7ffa3b31_28e01296","updated":"2017-04-19 12:06:31.000000000","message":"There\u0027s also PUT /resource_providers/{uuid}/inventories (for setting all the inventories of all resource classes on one resource provider) but that might be hard to express on the command line, so using the single POST one may be best.\n\nv 1.5 adds delete all inventories on .../inventories","commit_id":"2407701f2b1fe9e5098e3651b4cfdb293a190e07"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"724b4c3109efce71081372e0d622aa283d1eef61","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"7ffa3b31_063f5eb4","in_reply_to":"7ffa3b31_28e01296","updated":"2017-04-20 13:36:13.000000000","message":"Agreed. This targets only 1.0 for now, but let\u0027s not forget about this PUT . Thanks!","commit_id":"2407701f2b1fe9e5098e3651b4cfdb293a190e07"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77f07cdba6571089f3ad1f267f183ec6582d0c56","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from osc_lib import utils"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"BASE_URL \u003d \u0027/resource_providers/{uuid}/inventories\u0027"},{"line_number":18,"context_line":"PER_CLASS_URL \u003d BASE_URL + \u0027/{resource_class}\u0027"},{"line_number":19,"context_line":"FIELDS \u003d (\u0027allocation_ratio\u0027, \u0027min_unit\u0027, \u0027max_unit\u0027, \u0027reserved\u0027,"},{"line_number":20,"context_line":"          \u0027step_size\u0027, \u0027total\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_8284d00d","line":17,"updated":"2017-10-11 19:38:35.000000000","message":"You\u0027re missing PUT /resource_providers/{uuid}/inventories and DELETE /resource_providers/{uuid}/inventories in here - did you plan on adding those later? If so, leave a TODO.\n\nNote that DELETE /resource_providers/{uuid}/inventories requires microversion 1.5 and I think we said we\u0027re holding off on adding anything that requires a higher microversion to start.","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"4b04031f96090b59ad3d9056fcb4c15a2102cc44","unresolved":false,"context_lines":[{"line_number":14,"context_line":"from osc_lib import utils"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"BASE_URL \u003d \u0027/resource_providers/{uuid}/inventories\u0027"},{"line_number":18,"context_line":"PER_CLASS_URL \u003d BASE_URL + \u0027/{resource_class}\u0027"},{"line_number":19,"context_line":"FIELDS \u003d (\u0027allocation_ratio\u0027, \u0027min_unit\u0027, \u0027max_unit\u0027, \u0027reserved\u0027,"},{"line_number":20,"context_line":"          \u0027step_size\u0027, \u0027total\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_490c3ca4","line":17,"in_reply_to":"5f4e5783_8284d00d","updated":"2017-10-17 08:44:43.000000000","message":"Added TODO for DELETE in version 1.5.","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77f07cdba6571089f3ad1f267f183ec6582d0c56","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            help\u003d\u0027UUID of the resource provider\u0027"},{"line_number":33,"context_line":"        )"},{"line_number":34,"context_line":"        parser.add_argument("},{"line_number":35,"context_line":"            \u0027--resource-class\u0027,"},{"line_number":36,"context_line":"            metavar\u003d\u0027\u003cclass\u003e\u0027,"},{"line_number":37,"context_line":"            required\u003dTrue,"},{"line_number":38,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_c2840861","line":35,"updated":"2017-10-11 19:38:35.000000000","message":"Add a help string for this? Like:\n\n\"Resource classes are entities that indicate standard or deployer-specific resources that can be provided by a resource provider. For example, MEMORY_MB.\"\n\nMaybe we should implement GET /resource_classes first...","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"4b04031f96090b59ad3d9056fcb4c15a2102cc44","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            help\u003d\u0027UUID of the resource provider\u0027"},{"line_number":33,"context_line":"        )"},{"line_number":34,"context_line":"        parser.add_argument("},{"line_number":35,"context_line":"            \u0027--resource-class\u0027,"},{"line_number":36,"context_line":"            metavar\u003d\u0027\u003cclass\u003e\u0027,"},{"line_number":37,"context_line":"            required\u003dTrue,"},{"line_number":38,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_e96f6828","line":35,"in_reply_to":"5f4e5783_c2840861","updated":"2017-10-17 08:44:43.000000000","message":"Done with help sting.\nresource classes are in 1.2 so I still think it needs to be done later, but I mentioned standard classes in the help text \nto make it easier start to work after help reading.","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77f07cdba6571089f3ad1f267f183ec6582d0c56","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            metavar\u003d\u0027\u003cclass\u003e\u0027,"},{"line_number":37,"context_line":"            required\u003dTrue,"},{"line_number":38,"context_line":"        )"},{"line_number":39,"context_line":"        parser.add_argument("},{"line_number":40,"context_line":"            \u0027--total\u0027,"},{"line_number":41,"context_line":"            metavar\u003d\u0027\u003ctotal\u003e\u0027,"},{"line_number":42,"context_line":"            required\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_82f3b00a","line":39,"updated":"2017-10-11 19:38:35.000000000","message":"Add help: \"The actual amount of the resource that the provider can accommodate.\"","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"4b04031f96090b59ad3d9056fcb4c15a2102cc44","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            metavar\u003d\u0027\u003cclass\u003e\u0027,"},{"line_number":37,"context_line":"            required\u003dTrue,"},{"line_number":38,"context_line":"        )"},{"line_number":39,"context_line":"        parser.add_argument("},{"line_number":40,"context_line":"            \u0027--total\u0027,"},{"line_number":41,"context_line":"            metavar\u003d\u0027\u003ctotal\u003e\u0027,"},{"line_number":42,"context_line":"            required\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_a975f0fb","line":39,"in_reply_to":"5f4e5783_82f3b00a","updated":"2017-10-17 08:44:43.000000000","message":"Done","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77f07cdba6571089f3ad1f267f183ec6582d0c56","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            type\u003dint,"},{"line_number":44,"context_line":"        )"},{"line_number":45,"context_line":"        parser.add_argument("},{"line_number":46,"context_line":"            \u0027--reserved\u0027,"},{"line_number":47,"context_line":"            metavar\u003d\u0027\u003creserved\u003e\u0027,"},{"line_number":48,"context_line":"            type\u003dint,"},{"line_number":49,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_22d87c7d","line":46,"updated":"2017-10-11 19:38:35.000000000","message":"help\u003d\"The amount of the resource a provider has reserved for its own use.\"","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"4b04031f96090b59ad3d9056fcb4c15a2102cc44","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            type\u003dint,"},{"line_number":44,"context_line":"        )"},{"line_number":45,"context_line":"        parser.add_argument("},{"line_number":46,"context_line":"            \u0027--reserved\u0027,"},{"line_number":47,"context_line":"            metavar\u003d\u0027\u003creserved\u003e\u0027,"},{"line_number":48,"context_line":"            type\u003dint,"},{"line_number":49,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_8970f409","line":46,"in_reply_to":"5f4e5783_22d87c7d","updated":"2017-10-17 08:44:43.000000000","message":"Done","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77f07cdba6571089f3ad1f267f183ec6582d0c56","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            type\u003dint,"},{"line_number":49,"context_line":"        )"},{"line_number":50,"context_line":"        parser.add_argument("},{"line_number":51,"context_line":"            \u0027--min-unit\u0027,"},{"line_number":52,"context_line":"            metavar\u003d\u0027\u003cunit\u003e\u0027,"},{"line_number":53,"context_line":"            type\u003dint,"},{"line_number":54,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_a2d58c45","line":51,"updated":"2017-10-11 19:38:35.000000000","message":"help\u003d\"A minimum amount any single allocation against an inventory can have.\"","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"4b04031f96090b59ad3d9056fcb4c15a2102cc44","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            type\u003dint,"},{"line_number":49,"context_line":"        )"},{"line_number":50,"context_line":"        parser.add_argument("},{"line_number":51,"context_line":"            \u0027--min-unit\u0027,"},{"line_number":52,"context_line":"            metavar\u003d\u0027\u003cunit\u003e\u0027,"},{"line_number":53,"context_line":"            type\u003dint,"},{"line_number":54,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_6965b845","line":51,"in_reply_to":"5f4e5783_a2d58c45","updated":"2017-10-17 08:44:43.000000000","message":"Done","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77f07cdba6571089f3ad1f267f183ec6582d0c56","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            type\u003dint,"},{"line_number":54,"context_line":"        )"},{"line_number":55,"context_line":"        parser.add_argument("},{"line_number":56,"context_line":"            \u0027--max-unit\u0027,"},{"line_number":57,"context_line":"            metavar\u003d\u0027\u003cunit\u003e\u0027,"},{"line_number":58,"context_line":"            type\u003dint,"},{"line_number":59,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_82ccd0bc","line":56,"updated":"2017-10-11 19:38:35.000000000","message":"help\u003d\"A maximum amount any single allocation against an inventory can have.\"","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"4b04031f96090b59ad3d9056fcb4c15a2102cc44","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            type\u003dint,"},{"line_number":54,"context_line":"        )"},{"line_number":55,"context_line":"        parser.add_argument("},{"line_number":56,"context_line":"            \u0027--max-unit\u0027,"},{"line_number":57,"context_line":"            metavar\u003d\u0027\u003cunit\u003e\u0027,"},{"line_number":58,"context_line":"            type\u003dint,"},{"line_number":59,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_4968bc1b","line":56,"in_reply_to":"5f4e5783_82ccd0bc","updated":"2017-10-17 08:44:43.000000000","message":"Done","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77f07cdba6571089f3ad1f267f183ec6582d0c56","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            type\u003dint,"},{"line_number":59,"context_line":"        )"},{"line_number":60,"context_line":"        parser.add_argument("},{"line_number":61,"context_line":"            \u0027--step-size\u0027,"},{"line_number":62,"context_line":"            metavar\u003d\u0027\u003csize\u003e\u0027,"},{"line_number":63,"context_line":"            type\u003dint,"},{"line_number":64,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_62cf94b0","line":61,"updated":"2017-10-11 19:38:35.000000000","message":"help\u003d\"A representation of the divisible amount of the resource that may be requested. For example, step_size \u003d 5 means that only values divisible by 5 (5, 10, 15, etc.) can be requested.\"","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"4b04031f96090b59ad3d9056fcb4c15a2102cc44","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            type\u003dint,"},{"line_number":59,"context_line":"        )"},{"line_number":60,"context_line":"        parser.add_argument("},{"line_number":61,"context_line":"            \u0027--step-size\u0027,"},{"line_number":62,"context_line":"            metavar\u003d\u0027\u003csize\u003e\u0027,"},{"line_number":63,"context_line":"            type\u003dint,"},{"line_number":64,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_095e4475","line":61,"in_reply_to":"5f4e5783_62cf94b0","updated":"2017-10-17 08:44:43.000000000","message":"Done","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77f07cdba6571089f3ad1f267f183ec6582d0c56","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            type\u003dint,"},{"line_number":64,"context_line":"        )"},{"line_number":65,"context_line":"        parser.add_argument("},{"line_number":66,"context_line":"            \u0027--allocation-ratio\u0027,"},{"line_number":67,"context_line":"            metavar\u003d\u0027\u003cratio\u003e\u0027,"},{"line_number":68,"context_line":"            type\u003dfloat,"},{"line_number":69,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_02c0e07a","line":66,"updated":"2017-10-11 19:38:35.000000000","message":"help\u003d\"It is used in determining whether consumption of the resource of the provider can exceed physical constraints.\n\nFor example, for a vCPU resource with:\n\nallocation_ratio \u003d 16.0\ntotal \u003d 8\n\nOverall capacity is equal to 128 vCPUs.\"","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"4b04031f96090b59ad3d9056fcb4c15a2102cc44","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            type\u003dint,"},{"line_number":64,"context_line":"        )"},{"line_number":65,"context_line":"        parser.add_argument("},{"line_number":66,"context_line":"            \u0027--allocation-ratio\u0027,"},{"line_number":67,"context_line":"            metavar\u003d\u0027\u003cratio\u003e\u0027,"},{"line_number":68,"context_line":"            type\u003dfloat,"},{"line_number":69,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_e9588888","line":66,"in_reply_to":"5f4e5783_02c0e07a","updated":"2017-10-17 08:44:43.000000000","message":"Done","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"659328bc36d01c438210bbfe63ea134efd86d5a0","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        return parser"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def take_action(self, parsed_args):"},{"line_number":108,"context_line":"        http \u003d self.app.client_manager.placement"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        url \u003d PER_CLASS_URL.format(uuid\u003dparsed_args.uuid,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_2ae72e43","line":107,"updated":"2017-10-11 22:53:49.000000000","message":"I think we might have a bug here?\n\nI created some PCI_DEVICE inventory for my only resource provider (single node devstack):\n\nhttp://paste.openstack.org/show/623387/\n\nAnd then I went to delete the PCI_DEVICE inventory and it looks like it deleted it but it gave me an error:\n\nstack@devstack:~/osc-placement$ openstack resource provider inventory delete 4d968548-1dff-4481-8593-8d979c9b18b7 PCI_DEVICE\nNo inventory of class PCI_DEVICE found for delete: No inventory of class PCI_DEVICE found for delete (HTTP 404)\nstack@devstack:~/osc-placement$ openstack resource provider inventory list 4d968548-1dff-4481-8593-8d979c9b18b7                                                          +----------------+------------------+----------+----------+----------+-----------+--------+\n| resource_class | allocation_ratio | min_unit | max_unit | reserved | step_size |  total |\n+----------------+------------------+----------+----------+----------+-----------+--------+\n| VCPU           |             16.0 |        1 |     1000 |        0 |         1 |   1000 |\n| MEMORY_MB      |              1.5 |        1 |   800000 |      512 |         1 | 800000 |\n| DISK_GB        |              1.0 |        1 |   600000 |        0 |         1 | 600000 |\n+----------------+------------------+----------+----------+----------+-----------+--------+","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"435e67fcf3783fcbee78ae58f87f0019e7f29ca0","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        return parser"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def take_action(self, parsed_args):"},{"line_number":108,"context_line":"        http \u003d self.app.client_manager.placement"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        url \u003d PER_CLASS_URL.format(uuid\u003dparsed_args.uuid,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_ca3ada96","line":107,"in_reply_to":"5f4e5783_2ae72e43","updated":"2017-10-11 22:55:38.000000000","message":"I tried again and this time I couldn\u0027t recreate it:\n\nstack@devstack:~/osc-placement$ openstack resource provider inventory create 4d968548-1dff-4481-8593-8d979c9b18b7 --resource-class PCI_DEVICE --total 8                  +------------------+------------+\n| Field            | Value      |\n+------------------+------------+\n| allocation_ratio | 1.0        |\n| min_unit         | 1          |\n| max_unit         | 2147483647 |\n| reserved         | 0          |\n| step_size        | 1          |\n| total            | 8          |\n+------------------+------------+\nstack@devstack:~/osc-placement$ openstack resource provider inventory list 4d968548-1dff-4481-8593-8d979c9b18b7\n+----------------+------------------+----------+------------+----------+-----------+--------+\n| resource_class | allocation_ratio | min_unit |   max_unit | reserved | step_size |  total |\n+----------------+------------------+----------+------------+----------+-----------+--------+\n| VCPU           |             16.0 |        1 |       1000 |        0 |         1 |   1000 |\n| MEMORY_MB      |              1.5 |        1 |     800000 |      512 |         1 | 800000 |\n| PCI_DEVICE     |              1.0 |        1 | 2147483647 |        0 |         1 |      8 |\n| DISK_GB        |              1.0 |        1 |     600000 |        0 |         1 | 600000 |\n+----------------+------------------+----------+------------+----------+-----------+--------+\nstack@devstack:~/osc-placement$ openstack resource provider inventory delete 4d968548-1dff-4481-8593-8d979c9b18b7 PCI_DEVICE\nstack@devstack:~/osc-placement$ openstack resource provider inventory list 4d968548-1dff-4481-8593-8d979c9b18b7\n+----------------+------------------+----------+----------+----------+-----------+--------+\n| resource_class | allocation_ratio | min_unit | max_unit | reserved | step_size |  total |\n+----------------+------------------+----------+----------+----------+-----------+--------+\n| VCPU           |             16.0 |        1 |     1000 |        0 |         1 |   1000 |\n| MEMORY_MB      |              1.5 |        1 |   800000 |      512 |         1 | 800000 |\n| DISK_GB        |              1.0 |        1 |   600000 |        0 |         1 | 600000 |\n+----------------+------------------+----------+----------+----------+-----------+--------+\nstack@devstack:~/osc-placement$","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"7b5d9cbe23de82182cb137c8dbc9aee4940a3671","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        return parser"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def take_action(self, parsed_args):"},{"line_number":108,"context_line":"        http \u003d self.app.client_manager.placement"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        url \u003d PER_CLASS_URL.format(uuid\u003dparsed_args.uuid,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f4b6375_b9d1795a","line":107,"in_reply_to":"5f4e5783_894914b8","updated":"2017-10-18 15:54:16.000000000","message":"That was wrong, looks like osc_placement.tests.functional.test_inventory.TestInventory.test_inventory_delete does the same thing.","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"4b04031f96090b59ad3d9056fcb4c15a2102cc44","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        return parser"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def take_action(self, parsed_args):"},{"line_number":108,"context_line":"        http \u003d self.app.client_manager.placement"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        url \u003d PER_CLASS_URL.format(uuid\u003dparsed_args.uuid,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_894914b8","line":107,"in_reply_to":"5f4e5783_ca3ada96","updated":"2017-10-17 08:44:43.000000000","message":"Will add test for that in the resource class patch.","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77f07cdba6571089f3ad1f267f183ec6582d0c56","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        http.request(\u0027DELETE\u0027, url)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class ShowInventory(command.ShowOne):"},{"line_number":116,"context_line":"    \"\"\"Show the inventory for a given resource provider/class pair\"\"\""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_62b554cd","line":115,"updated":"2017-10-11 19:38:35.000000000","message":"Missing PUT /resource_providers/{uuid}/inventories/{resource_class} - add a TODO for later?","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"4b04031f96090b59ad3d9056fcb4c15a2102cc44","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        http.request(\u0027DELETE\u0027, url)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class ShowInventory(command.ShowOne):"},{"line_number":116,"context_line":"    \"\"\"Show the inventory for a given resource provider/class pair\"\"\""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_e9dd28e0","line":115,"in_reply_to":"5f4e5783_62b554cd","updated":"2017-10-17 08:44:43.000000000","message":"Made implementation.","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"bfcbbaf7840ef8c4c0f0cf30aa486d1dfdcad875","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    \u0027reserved\u0027: {"},{"line_number":45,"context_line":"        \u0027type\u0027: int,"},{"line_number":46,"context_line":"        \u0027required\u0027: False,"},{"line_number":47,"context_line":"        \u0027help\u0027: (\u0027A minimum amount any single allocation against \u0027"},{"line_number":48,"context_line":"                 \u0027an inventory can have.\u0027)"},{"line_number":49,"context_line":"    },"},{"line_number":50,"context_line":"    \u0027step_size\u0027: {"},{"line_number":51,"context_line":"        \u0027type\u0027: int,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_33a56005","line":48,"range":{"start_line":47,"start_character":18,"end_line":48,"end_character":40},"updated":"2017-10-20 22:11:42.000000000","message":"bad copy/paste","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bd1eb24d774213c9c76c170f1f3b203c06e2d585","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    \u0027reserved\u0027: {"},{"line_number":45,"context_line":"        \u0027type\u0027: int,"},{"line_number":46,"context_line":"        \u0027required\u0027: False,"},{"line_number":47,"context_line":"        \u0027help\u0027: (\u0027A minimum amount any single allocation against \u0027"},{"line_number":48,"context_line":"                 \u0027an inventory can have.\u0027)"},{"line_number":49,"context_line":"    },"},{"line_number":50,"context_line":"    \u0027step_size\u0027: {"},{"line_number":51,"context_line":"        \u0027type\u0027: int,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_d7b258e6","line":48,"range":{"start_line":47,"start_character":18,"end_line":48,"end_character":40},"in_reply_to":"3f4b6375_33a56005","updated":"2017-10-23 14:09:10.000000000","message":"Should be: \"The amount of the resource a provider has reserved for its own use.\"","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"d9f38f42b9261188872885195401e742d78ceba6","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    \u0027reserved\u0027: {"},{"line_number":45,"context_line":"        \u0027type\u0027: int,"},{"line_number":46,"context_line":"        \u0027required\u0027: False,"},{"line_number":47,"context_line":"        \u0027help\u0027: (\u0027A minimum amount any single allocation against \u0027"},{"line_number":48,"context_line":"                 \u0027an inventory can have.\u0027)"},{"line_number":49,"context_line":"    },"},{"line_number":50,"context_line":"    \u0027step_size\u0027: {"},{"line_number":51,"context_line":"        \u0027type\u0027: int,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_9bc4ed92","line":48,"range":{"start_line":47,"start_character":18,"end_line":48,"end_character":40},"in_reply_to":"3f4b6375_d7b258e6","updated":"2017-10-24 13:09:08.000000000","message":"Done","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bd1eb24d774213c9c76c170f1f3b203c06e2d585","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    \"\"\"Replaces the set of inventory records for the resource provider."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"       Example: openstack resource provider inventory set \u003cuuid\u003e \\"},{"line_number":76,"context_line":"                  --resource VCPU:16 \\"},{"line_number":77,"context_line":"                  --resource MEMORY_MB:2048 \\"},{"line_number":78,"context_line":"                  --resource MEMORY_MB:step_size:128"},{"line_number":79,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_e987bc60","line":76,"range":{"start_line":76,"start_character":33,"end_line":76,"end_character":34},"updated":"2017-10-23 14:09:10.000000000","message":"I kind of wish this was a \u003d for the single value case. Really anytime we\u0027re assigning a value to something, so even like:\n\nMEMORY_MB:step_size\u003d128\n\nSo the : is only for the resource class namespace and then we have a key\u003dvalue format.\n\nI don\u0027t know if there is precedent for this style in other OSC plugins are not.","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"d9f38f42b9261188872885195401e742d78ceba6","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    \"\"\"Replaces the set of inventory records for the resource provider."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"       Example: openstack resource provider inventory set \u003cuuid\u003e \\"},{"line_number":76,"context_line":"                  --resource VCPU:16 \\"},{"line_number":77,"context_line":"                  --resource MEMORY_MB:2048 \\"},{"line_number":78,"context_line":"                  --resource MEMORY_MB:step_size:128"},{"line_number":79,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_5b68b585","line":76,"range":{"start_line":76,"start_character":33,"end_line":76,"end_character":34},"in_reply_to":"3f4b6375_5f72fee4","updated":"2017-10-24 13:09:08.000000000","message":"Replaced. I like this variant more than with colon.","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff46d00b80ce00571763ecf51eb32d57f19e6d31","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    \"\"\"Replaces the set of inventory records for the resource provider."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"       Example: openstack resource provider inventory set \u003cuuid\u003e \\"},{"line_number":76,"context_line":"                  --resource VCPU:16 \\"},{"line_number":77,"context_line":"                  --resource MEMORY_MB:2048 \\"},{"line_number":78,"context_line":"                  --resource MEMORY_MB:step_size:128"},{"line_number":79,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_5f72fee4","line":76,"range":{"start_line":76,"start_character":33,"end_line":76,"end_character":34},"in_reply_to":"3f4b6375_e987bc60","updated":"2017-10-23 15:34:18.000000000","message":"I asked dtroyer about our options here, and it sounds like there is a KeyValueAction we can use for parsing these types of args:\n\n(9:10:05 AM) mriedem: dtroyer: osc question - there is a kind of namespace formatting avolkov is doing here https://review.openstack.org/#/c/457533/8/osc_placement/resources/inventory.py@76 - i was wondering if there is any guideline or precedent for that kind of thing?\n(9:10:21 AM) mriedem: for this api https://developer.openstack.org/api-ref/placement/#update-resource-provider-inventories\n(9:13:58 AM) dtroyer: mriedem: you mean in the —resource value?\n(9:14:48 AM) mriedem: yeah\n(9:14:49 AM) dtroyer: the OSC way would be using key\u003dvalue pairs, the network APIs use a number of variations on that idea and we have some PArserActions that make it easy to implement now too\n(9:15:02 AM) dtroyer: but in the end, it\u0027s always k\u003dv\n(9:15:11 AM) dtroyer: the lines below your comment have multiple \u0027:\u0027\n(9:15:26 AM) mriedem: right, that\u0027s why i was saying something like VCPU:key\u003dvalue\n(9:15:31 AM) mriedem: and VCPU\u003dvalue\n(9:15:41 AM) dtroyer: so are you thinking that it might be MEMORY_MB:step_size\u003d128 for example there?\n(9:16:44 AM) mriedem: yes\n(9:16:56 AM) mriedem: i think that\u0027s at least better than MEMORY_MB:step_size:128\n(9:17:31 AM) dtroyer: yes, everything on the righthand side is an opaque key to the parser then even if it looks different to us\n(9:33:03 AM) mriedem: dtroyer: what\u0027s the parser action to deal with stuff like this?\n(9:42:42 AM) dtroyer: osc-lib as a couple, KeyValueAction (single k\u003dv argument), MultiKeyValueAction (list of k\u003dv,k\u003dv arguments) and MultiKeyValueCommaAction (list of k\u003dv1,v2,kz\u003dvz that I think is confusing to users).  KeyValueAction looks like what is needed here\n(9:43:16 AM) dtroyer: is what OSc uses in all —property options","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bd1eb24d774213c9c76c170f1f3b203c06e2d585","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        parser.add_argument("},{"line_number":93,"context_line":"            \u0027--resource\u0027,"},{"line_number":94,"context_line":"            metavar\u003d\u0027\u003cresource\u003e\u0027,"},{"line_number":95,"context_line":"            help\u003d(\u0027String desribing resource.\\n\u0027"},{"line_number":96,"context_line":"                  \u0027Format: \u003cresource_class\u003e:\u003cproperty\u003e:\u003cvalue\u003e or \u0027"},{"line_number":97,"context_line":"                  \u0027\u003cresource_class\u003e:\u003cvalue\u003e.\\n\u0027"},{"line_number":98,"context_line":"                  \u0027\u0027 + RC_HELP + \u0027\\n\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_37d64cf3","line":95,"range":{"start_line":95,"start_character":26,"end_line":95,"end_character":35},"updated":"2017-10-23 14:09:10.000000000","message":"describing","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"d9f38f42b9261188872885195401e742d78ceba6","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        parser.add_argument("},{"line_number":93,"context_line":"            \u0027--resource\u0027,"},{"line_number":94,"context_line":"            metavar\u003d\u0027\u003cresource\u003e\u0027,"},{"line_number":95,"context_line":"            help\u003d(\u0027String desribing resource.\\n\u0027"},{"line_number":96,"context_line":"                  \u0027Format: \u003cresource_class\u003e:\u003cproperty\u003e:\u003cvalue\u003e or \u0027"},{"line_number":97,"context_line":"                  \u0027\u003cresource_class\u003e:\u003cvalue\u003e.\\n\u0027"},{"line_number":98,"context_line":"                  \u0027\u0027 + RC_HELP + \u0027\\n\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_3b0739cd","line":95,"range":{"start_line":95,"start_character":26,"end_line":95,"end_character":35},"in_reply_to":"3f4b6375_37d64cf3","updated":"2017-10-24 13:09:08.000000000","message":"Done","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"bfcbbaf7840ef8c4c0f0cf30aa486d1dfdcad875","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                name, value \u003d parts"},{"line_number":113,"context_line":"                field \u003d \u0027total\u0027"},{"line_number":114,"context_line":"            elif len(parts) \u003d\u003d 3:"},{"line_number":115,"context_line":"                name, field, value \u003d r.split(\u0027:\u0027)"},{"line_number":116,"context_line":"            else:"},{"line_number":117,"context_line":"                raise ValueError(\u0027Invalid resource format\u0027)"},{"line_number":118,"context_line":"            if field not in INVENTORY_FIELDS:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_b391509c","line":115,"range":{"start_line":115,"start_character":37,"end_line":115,"end_character":49},"updated":"2017-10-20 22:11:42.000000000","message":"parts","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"d9f38f42b9261188872885195401e742d78ceba6","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                name, value \u003d parts"},{"line_number":113,"context_line":"                field \u003d \u0027total\u0027"},{"line_number":114,"context_line":"            elif len(parts) \u003d\u003d 3:"},{"line_number":115,"context_line":"                name, field, value \u003d r.split(\u0027:\u0027)"},{"line_number":116,"context_line":"            else:"},{"line_number":117,"context_line":"                raise ValueError(\u0027Invalid resource format\u0027)"},{"line_number":118,"context_line":"            if field not in INVENTORY_FIELDS:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_bbfa09ba","line":115,"range":{"start_line":115,"start_character":37,"end_line":115,"end_character":49},"in_reply_to":"3f4b6375_b391509c","updated":"2017-10-24 13:09:08.000000000","message":"Done","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"bfcbbaf7840ef8c4c0f0cf30aa486d1dfdcad875","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            else:"},{"line_number":117,"context_line":"                raise ValueError(\u0027Invalid resource format\u0027)"},{"line_number":118,"context_line":"            if field not in INVENTORY_FIELDS:"},{"line_number":119,"context_line":"                raise ValueError(\u0027Unknown inventory field\u0027)"},{"line_number":120,"context_line":"            value \u003d INVENTORY_FIELDS[field][\u0027type\u0027](value)"},{"line_number":121,"context_line":"            inventories[name][field] \u003d value"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_13f6e4fa","line":119,"range":{"start_line":119,"start_character":34,"end_line":119,"end_character":57},"updated":"2017-10-20 22:11:42.000000000","message":"Show the invalid field name please","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"d9f38f42b9261188872885195401e742d78ceba6","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            else:"},{"line_number":117,"context_line":"                raise ValueError(\u0027Invalid resource format\u0027)"},{"line_number":118,"context_line":"            if field not in INVENTORY_FIELDS:"},{"line_number":119,"context_line":"                raise ValueError(\u0027Unknown inventory field\u0027)"},{"line_number":120,"context_line":"            value \u003d INVENTORY_FIELDS[field][\u0027type\u0027](value)"},{"line_number":121,"context_line":"            inventories[name][field] \u003d value"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_7b0011ac","line":119,"range":{"start_line":119,"start_character":34,"end_line":119,"end_character":57},"in_reply_to":"3f4b6375_13f6e4fa","updated":"2017-10-24 13:09:08.000000000","message":"Done","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"bfcbbaf7840ef8c4c0f0cf30aa486d1dfdcad875","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"class SetClassInventory(command.ShowOne):"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    \"\"\"Replace the inventory record of the class for the resource provider.\"\"\""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def get_parser(self, prog_name):"},{"line_number":148,"context_line":"        parser \u003d super(SetClassInventory, self).get_parser(prog_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_33cc40bb","line":145,"range":{"start_line":145,"start_character":4,"end_line":145,"end_character":78},"updated":"2017-10-20 22:11:42.000000000","message":"how \u0027bout some nice examples like in the last docstring?","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"d9f38f42b9261188872885195401e742d78ceba6","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"class SetClassInventory(command.ShowOne):"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    \"\"\"Replace the inventory record of the class for the resource provider.\"\"\""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def get_parser(self, prog_name):"},{"line_number":148,"context_line":"        parser \u003d super(SetClassInventory, self).get_parser(prog_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_3b30599f","line":145,"range":{"start_line":145,"start_character":4,"end_line":145,"end_character":78},"in_reply_to":"3f4b6375_33cc40bb","updated":"2017-10-24 13:09:08.000000000","message":"Done","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a3b277004e78233a9d8907ec8408a9e225563837","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    },"},{"line_number":58,"context_line":"    \u0027total\u0027: {"},{"line_number":59,"context_line":"        \u0027type\u0027: int,"},{"line_number":60,"context_line":"        \u0027required\u0027: False,"},{"line_number":61,"context_line":"        \u0027help\u0027: (\u0027The actual amount of the resource that the provider \u0027"},{"line_number":62,"context_line":"                 \u0027can accommodate.\u0027)"},{"line_number":63,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff82abbf_b3898427","line":60,"range":{"start_line":60,"start_character":20,"end_line":60,"end_character":25},"updated":"2017-11-20 16:08:40.000000000","message":"This is required and it\u0027s why I\u0027m failing when I do:\n\nopenstack resource provider class set $RP_UUID VCPU\n\nwithout a total.","commit_id":"d6e223a191e51333426fa8d8e9d85b2a0b4fc77f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"88f492d87b33ff41b7422e2171f7ccba09905d4c","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    }"},{"line_number":64,"context_line":"}"},{"line_number":65,"context_line":"FIELDS \u003d tuple(INVENTORY_FIELDS.keys())"},{"line_number":66,"context_line":"RC_HELP \u003d (\u0027\u003cresource_class\u003e is entity that indicates standard or \u0027"},{"line_number":67,"context_line":"           \u0027deployer-specific resources that can be provided by a resource \u0027"},{"line_number":68,"context_line":"           \u0027provider. For example, VCPU, MEMORY_MB, DISK_GB.\u0027)"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ff82abbf_3369f724","line":66,"range":{"start_line":66,"start_character":32,"end_line":66,"end_character":38},"updated":"2017-11-20 14:40:40.000000000","message":"an entity","commit_id":"d6e223a191e51333426fa8d8e9d85b2a0b4fc77f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"205a02cdffd9ca5509cd0fdde58e74044f086898","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"class SetInventory(command.Lister):"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    \"\"\"Replaces the set of inventory records for the resource provider."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    Example: openstack resource provider inventory set \u003cuuid\u003e \\"},{"line_number":98,"context_line":"                 --resource VCPU\u003d16 \\"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff82abbf_b0c65a16","line":95,"range":{"start_line":95,"start_character":7,"end_line":95,"end_character":15},"updated":"2017-11-20 15:49:48.000000000","message":"Oh I guess this is a full on replace. I didn\u0027t realize and just wiped out the VCPU/MEMORY_MB and DISK_GB inventory on my single-node compute provider. :(\n\nI wonder if we should put a warning in here? The reason I used this CLI is because I couldn\u0027t add inventory for a new resource class using SetClassInventory, it was complaining that the resource class I was trying to set didn\u0027t have existing inventory, and that\u0027s because I was trying to add that inventory using that CLI. So I had to use this one, but this requires that you provide existing inventory *in addition to* the new stuff, and I missed that part and wiped out my existing inventory.","commit_id":"d6e223a191e51333426fa8d8e9d85b2a0b4fc77f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"205a02cdffd9ca5509cd0fdde58e74044f086898","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            \u0027--resource\u0027,"},{"line_number":117,"context_line":"            metavar\u003d\u0027\u003cresource_class\u003e:\u003cinventory_field\u003e\u003d\u003cvalue\u003e\u0027,"},{"line_number":118,"context_line":"            help\u003d\u0027String describing resource.\\n\u0027 + RC_HELP + \u0027\\n\u0027"},{"line_number":119,"context_line":"                 \u0027\u003cinventory_field\u003e (optional) can be:\\n\u0027 + fields_help,"},{"line_number":120,"context_line":"            default\u003d[],"},{"line_number":121,"context_line":"            action\u003d\u0027append\u0027"},{"line_number":122,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff82abbf_50690e23","line":119,"range":{"start_line":119,"start_character":18,"end_line":119,"end_character":53},"updated":"2017-11-20 15:49:48.000000000","message":"I\u0027m not sure if there is an easy way to also describe that *not* specifying an inventory field assumes that the total will be set, e.g. --resource VCPU\u003d16 is equivalent to --resource VCPU:total\u003d16.","commit_id":"d6e223a191e51333426fa8d8e9d85b2a0b4fc77f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"205a02cdffd9ca5509cd0fdde58e74044f086898","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        for field in FIELDS:"},{"line_number":196,"context_line":"            value \u003d getattr(parsed_args, field, None)"},{"line_number":197,"context_line":"            if value is not None:"},{"line_number":198,"context_line":"                payload[field] \u003d value"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        url \u003d PER_CLASS_URL.format(uuid\u003dparsed_args.uuid,"},{"line_number":201,"context_line":"                                   resource_class\u003dparsed_args.resource_class)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ff82abbf_ce1a6016","line":198,"updated":"2017-11-20 15:49:48.000000000","message":"If an RP UUID and resource class are specified, but no field is, we should fail saying at least one field is required, otherwise you get an ugly error from the server:\n\nstack@queens:~/osc-placement$ openstack resource provider inventory class set 0e87d3e3-a291-40c9-87ae-0b7f3740cade CUSTOM_BAREMETAL_GOLD\nJSON does not validate: \u0027total\u0027 is a required property  Failed validating \u0027required\u0027 in schema:     {\u0027additionalProperties\u0027: False,      \u0027properties\u0027: {\u0027allocation_ratio\u0027: {\u0027maximum\u0027: 3.40282e+38,                                          \u0027type\u0027: \u0027number\u0027},                     \u0027max_unit\u0027: {\u0027maximum\u0027: 2147483647,                                  \u0027minimum\u0027: 1,                                  \u0027type\u0027: \u0027integer\u0027},                     \u0027min_unit\u0027: {\u0027maximum\u0027: 2147483647,                                  \u0027minimum\u0027: 1,                                  \u0027type\u0027: \u0027integer\u0027},                     \u0027reserved\u0027: {\u0027maximum\u0027: 2147483647,                                  \u0027minimum\u0027: 0,                                  \u0027type\u0027: \u0027integer\u0027},                     \u0027resource_provider_generation\u0027: {\u0027type\u0027: \u0027integer\u0027},                     \u0027step_size\u0027: {\u0027maximum\u0027: 2147483647,                                   \u0027minimum\u0027: 1,                                   \u0027type\u0027: \u0027integer\u0027},                     \u0027total\u0027: {\u0027maximum\u0027: 2147483647,                               \u0027minimum\u0027: 1,                               \u0027type\u0027: \u0027integer\u0027}},      \u0027required\u0027: [\u0027total\u0027, \u0027resource_provider_generation\u0027],      \u0027type\u0027: \u0027object\u0027}  On instance:     {u\u0027resource_provider_generation\u0027: 1} (HTTP 400)\n\n\nWe could fix that in a follow up change though.","commit_id":"d6e223a191e51333426fa8d8e9d85b2a0b4fc77f"}],"osc_placement/tests/functional/test_inventory.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77f07cdba6571089f3ad1f267f183ec6582d0c56","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"        self.rp \u003d self.resource_provider_create()"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def test_inventory_set(self):"},{"line_number":27,"context_line":"        rp_uuid \u003d self.rp[\u0027uuid\u0027]"},{"line_number":28,"context_line":"        self.assertEqual([], self.resource_inventory_list(rp_uuid))"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_42fa5875","line":26,"range":{"start_line":26,"start_character":23,"end_line":26,"end_character":26},"updated":"2017-10-11 19:38:35.000000000","message":"set (update) or create?","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"4b04031f96090b59ad3d9056fcb4c15a2102cc44","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"        self.rp \u003d self.resource_provider_create()"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def test_inventory_set(self):"},{"line_number":27,"context_line":"        rp_uuid \u003d self.rp[\u0027uuid\u0027]"},{"line_number":28,"context_line":"        self.assertEqual([], self.resource_inventory_list(rp_uuid))"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_69f37875","line":26,"range":{"start_line":26,"start_character":23,"end_line":26,"end_character":26},"in_reply_to":"5f4e5783_42fa5875","updated":"2017-10-17 08:44:43.000000000","message":"Done","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77f07cdba6571089f3ad1f267f183ec6582d0c56","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self.resource_inventory_create(rp_uuid, **cpu)"},{"line_number":38,"context_line":"        self.assertEqual([cpu], self.resource_inventory_list(rp_uuid))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def test_inventory_set_resource_provider_not_found(self):"},{"line_number":41,"context_line":"        rp_uuid \u003d str(uuid.uuid4())"},{"line_number":42,"context_line":"        error_msg \u003d \u0027No resource provider with uuid {} found\u0027.format(rp_uuid)"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_e2eee4b2","line":40,"range":{"start_line":40,"start_character":23,"end_line":40,"end_character":26},"updated":"2017-10-11 19:38:35.000000000","message":"create","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"4b04031f96090b59ad3d9056fcb4c15a2102cc44","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self.resource_inventory_create(rp_uuid, **cpu)"},{"line_number":38,"context_line":"        self.assertEqual([cpu], self.resource_inventory_list(rp_uuid))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def test_inventory_set_resource_provider_not_found(self):"},{"line_number":41,"context_line":"        rp_uuid \u003d str(uuid.uuid4())"},{"line_number":42,"context_line":"        error_msg \u003d \u0027No resource provider with uuid {} found\u0027.format(rp_uuid)"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_49f67c65","line":40,"range":{"start_line":40,"start_character":23,"end_line":40,"end_character":26},"in_reply_to":"5f4e5783_e2eee4b2","updated":"2017-10-17 08:44:43.000000000","message":"Done","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77f07cdba6571089f3ad1f267f183ec6582d0c56","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                                rp_uuid, \u0027VCPU\u0027)"},{"line_number":47,"context_line":"        self.assertIn(error_msg, exc.output.decode(\u0027utf-8\u0027))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def test_inventory_non_existing_resource_class(self):"},{"line_number":50,"context_line":"        rp_uuid \u003d self.rp[\u0027uuid\u0027]"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        exc \u003d self.assertRaises(subprocess.CalledProcessError,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_a22eacf7","line":49,"range":{"start_line":49,"start_character":13,"end_line":49,"end_character":22},"updated":"2017-10-11 19:38:35.000000000","message":"inventory_create","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"4b04031f96090b59ad3d9056fcb4c15a2102cc44","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                                rp_uuid, \u0027VCPU\u0027)"},{"line_number":47,"context_line":"        self.assertIn(error_msg, exc.output.decode(\u0027utf-8\u0027))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def test_inventory_non_existing_resource_class(self):"},{"line_number":50,"context_line":"        rp_uuid \u003d self.rp[\u0027uuid\u0027]"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        exc \u003d self.assertRaises(subprocess.CalledProcessError,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_09ec048d","line":49,"range":{"start_line":49,"start_character":13,"end_line":49,"end_character":22},"in_reply_to":"5f4e5783_a22eacf7","updated":"2017-10-17 08:44:43.000000000","message":"Done","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77f07cdba6571089f3ad1f267f183ec6582d0c56","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                         sorted(self.resource_inventory_list(rp_uuid),"},{"line_number":81,"context_line":"                                key\u003doperator.itemgetter(\u0027resource_class\u0027)))"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def test_inventory_list_empty(self):"},{"line_number":84,"context_line":"        self.assertEqual([], self.resource_inventory_list(self.rp[\u0027uuid\u0027]))"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def test_inventory_show(self):"},{"line_number":87,"context_line":"        rp_uuid \u003d self.rp[\u0027uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_e24384ae","line":84,"range":{"start_line":83,"start_character":4,"end_line":84,"end_character":75},"updated":"2017-10-11 19:38:35.000000000","message":"This is a redundant test, you\u0027re already asserting this in a couple of tests above.","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"4b04031f96090b59ad3d9056fcb4c15a2102cc44","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                         sorted(self.resource_inventory_list(rp_uuid),"},{"line_number":81,"context_line":"                                key\u003doperator.itemgetter(\u0027resource_class\u0027)))"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def test_inventory_list_empty(self):"},{"line_number":84,"context_line":"        self.assertEqual([], self.resource_inventory_list(self.rp[\u0027uuid\u0027]))"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def test_inventory_show(self):"},{"line_number":87,"context_line":"        rp_uuid \u003d self.rp[\u0027uuid\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_a99170f3","line":84,"range":{"start_line":83,"start_character":4,"end_line":84,"end_character":75},"in_reply_to":"5f4e5783_e24384ae","updated":"2017-10-17 08:44:43.000000000","message":"Removed.","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77f07cdba6571089f3ad1f267f183ec6582d0c56","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        rp_uuid \u003d self.rp[\u0027uuid\u0027]"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        self.resource_inventory_create(rp_uuid, \u0027VCPU\u0027)"},{"line_number":112,"context_line":"        self.resource_inventory_show(rp_uuid, \u0027VCPU\u0027)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        self.resource_inventory_delete(rp_uuid, \u0027VCPU\u0027)"},{"line_number":115,"context_line":"        exc \u003d self.assertRaises(subprocess.CalledProcessError,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_e21ca4c2","line":112,"range":{"start_line":112,"start_character":8,"end_line":112,"end_character":53},"updated":"2017-10-11 19:38:35.000000000","message":"Is this just to make sure the create worked?","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"4b04031f96090b59ad3d9056fcb4c15a2102cc44","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        rp_uuid \u003d self.rp[\u0027uuid\u0027]"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        self.resource_inventory_create(rp_uuid, \u0027VCPU\u0027)"},{"line_number":112,"context_line":"        self.resource_inventory_show(rp_uuid, \u0027VCPU\u0027)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        self.resource_inventory_delete(rp_uuid, \u0027VCPU\u0027)"},{"line_number":115,"context_line":"        exc \u003d self.assertRaises(subprocess.CalledProcessError,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4e5783_e979a8c7","line":112,"range":{"start_line":112,"start_character":8,"end_line":112,"end_character":53},"in_reply_to":"5f4e5783_e21ca4c2","updated":"2017-10-17 08:44:43.000000000","message":"Removed.","commit_id":"cb056003cc04a2b24546b4f1d5709dbd157b6a60"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bd1eb24d774213c9c76c170f1f3b203c06e2d585","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        rp \u003d self.resource_provider_create()"},{"line_number":76,"context_line":"        self.assertEqual([], self.resource_inventory_set(rp[\u0027uuid\u0027], []))"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def test_fail_if_incorrect_resource(self):"},{"line_number":79,"context_line":"        rp \u003d self.resource_provider_create()"},{"line_number":80,"context_line":"        # wrong format"},{"line_number":81,"context_line":"        exc \u003d self.assertRaises(subprocess.CalledProcessError,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_29fef4ad","line":78,"updated":"2017-10-23 14:09:10.000000000","message":"How about \"VCPU:\" to test the split logic? And \"VCPU:max_unit\"?","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"d9f38f42b9261188872885195401e742d78ceba6","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        rp \u003d self.resource_provider_create()"},{"line_number":76,"context_line":"        self.assertEqual([], self.resource_inventory_set(rp[\u0027uuid\u0027], []))"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def test_fail_if_incorrect_resource(self):"},{"line_number":79,"context_line":"        rp \u003d self.resource_provider_create()"},{"line_number":80,"context_line":"        # wrong format"},{"line_number":81,"context_line":"        exc \u003d self.assertRaises(subprocess.CalledProcessError,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_1bda3d4b","line":78,"in_reply_to":"3f4b6375_29fef4ad","updated":"2017-10-24 13:09:08.000000000","message":"Added more cases.","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bd1eb24d774213c9c76c170f1f3b203c06e2d585","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        self.assertIn(\u0027Unknown resource class\u0027, exc.output.decode(\u0027utf-8\u0027))"},{"line_number":126,"context_line":"        self.assertEqual([], self.resource_inventory_set(rp[\u0027uuid\u0027], []))"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def test_replace_previous_values(self):"},{"line_number":129,"context_line":"        rp \u003d self.resource_provider_create()"},{"line_number":130,"context_line":"        self.resource_inventory_set(rp[\u0027uuid\u0027], [\u0027DISK_GB:16\u0027])"},{"line_number":131,"context_line":"        self.resource_inventory_set(rp[\u0027uuid\u0027], [\u0027MEMORY_MB:16\u0027, \u0027VCPU:32\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_2946f450","line":128,"updated":"2017-10-23 14:09:10.000000000","message":"It took me a bit to realize the point of this test, but it\u0027s showing that the 2nd call to PUT overwrites the DISK_GB inventory.","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"d9f38f42b9261188872885195401e742d78ceba6","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        self.assertIn(\u0027Unknown resource class\u0027, exc.output.decode(\u0027utf-8\u0027))"},{"line_number":126,"context_line":"        self.assertEqual([], self.resource_inventory_set(rp[\u0027uuid\u0027], []))"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def test_replace_previous_values(self):"},{"line_number":129,"context_line":"        rp \u003d self.resource_provider_create()"},{"line_number":130,"context_line":"        self.resource_inventory_set(rp[\u0027uuid\u0027], [\u0027DISK_GB:16\u0027])"},{"line_number":131,"context_line":"        self.resource_inventory_set(rp[\u0027uuid\u0027], [\u0027MEMORY_MB:16\u0027, \u0027VCPU:32\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_bbe8c9e1","line":128,"in_reply_to":"3f4b6375_2946f450","updated":"2017-10-24 13:09:08.000000000","message":"Commented that test.","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bd1eb24d774213c9c76c170f1f3b203c06e2d585","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        rp \u003d self.resource_provider_create()"},{"line_number":140,"context_line":"        self.resource_inventory_set(rp[\u0027uuid\u0027], [\u0027DISK_GB:16\u0027])"},{"line_number":141,"context_line":"        self.resource_inventory_set(rp[\u0027uuid\u0027], [])"},{"line_number":142,"context_line":"        self.assertEqual([], self.resource_inventory_set(rp[\u0027uuid\u0027], []))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_fail_if_incorrect_parameters_set_class_inventory(self):"},{"line_number":145,"context_line":"        exc \u003d self.assertRaises("}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_c922c0a4","line":142,"range":{"start_line":142,"start_character":29,"end_line":142,"end_character":72},"updated":"2017-10-23 14:09:10.000000000","message":"Did you mean for this to be a GET since you already did the delete via set on the line above?","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"d9f38f42b9261188872885195401e742d78ceba6","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        rp \u003d self.resource_provider_create()"},{"line_number":140,"context_line":"        self.resource_inventory_set(rp[\u0027uuid\u0027], [\u0027DISK_GB:16\u0027])"},{"line_number":141,"context_line":"        self.resource_inventory_set(rp[\u0027uuid\u0027], [])"},{"line_number":142,"context_line":"        self.assertEqual([], self.resource_inventory_set(rp[\u0027uuid\u0027], []))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_fail_if_incorrect_parameters_set_class_inventory(self):"},{"line_number":145,"context_line":"        exc \u003d self.assertRaises("}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_9be50d0c","line":142,"range":{"start_line":142,"start_character":29,"end_line":142,"end_character":72},"in_reply_to":"3f4b6375_c922c0a4","updated":"2017-10-24 13:09:08.000000000","message":"That\u0027s mistake here, fixed.","commit_id":"4316fc78f1970fd732ac5b1339c08bee9a13ad79"}],"setup.cfg":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"9d5c5fc02a87c5407c070739909133f354bfa015","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    resource-provider_show   \u003d osc_placement.resources.resource_provider:ShowResourceProvider"},{"line_number":33,"context_line":"    resource-provider_update \u003d osc_placement.resources.resource_provider:UpdateResourceProvider"},{"line_number":34,"context_line":"    resource-provider_delete \u003d osc_placement.resources.resource_provider:DeleteResourceProvider"},{"line_number":35,"context_line":"    resource-provider_inventory_set    \u003d osc_placement.resources.inventory:CreateInventory"},{"line_number":36,"context_line":"    resource-provider_inventory_list   \u003d osc_placement.resources.inventory:ListInventory"},{"line_number":37,"context_line":"    resource-provider_inventory_show   \u003d osc_placement.resources.inventory:ShowInventory"},{"line_number":38,"context_line":"    resource-provider_inventory_delete \u003d osc_placement.resources.inventory:DeleteInventory"}],"source_content_type":"text/x-ttcn-cfg","patch_set":1,"id":"7ffa3b31_a8bb0270","line":35,"updated":"2017-04-19 12:06:31.000000000","message":"Because of there being two different way to manage the inventories on a resource provider, I think instead of \"set\" here, it would be better to use \"create\" because that\u0027s what you\u0027re doing: creating one. There\u0027s also an \u0027update\u0027 for updating one inventory (via put to /rp/uuid/inv/rc)","commit_id":"2407701f2b1fe9e5098e3651b4cfdb293a190e07"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"724b4c3109efce71081372e0d622aa283d1eef61","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    resource-provider_show   \u003d osc_placement.resources.resource_provider:ShowResourceProvider"},{"line_number":33,"context_line":"    resource-provider_update \u003d osc_placement.resources.resource_provider:UpdateResourceProvider"},{"line_number":34,"context_line":"    resource-provider_delete \u003d osc_placement.resources.resource_provider:DeleteResourceProvider"},{"line_number":35,"context_line":"    resource-provider_inventory_set    \u003d osc_placement.resources.inventory:CreateInventory"},{"line_number":36,"context_line":"    resource-provider_inventory_list   \u003d osc_placement.resources.inventory:ListInventory"},{"line_number":37,"context_line":"    resource-provider_inventory_show   \u003d osc_placement.resources.inventory:ShowInventory"},{"line_number":38,"context_line":"    resource-provider_inventory_delete \u003d osc_placement.resources.inventory:DeleteInventory"}],"source_content_type":"text/x-ttcn-cfg","patch_set":1,"id":"7ffa3b31_46e9e6b4","line":35,"in_reply_to":"7ffa3b31_a8bb0270","updated":"2017-04-20 13:36:13.000000000","message":"Agreed. And it already says \"create\" in class/methods names. I guess \"set\" came from the CLI examples in the original spec.\n\nOops. I missed the \"update\" part. Will update this change once again. Thanks!","commit_id":"2407701f2b1fe9e5098e3651b4cfdb293a190e07"}]}
