)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"e59e5373c69d741864a33d80ba39ce473f16643d","unresolved":false,"context_lines":[{"line_number":7,"context_line":"ProviderTree.snapshot \u003d\u003e ProviderSnapshot"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"An instance of ProviderTree is used to cache resource provider"},{"line_number":10,"context_line":"information in the report client.  We will also use a ProviderTree"},{"line_number":11,"context_line":"instance as the input and output of ComputeDriver.update_provider_tree."},{"line_number":12,"context_line":"We will then need to compare those two and flush any differences back to"},{"line_number":13,"context_line":"the placement API.  Thus, we need a way to access the details of"},{"line_number":14,"context_line":"individual resource providers in a ProviderTree."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"7f96bb07_0844321a","line":11,"range":{"start_line":10,"start_character":35,"end_line":11,"end_character":71},"updated":"2018-01-16 19:22:25.000000000","message":"I don\u0027t see a reason to have a ProviderTree be an output of update_provider_tree(). Instead, my thought was that the provider tree being passed to update_provider_tree() would be... well, updated. And the return value would be a boolean of whether the tree had any modifications made to it.","commit_id":"689f087c7f6a22b07f18d1badc31128ac045673c"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"bffab727eb199539d310119657f2fef4608b8dc0","unresolved":false,"context_lines":[{"line_number":7,"context_line":"ProviderTree.snapshot \u003d\u003e ProviderSnapshot"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"An instance of ProviderTree is used to cache resource provider"},{"line_number":10,"context_line":"information in the report client.  We will also use a ProviderTree"},{"line_number":11,"context_line":"instance as the input and output of ComputeDriver.update_provider_tree."},{"line_number":12,"context_line":"We will then need to compare those two and flush any differences back to"},{"line_number":13,"context_line":"the placement API.  Thus, we need a way to access the details of"},{"line_number":14,"context_line":"individual resource providers in a ProviderTree."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"7f96bb07_1523eabe","line":11,"range":{"start_line":10,"start_character":35,"end_line":11,"end_character":71},"in_reply_to":"7f96bb07_0844321a","updated":"2018-01-16 21:22:09.000000000","message":"Yeah, that\u0027s how it\u0027s coded/documented [1] and consumed [2].  I was using \"input\" and \"output\" loosely.  I can reword this.\n\n[1] https://review.openstack.org/#/c/521187\n[2] https://review.openstack.org/#/c/520246/29/nova/compute/resource_tracker.py@880","commit_id":"689f087c7f6a22b07f18d1badc31128ac045673c"}],"nova/compute/provider_tree.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f8f258cddf48804fbc3cd952a0110ac1f54f5cf4","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.traits \u003d traits"},{"line_number":45,"context_line":"        self.aggregates \u003d aggregates"},{"line_number":46,"context_line":"        # Lock it down"},{"line_number":47,"context_line":"        self.readonly \u003d True"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _check_readonly(self):"},{"line_number":50,"context_line":"        if self.readonly:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_aad30f38","line":47,"range":{"start_line":47,"start_character":8,"end_line":47,"end_character":28},"updated":"2018-01-12 17:21:40.000000000","message":"this is a little non obvirous as i was looking for it in copyout_readonly but i guess it works.","commit_id":"c7b369c2e4f98c7ad0a0cc5e79a05cf96150cb90"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"bc2aa1343f2312731a5059c876a97eaf17b751f9","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.traits \u003d traits"},{"line_number":45,"context_line":"        self.aggregates \u003d aggregates"},{"line_number":46,"context_line":"        # Lock it down"},{"line_number":47,"context_line":"        self.readonly \u003d True"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _check_readonly(self):"},{"line_number":50,"context_line":"        if self.readonly:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_bdf03869","line":47,"range":{"start_line":47,"start_character":8,"end_line":47,"end_character":28},"in_reply_to":"7f96bb07_aad30f38","updated":"2018-01-12 20:38:47.000000000","message":"Heh, that was my suggestion. This way, once it\u0027s initialized, it can\u0027t be changed, not even by the calling method.","commit_id":"c7b369c2e4f98c7ad0a0cc5e79a05cf96150cb90"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"39d1e698ed300f6aacb0c5cb77e13097ac609d98","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.traits \u003d traits"},{"line_number":45,"context_line":"        self.aggregates \u003d aggregates"},{"line_number":46,"context_line":"        # Lock it down"},{"line_number":47,"context_line":"        self.readonly \u003d True"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _check_readonly(self):"},{"line_number":50,"context_line":"        if self.readonly:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_d19babc6","line":47,"range":{"start_line":47,"start_character":8,"end_line":47,"end_character":28},"in_reply_to":"7f96bb07_bdf03869","updated":"2018-01-12 23:33:04.000000000","message":"None of the various possibilities is beautiful, but this is my least unfavorite.","commit_id":"c7b369c2e4f98c7ad0a0cc5e79a05cf96150cb90"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"bc2aa1343f2312731a5059c876a97eaf17b751f9","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            {u: p.copyout_readonly() for u, p in self.children.items()},"},{"line_number":88,"context_line":"            copy.deepcopy(self.inventory),"},{"line_number":89,"context_line":"            copy.copy(self.traits),"},{"line_number":90,"context_line":"            copy.copy(self.aggregates))"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def get_provider_uuids(self):"},{"line_number":93,"context_line":"        \"\"\"Returns a set of UUIDs of this provider and all its descendants.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_ab9551e6","line":90,"updated":"2018-01-12 20:38:47.000000000","message":"This is extremely hard to read, and looks fragile. I\u0027d prefer to see this broken into several lines, instead of trying to make it a one-liner.","commit_id":"c7b369c2e4f98c7ad0a0cc5e79a05cf96150cb90"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"39d1e698ed300f6aacb0c5cb77e13097ac609d98","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            {u: p.copyout_readonly() for u, p in self.children.items()},"},{"line_number":88,"context_line":"            copy.deepcopy(self.inventory),"},{"line_number":89,"context_line":"            copy.copy(self.traits),"},{"line_number":90,"context_line":"            copy.copy(self.aggregates))"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def get_provider_uuids(self):"},{"line_number":93,"context_line":"        \"\"\"Returns a set of UUIDs of this provider and all its descendants.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_f1790793","line":90,"in_reply_to":"7f96bb07_ab9551e6","updated":"2018-01-12 23:33:04.000000000","message":"Done, I think.  See if you like","commit_id":"c7b369c2e4f98c7ad0a0cc5e79a05cf96150cb90"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f382c0f2cb2e4f17d2e62d2b7d9a93160677de22","unresolved":false,"context_lines":[{"line_number":30,"context_line":"_LOCK_NAME \u003d \u0027provider-tree-lock\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class ProviderSnapshot(object):"},{"line_number":34,"context_line":"    \"\"\"Point-in-time representation of a resource provider in the tree."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    Whereas a nominal attempt is made to enforce read-only-ness of instances of"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f96bb07_cbad1632","line":33,"updated":"2018-01-15 15:40:18.000000000","message":"This class can be written easily as a namedtuple and then you get the read-onlyness automatically:\n\n  import collections\n\n  ProviderSnapshot \u003d collections.namedtuple(\u0027ProviderSnapshot\u0027, [\u0027uuid\u0027, \u0027name\u0027, \u0027generation\u0027, ...])\n\nThe only downside of that the resulting type supports indexing as well, like a tuple.","commit_id":"755c8ebcb6343e7b358dbe53b12b7439904c87a8"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"7106075d098e7272abfffac3dc6ba6322d44b04a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"_LOCK_NAME \u003d \u0027provider-tree-lock\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class ProviderSnapshot(object):"},{"line_number":34,"context_line":"    \"\"\"Point-in-time representation of a resource provider in the tree."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    Whereas a nominal attempt is made to enforce read-only-ness of instances of"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f96bb07_28091ddc","line":33,"in_reply_to":"7f96bb07_683165ec","updated":"2018-01-15 16:16:39.000000000","message":"Never mind; the above was a case of ENOTENOUGHCOFFEE","commit_id":"755c8ebcb6343e7b358dbe53b12b7439904c87a8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c1a39abb6f1005c45ed2c8138f3b17fd994b076e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"_LOCK_NAME \u003d \u0027provider-tree-lock\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class ProviderSnapshot(object):"},{"line_number":34,"context_line":"    \"\"\"Point-in-time representation of a resource provider in the tree."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    Whereas a nominal attempt is made to enforce read-only-ness of instances of"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f96bb07_0861c1a9","line":33,"in_reply_to":"7f96bb07_683165ec","updated":"2018-01-15 16:31:12.000000000","message":"You\u0027re setting an attribute on the class, not on an instance of it :)\n\nI think I would be willing to use it anyway.  The read-only-ness isn\u0027t as important as the copy-out-ness.","commit_id":"755c8ebcb6343e7b358dbe53b12b7439904c87a8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c1a39abb6f1005c45ed2c8138f3b17fd994b076e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"_LOCK_NAME \u003d \u0027provider-tree-lock\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class ProviderSnapshot(object):"},{"line_number":34,"context_line":"    \"\"\"Point-in-time representation of a resource provider in the tree."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    Whereas a nominal attempt is made to enforce read-only-ness of instances of"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f96bb07_e82575ac","line":33,"in_reply_to":"7f96bb07_cbad1632","updated":"2018-01-15 16:31:12.000000000","message":"\u003e This class can be written easily as a namedtuple and then you get\n \u003e the read-onlyness automatically:\n\nThat\u0027s a great idea!\n\n \u003e The only downside of that the resulting type supports indexing as\n \u003e well, like a tuple.\n\nI\u0027m totally fine with that.","commit_id":"755c8ebcb6343e7b358dbe53b12b7439904c87a8"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"5e9e6fc76f59fea77650b985a14fed046e353f35","unresolved":false,"context_lines":[{"line_number":30,"context_line":"_LOCK_NAME \u003d \u0027provider-tree-lock\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class ProviderSnapshot(object):"},{"line_number":34,"context_line":"    \"\"\"Point-in-time representation of a resource provider in the tree."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    Whereas a nominal attempt is made to enforce read-only-ness of instances of"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f96bb07_683165ec","line":33,"in_reply_to":"7f96bb07_cbad1632","updated":"2018-01-15 16:12:27.000000000","message":"No, this wouldn\u0027t provide read-only access.\n\n  In [1]: import collections\n\n  In [2]: ps \u003d collections.namedtuple(\u0027ProviderSnapshot\u0027, [\u0027uuid\u0027, \u0027name\u0027, \u0027generation\u0027])\n\n  In [3]: ps.uuid \u003d \"xx\"\n\n  In [4]: print(ps.uuid)\n  xx\n\n  In [5]: ps.uuid \u003d \"yy\"\n\n  In [6]: print(ps.uuid)\n  yy","commit_id":"755c8ebcb6343e7b358dbe53b12b7439904c87a8"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e3a3c1f89cf3f021d8a8f85f70fa67e104871bc1","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    complex types (children/inventory/traits/aggregates).  However, any"},{"line_number":39,"context_line":"    such modifications still have no effect on the ProviderTree the instance"},{"line_number":40,"context_line":"    came from.  Like, you can Sharpie a moustache on a Polaroid of my face, but"},{"line_number":41,"context_line":"    that doesn\u0027t make a moustache appear on my actual face."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    _readonly \u003d False"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f96bb07_a43f9f23","line":41,"updated":"2018-01-15 12:52:44.000000000","message":"as far as you know","commit_id":"755c8ebcb6343e7b358dbe53b12b7439904c87a8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c1a39abb6f1005c45ed2c8138f3b17fd994b076e","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    complex types (children/inventory/traits/aggregates).  However, any"},{"line_number":39,"context_line":"    such modifications still have no effect on the ProviderTree the instance"},{"line_number":40,"context_line":"    came from.  Like, you can Sharpie a moustache on a Polaroid of my face, but"},{"line_number":41,"context_line":"    that doesn\u0027t make a moustache appear on my actual face."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    _readonly \u003d False"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f96bb07_688de579","line":41,"in_reply_to":"7f96bb07_a43f9f23","updated":"2018-01-15 16:31:12.000000000","message":"I\u0027ve tried.  Belieeeeve me, I\u0027ve tried.  Though one time this happened:\n\nhttps://scontent-dft4-1.xx.fbcdn.net/v/t1.0-9/1931379_72879835568_6503_n.jpg?oh\u003dc35c94cc0f0c2552df3eaba4c208001b\u0026oe\u003d5ADFE9D2","commit_id":"755c8ebcb6343e7b358dbe53b12b7439904c87a8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f382c0f2cb2e4f17d2e62d2b7d9a93160677de22","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        self.aggregates \u003d set()"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def snapshot(self):"},{"line_number":95,"context_line":"        # Recursively \"deep copy\" descendants as ReadOnlyProviders"},{"line_number":96,"context_line":"        children \u003d {u: p.snapshot() for u, p in self.children.items()}"},{"line_number":97,"context_line":"        inventory \u003d copy.deepcopy(self.inventory)"},{"line_number":98,"context_line":"        traits \u003d copy.copy(self.traits)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f96bb07_4b0a668a","line":95,"range":{"start_line":95,"start_character":49,"end_line":95,"end_character":66},"updated":"2018-01-15 15:40:18.000000000","message":"nit:ProviderSnapshots","commit_id":"755c8ebcb6343e7b358dbe53b12b7439904c87a8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c1a39abb6f1005c45ed2c8138f3b17fd994b076e","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        self.aggregates \u003d set()"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def snapshot(self):"},{"line_number":95,"context_line":"        # Recursively \"deep copy\" descendants as ReadOnlyProviders"},{"line_number":96,"context_line":"        children \u003d {u: p.snapshot() for u, p in self.children.items()}"},{"line_number":97,"context_line":"        inventory \u003d copy.deepcopy(self.inventory)"},{"line_number":98,"context_line":"        traits \u003d copy.copy(self.traits)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f96bb07_28327da8","line":95,"range":{"start_line":95,"start_character":49,"end_line":95,"end_character":66},"in_reply_to":"7f96bb07_4b0a668a","updated":"2018-01-15 16:31:12.000000000","message":"Done","commit_id":"755c8ebcb6343e7b358dbe53b12b7439904c87a8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f382c0f2cb2e4f17d2e62d2b7d9a93160677de22","unresolved":false,"context_lines":[{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        :param name_or_uuid: Either name or UUID of the resource provider to"},{"line_number":309,"context_line":"                             snapshot."},{"line_number":310,"context_line":"        :return: ReadOnlyProvider object representing the specified provider."},{"line_number":311,"context_line":"        :raises: ValueError if a provider with name_or_uuid was not found in"},{"line_number":312,"context_line":"                 the tree."},{"line_number":313,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"7f96bb07_cb72f6e3","line":310,"range":{"start_line":310,"start_character":17,"end_line":310,"end_character":33},"updated":"2018-01-15 15:40:18.000000000","message":"nit: ProviderSnapshot","commit_id":"755c8ebcb6343e7b358dbe53b12b7439904c87a8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c1a39abb6f1005c45ed2c8138f3b17fd994b076e","unresolved":false,"context_lines":[{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        :param name_or_uuid: Either name or UUID of the resource provider to"},{"line_number":309,"context_line":"                             snapshot."},{"line_number":310,"context_line":"        :return: ReadOnlyProvider object representing the specified provider."},{"line_number":311,"context_line":"        :raises: ValueError if a provider with name_or_uuid was not found in"},{"line_number":312,"context_line":"                 the tree."},{"line_number":313,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"7f96bb07_c828b935","line":310,"range":{"start_line":310,"start_character":17,"end_line":310,"end_character":33},"in_reply_to":"7f96bb07_cb72f6e3","updated":"2018-01-15 16:31:12.000000000","message":"Done","commit_id":"755c8ebcb6343e7b358dbe53b12b7439904c87a8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8d92009c5bf3d754905cbc59a2b8edca815a3853","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        self.aggregates \u003d set()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def snapshot(self):"},{"line_number":68,"context_line":"        # Recursively \"deep copy\" descendants as ProviderSnapshots"},{"line_number":69,"context_line":"        children \u003d {u: p.snapshot() for u, p in self.children.items()}"},{"line_number":70,"context_line":"        inventory \u003d copy.deepcopy(self.inventory)"},{"line_number":71,"context_line":"        traits \u003d copy.copy(self.traits)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_edceb82b","line":68,"range":{"start_line":68,"start_character":10,"end_line":68,"end_character":21},"updated":"2018-01-16 18:43:19.000000000","message":"Thinking this through, perhaps we need to make the recursive part (descending .children) optional - or maybe even not do it at all, ever.\n\nSo far in this series, no consumers of snapshot are walking the descendants, so the deep copy is wasteful.\n\nQuestion is, does the remaining consumer, ComputeDriver.update_provider_tree, need .children, or is it sufficient to walk through [pt.snapshot(uuid) for uuid in pt.get_provider_uuids()] - given that a ProviderSnapshot does already have the parent UUID?\n\nPerhaps rip the recursion out now, and add it back later if there\u0027s a demand for it.","commit_id":"689f087c7f6a22b07f18d1badc31128ac045673c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"86be783579d2982dcfb2c29454aabc87fb19fa55","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        raise ValueError(_(\"No such provider %s\") % name_or_uuid)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def data(self, name_or_uuid):"},{"line_number":277,"context_line":"        \"\"\"Return a point-in-time copy of the specified provider\u0027s data."},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"        :param name_or_uuid: Either name or UUID of the resource provider whose"},{"line_number":280,"context_line":"                             data is to be returned."}],"source_content_type":"text/x-python","patch_set":9,"id":"7f96bb07_f43055eb","line":277,"updated":"2018-01-19 15:49:54.000000000","message":"except the data about its children. Which is OK as we not needed that now and we can add it later when we need.","commit_id":"281b38e0d6ccf98836f5ddaa522043fd834af8f9"}],"nova/tests/unit/compute/test_provider_tree.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f382c0f2cb2e4f17d2e62d2b7d9a93160677de22","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7f96bb07_0b18de7e","line":337,"updated":"2018-01-15 15:40:18.000000000","message":"I would add a test case that assert that the returned snapshot is read-only and write attempts result in an exception","commit_id":"755c8ebcb6343e7b358dbe53b12b7439904c87a8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c1a39abb6f1005c45ed2c8138f3b17fd994b076e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7f96bb07_a879ad2f","line":337,"in_reply_to":"7f96bb07_0b18de7e","updated":"2018-01-15 16:31:12.000000000","message":"Done","commit_id":"755c8ebcb6343e7b358dbe53b12b7439904c87a8"}]}
