)]}'
{"specs/liberty/approved/resource-objects.rst":[{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"e7672b6bc4266d3e3c603acaf0275911d302f3f2","unresolved":false,"context_lines":[{"line_number":160,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"Model"},{"line_number":163,"context_line":"-----"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"Modeling requested and used resource amounts is the foundational building block"},{"line_number":166,"context_line":"that must be done first before any further refactoring or cleanup of the"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3afb71cf_f102dd6e","line":163,"updated":"2015-06-05 12:33:07.000000000","message":"oops, need to remove this","commit_id":"d2b4e69f6dd6e70357cb7569a5db8ca94a40d3fb"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"84954c149601d2efe2da7c7ee0767e5fa924b5c1","unresolved":false,"context_lines":[{"line_number":202,"context_line":"      which match this request and returns them as a ``NUMATopology``."},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"- ``ResourceRequest``: subclasses describe abstract requests for particular"},{"line_number":205,"context_line":"  resources, EG \"I need 2048 of RAM\". Has a ``RequestType`` and both proxies and adapts its methods. EG"},{"line_number":206,"context_line":"  ``IntegerRequestType#match(Integer)`` can be called as"},{"line_number":207,"context_line":"  ``VCPURequest#match(Integer)`` or ``VCPURequest#match(VCPURequest)``, but not"},{"line_number":208,"context_line":"  ``VCPURequest(RAMRequest)`` even though ``RAMRequest`` also has an"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3afb71cf_6cee16ee","line":205,"updated":"2015-06-05 12:53:56.000000000","message":"whoops, long","commit_id":"d2b4e69f6dd6e70357cb7569a5db8ca94a40d3fb"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"84954c149601d2efe2da7c7ee0767e5fa924b5c1","unresolved":false,"context_lines":[{"line_number":234,"context_line":"              ^ M                   ^ M"},{"line_number":235,"context_line":"              |                     |"},{"line_number":236,"context_line":"      +----------------+    +-----------------+"},{"line_number":237,"context_line":"      |   AmountSet    |    |   RequestSet    |"},{"line_number":238,"context_line":"      +----------------+    +-----------------+"},{"line_number":239,"context_line":"                   |          |"},{"line_number":240,"context_line":"                   |          |"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3afb71cf_0cdd6242","line":237,"updated":"2015-06-05 12:53:56.000000000","message":"I\u0027m open to calling these AmountPool and PoolRequest instead","commit_id":"d2b4e69f6dd6e70357cb7569a5db8ca94a40d3fb"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fb01a1f856a48cdf6b5621f88ad9bb08d5317f55","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://blueprints.launchpad.net/nova/+spec/resource-objects"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Adds model objects to represent the resources that may be consumed"},{"line_number":14,"context_line":"by an instance."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Problem description"},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_8c41210e","line":14,"updated":"2015-06-15 13:19:28.000000000","message":"the model objects are for modeling both the request (AmountSpec) and the consumption/freeing (InventorySpec)","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fb01a1f856a48cdf6b5621f88ad9bb08d5317f55","unresolved":false,"context_lines":[{"line_number":55,"context_line":"scheduler interface is incredibly fragile since the interface can be altered on"},{"line_number":56,"context_line":"a whim by any developer who decides to add a new key to the free-form"},{"line_number":57,"context_line":"dictionary of resources. Typos in resource dictionary keys can be very easy to"},{"line_number":58,"context_line":"miss in code reviews and frankly, there is virtually no functional testing for"},{"line_number":59,"context_line":"a lot of the edge case code in the resource tracker around the extensible"},{"line_number":60,"context_line":"resource tracker."},{"line_number":61,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_0c1bd11c","line":58,"updated":"2015-06-15 13:19:28.000000000","message":"The grammar was correct in the original. There should be a comma before \"and\", since the sentence \"there is virtually no functional testing for ...\" is a complete sentence, not a partial sentence.","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"e22f740337e384c60234d039fb20b9eb827e4384","unresolved":false,"context_lines":[{"line_number":55,"context_line":"scheduler interface is incredibly fragile since the interface can be altered on"},{"line_number":56,"context_line":"a whim by any developer who decides to add a new key to the free-form"},{"line_number":57,"context_line":"dictionary of resources. Typos in resource dictionary keys can be very easy to"},{"line_number":58,"context_line":"miss in code reviews and frankly, there is virtually no functional testing for"},{"line_number":59,"context_line":"a lot of the edge case code in the resource tracker around the extensible"},{"line_number":60,"context_line":"resource tracker."},{"line_number":61,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_268eec78","line":58,"in_reply_to":"fa32b979_0c1bd11c","updated":"2015-06-15 14:49:08.000000000","message":"This must be a US/GB thing","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fb01a1f856a48cdf6b5621f88ad9bb08d5317f55","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    def _update_usage(self, context, amounts_by_resource, sign\u003d1):"},{"line_number":141,"context_line":"        for resource, amount in amounts_by_resource.items():"},{"line_number":142,"context_line":"            to_consume \u003d amount if sign \u003d\u003d 1 else -amount"},{"line_number":143,"context_line":"            self.inventories[resource].consume(to_consume)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"Use Cases"},{"line_number":146,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_ac9e6554","line":143,"updated":"2015-06-15 13:19:28.000000000","message":"The above should be this:\n\n def _update_usage(self, context, amounts):\n     for resource, amount in amounts.items():\n         self.inventories[resource].update(amount)","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fb01a1f856a48cdf6b5621f88ad9bb08d5317f55","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"This blueprint encompasses the addition of sets of classes to represent:"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"- Amounts of different datatypes, EG `Integer` or `NUMATopology`."},{"line_number":169,"context_line":"- Inventories of different datatypes, which describe the actual"},{"line_number":170,"context_line":"  capacity, the amount used up already and any overcommit ratio."},{"line_number":171,"context_line":"- Different types of resources, EG RAM which uses `IntegerAmount` and"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_8ce7e1e3","line":168,"updated":"2015-06-15 13:19:28.000000000","message":"s/EG/e.g./\n\ns/Integer/IntegerAmount/\n\ns/NUMATopology/NUMAAmount/","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fb01a1f856a48cdf6b5621f88ad9bb08d5317f55","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"- Amounts of different datatypes, EG `Integer` or `NUMATopology`."},{"line_number":169,"context_line":"- Inventories of different datatypes, which describe the actual"},{"line_number":170,"context_line":"  capacity, the amount used up already and any overcommit ratio."},{"line_number":171,"context_line":"- Different types of resources, EG RAM which uses `IntegerAmount` and"},{"line_number":172,"context_line":"  `IntegerInventory`, or NUMA which uses `NUMAAmount` and `NUMAInventory`."},{"line_number":173,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_ec09cd96","line":170,"updated":"2015-06-15 13:19:28.000000000","message":"Add:\n\n e.g. `IntegerInventory`, `NUMAInventory`","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fb01a1f856a48cdf6b5621f88ad9bb08d5317f55","unresolved":false,"context_lines":[{"line_number":168,"context_line":"- Amounts of different datatypes, EG `Integer` or `NUMATopology`."},{"line_number":169,"context_line":"- Inventories of different datatypes, which describe the actual"},{"line_number":170,"context_line":"  capacity, the amount used up already and any overcommit ratio."},{"line_number":171,"context_line":"- Different types of resources, EG RAM which uses `IntegerAmount` and"},{"line_number":172,"context_line":"  `IntegerInventory`, or NUMA which uses `NUMAAmount` and `NUMAInventory`."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"These amount, inventory and resource classes will be `nova.objects` object"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_6cf61d91","line":171,"updated":"2015-06-15 13:19:28.000000000","message":"s/EG/e.g./","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fb01a1f856a48cdf6b5621f88ad9bb08d5317f55","unresolved":false,"context_lines":[{"line_number":169,"context_line":"- Inventories of different datatypes, which describe the actual"},{"line_number":170,"context_line":"  capacity, the amount used up already and any overcommit ratio."},{"line_number":171,"context_line":"- Different types of resources, EG RAM which uses `IntegerAmount` and"},{"line_number":172,"context_line":"  `IntegerInventory`, or NUMA which uses `NUMAAmount` and `NUMAInventory`."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"These amount, inventory and resource classes will be `nova.objects` object"},{"line_number":175,"context_line":"classes and will enable Nova to evolve, in a versioned manner, the way that it"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_cc2ba9ea","line":172,"updated":"2015-06-15 13:19:28.000000000","message":"s/NUMA/NUMATopology/","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fb01a1f856a48cdf6b5621f88ad9bb08d5317f55","unresolved":false,"context_lines":[{"line_number":180,"context_line":"those resources in different ways. While this blueprint does indeed remove the"},{"line_number":181,"context_line":"ERT, because these resource, amount and inventory classes are being added"},{"line_number":182,"context_line":"as `nova.object` objects, we will gain the flexibility that the ERT intended"},{"line_number":183,"context_line":"but with the stability of the nova objects system."},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"The resource tracker code will then be converted to use the above classes when"},{"line_number":186,"context_line":"representing inventories of all resources on a compute node. As today, these"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_cc7969fe","line":183,"updated":"2015-06-15 13:19:28.000000000","message":"++ nice.","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fb01a1f856a48cdf6b5621f88ad9bb08d5317f55","unresolved":false,"context_lines":[{"line_number":189,"context_line":"No changes are proposed to the database schema of the `compute_nodes` table or"},{"line_number":190,"context_line":"the fields in `nova.objects.ComputeNode`, however we do add translation methods"},{"line_number":191,"context_line":"to `nova.objects.ComputeNode` that will be able to produce a dict of"},{"line_number":192,"context_line":"`Resource, InventorySpec` objects from the compute node and update the compute"},{"line_number":193,"context_line":"node from a similar structure."},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_cc608938","line":192,"updated":"2015-06-15 13:19:28.000000000","message":"s/Resource, //  (the nova/resources.py classes are the keys to the dict...)","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"e22f740337e384c60234d039fb20b9eb827e4384","unresolved":false,"context_lines":[{"line_number":189,"context_line":"No changes are proposed to the database schema of the `compute_nodes` table or"},{"line_number":190,"context_line":"the fields in `nova.objects.ComputeNode`, however we do add translation methods"},{"line_number":191,"context_line":"to `nova.objects.ComputeNode` that will be able to produce a dict of"},{"line_number":192,"context_line":"`Resource, InventorySpec` objects from the compute node and update the compute"},{"line_number":193,"context_line":"node from a similar structure."},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_8f991371","line":192,"in_reply_to":"fa32b979_cc608938","updated":"2015-06-15 14:49:08.000000000","message":"Yes, that was what I was trying to express but Python has no notation for types :(\n\nI\u0027ll use my words.","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fb01a1f856a48cdf6b5621f88ad9bb08d5317f55","unresolved":false,"context_lines":[{"line_number":268,"context_line":" class InventorySpec(object):"},{"line_number":269,"context_line":"    \"\"\"Describes the capacity, available and used amounts for a resource.\"\"\""},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def consume(self, amount, sign\u003d1):"},{"line_number":272,"context_line":"        \"\"\"Consumes the given amount of resources from this inventory. If"},{"line_number":273,"context_line":"        the amount is negative, more resources will be available afterwards"},{"line_number":274,"context_line":"        than were before."}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_ecf30d72","line":271,"updated":"2015-06-15 13:19:28.000000000","message":"The amount has an is_negative attribute. The sign kward is not needed.\n\nIn addition, I really do not agree that \"consume\" is appropriate vs. \"update\". Sorry, I just don\u0027t agree with you on this one :)","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"e22f740337e384c60234d039fb20b9eb827e4384","unresolved":false,"context_lines":[{"line_number":268,"context_line":" class InventorySpec(object):"},{"line_number":269,"context_line":"    \"\"\"Describes the capacity, available and used amounts for a resource.\"\"\""},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"    def consume(self, amount, sign\u003d1):"},{"line_number":272,"context_line":"        \"\"\"Consumes the given amount of resources from this inventory. If"},{"line_number":273,"context_line":"        the amount is negative, more resources will be available afterwards"},{"line_number":274,"context_line":"        than were before."}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_ef4f7f90","line":271,"in_reply_to":"fa32b979_ecf30d72","updated":"2015-06-15 14:49:08.000000000","message":"Right, forgot to delete sign.\n\nI guess we\u0027ll have to agree to differ on consume vs update. Your spec, so I\u0027ll revert that change.","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fb01a1f856a48cdf6b5621f88ad9bb08d5317f55","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        \"\"\""},{"line_number":281,"context_line":"        raise NotImplementedError"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def can_provide(self, amount, sign\u003d1):"},{"line_number":284,"context_line":"        \"\"\"Determine if this inventory can provide the given amount of"},{"line_number":285,"context_line":"        resources. An overcommit ratio may be applied. If the amount is"},{"line_number":286,"context_line":"        negative, tests whether the given amount may be returned to the"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_aca42557","line":283,"updated":"2015-06-15 13:19:28.000000000","message":"There is no sign kwarg. has_room_for() will not operate on negative AmountSpec objects, since it doesn\u0027t make logical sense to do so.\n\nI don\u0027t really see the point of the rename to can_provide(), but not really as strong an opinion about the name as the consume/update feelings.","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"e22f740337e384c60234d039fb20b9eb827e4384","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        \"\"\""},{"line_number":281,"context_line":"        raise NotImplementedError"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def can_provide(self, amount, sign\u003d1):"},{"line_number":284,"context_line":"        \"\"\"Determine if this inventory can provide the given amount of"},{"line_number":285,"context_line":"        resources. An overcommit ratio may be applied. If the amount is"},{"line_number":286,"context_line":"        negative, tests whether the given amount may be returned to the"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_72111652","line":283,"in_reply_to":"fa32b979_aca42557","updated":"2015-06-15 14:49:08.000000000","message":"\"Provide\" and \"consume\" complement each other. Since you insist on \"update\" though, the pairing is broken so has_room_for is adequate.","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fb01a1f856a48cdf6b5621f88ad9bb08d5317f55","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        raise NotImplementedError"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":""},{"line_number":296,"context_line":" class ResourceSpec(object):"},{"line_number":297,"context_line":"    \"\"\"Describes a particular kind of resource.\"\"\""},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    @classmethod"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_cc63a919","line":296,"updated":"2015-06-15 13:19:28.000000000","message":"ResourceType, not ResourceSpec. It\u0027s a type of resource, not a specification for a resource...","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"e22f740337e384c60234d039fb20b9eb827e4384","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        raise NotImplementedError"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":""},{"line_number":296,"context_line":" class ResourceSpec(object):"},{"line_number":297,"context_line":"    \"\"\"Describes a particular kind of resource.\"\"\""},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    @classmethod"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_75cfc056","line":296,"in_reply_to":"fa32b979_cc63a919","updated":"2015-06-15 14:49:08.000000000","message":"You said:\n\n    you can request an amount (10L) of a resource (water), and the provider\n    of the resource (a reservoir) could potentially have the inventory (1M Liters)\n    to fulfill the request for the amount.\n\nSo where has this Type suffix sprouted from please? If water (RAM) is a Resource, then the ResourceType is Integer (litres or bytes).\n\n--\n\nSecondly, assuming Spec stands for Specifier (from the docstrings) rather than Specification (as you just claimed), it\u0027s technically valid but adds nothing. This is demonstrated by the inconsistency of usage, EG \"def make_amount\" should be \"def make_amount_spec\" but you saw no problem dropping it, because it\u0027s redundant.","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fb01a1f856a48cdf6b5621f88ad9bb08d5317f55","unresolved":false,"context_lines":[{"line_number":305,"context_line":"        raise NotImplementedError"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"Each concrete specialization of the InventorySpec class must be able to handle"},{"line_number":308,"context_line":"overcommit ratios for the type of resource that it handles."},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"With the idea that *all* requested resources for an instance should be able"},{"line_number":311,"context_line":"to be compared to *all* resource inventories for a compute node in the"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_8c6da106","line":308,"updated":"2015-06-15 13:19:28.000000000","message":"++","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fb01a1f856a48cdf6b5621f88ad9bb08d5317f55","unresolved":false,"context_lines":[{"line_number":317,"context_line":"    if compute_node.inventories[resource].has_room_for(amount):"},{"line_number":318,"context_line":"        # do something... perhaps claim resources on the compute"},{"line_number":319,"context_line":"        # node, which might eventually call:"},{"line_number":320,"context_line":"        compute_node.inventories[resource].consume(amount)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"Assignee(s)"},{"line_number":323,"context_line":"-----------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_2c7fb5ab","line":320,"updated":"2015-06-15 13:19:28.000000000","message":"s/consume/update :P","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"fb01a1f856a48cdf6b5621f88ad9bb08d5317f55","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        compute_node.inventories[resource].consume(amount)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"Assignee(s)"},{"line_number":323,"context_line":"-----------"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"Primary assignee:"},{"line_number":326,"context_line":"  jaypipes"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_8c44c174","line":323,"updated":"2015-06-15 13:19:28.000000000","message":"You can add yourself to the assignees :)","commit_id":"5a7f8bc99a433487992e1b114a84806f568dcd80"}]}
