)]}'
{"etc/nova/cells.json":[{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"e806ea82929a411159c537b5e47ed59d791cb876","unresolved":false,"context_lines":[{"line_number":4,"context_line":"        \"api_url\": \"http://api.example.com:8774\","},{"line_number":5,"context_line":"        \"transport_url\": \"rabbit://rabbit.example.com\","},{"line_number":6,"context_line":"        \"weight_offset\": 0.0,"},{"line_number":7,"context_line":"\t\"weight_scale\": 1.0,"},{"line_number":8,"context_line":"        \"is_parent\": true,"},{"line_number":9,"context_line":"    },"},{"line_number":10,"context_line":"    \"cell1\": {"}],"source_content_type":"application/json","patch_set":16,"id":"AAAAP3%2F%2Fqkc%3D","line":7,"updated":"2013-07-14 23:03:37.000000000","message":"The weight_scale lines are indented with a tab, while everything else is spaces.  Not a big deal ... just fyi in case you update this for some other reason","commit_id":"315cf6a824e5f3b38725fa5ba35a98152ad8b20e"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"e66469d87d9ad11fc19799ec6dace804c2588dd2","unresolved":false,"context_lines":[{"line_number":4,"context_line":"        \"api_url\": \"http://api.example.com:8774\","},{"line_number":5,"context_line":"        \"transport_url\": \"rabbit://rabbit.example.com\","},{"line_number":6,"context_line":"        \"weight_offset\": 0.0,"},{"line_number":7,"context_line":"\t\"weight_scale\": 1.0,"},{"line_number":8,"context_line":"        \"is_parent\": true,"},{"line_number":9,"context_line":"    },"},{"line_number":10,"context_line":"    \"cell1\": {"}],"source_content_type":"application/json","patch_set":16,"id":"AAAAP3%2F%2Foyw%3D","line":7,"in_reply_to":"AAAAP3%2F%2Fqkc%3D","updated":"2013-07-15 15:03:38.000000000","message":"phaw.  I tried to not do that.  Guess Emacs had other ideas.  Will fix on rebase…","commit_id":"315cf6a824e5f3b38725fa5ba35a98152ad8b20e"}],"nova/api/openstack/compute/plugins/v3/cells.py":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"19c1bd507a8042e8e0bb29ab30c5ed3bcbf47c07","unresolved":false,"context_lines":[{"line_number":242,"context_line":"        return dict(cell\u003d{\"capacities\": capacities})"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    @wsgi.serializers(xml\u003dCellTemplate)"},{"line_number":245,"context_line":"    def show(self, req, id):"},{"line_number":246,"context_line":"        \"\"\"Return data about the given cell name.  \u0027id\u0027 is a cell name.\"\"\""},{"line_number":247,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":248,"context_line":"        authorize(context)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FsQo%3D","line":245,"updated":"2013-07-12 22:37:34.000000000","message":"I\u0027m disappointed that the v3 class has so much copy and pasted code...\n\nI don\u0027t think you did this, but it\u0027s hard to ignore.","commit_id":"c75f2481b98c6815cca0c98dbe16509ebd6d8bbd"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"a7a06e02d799c96220bca51d93e02d6cee2e1e2d","unresolved":false,"context_lines":[{"line_number":242,"context_line":"        return dict(cell\u003d{\"capacities\": capacities})"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    @wsgi.serializers(xml\u003dCellTemplate)"},{"line_number":245,"context_line":"    def show(self, req, id):"},{"line_number":246,"context_line":"        \"\"\"Return data about the given cell name.  \u0027id\u0027 is a cell name.\"\"\""},{"line_number":247,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":248,"context_line":"        authorize(context)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FsIo%3D","line":245,"in_reply_to":"AAAAP3%2F%2FsQo%3D","updated":"2013-07-12 22:48:28.000000000","message":"Yeah…","commit_id":"c75f2481b98c6815cca0c98dbe16509ebd6d8bbd"}],"nova/cells/state.py":[{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"3d31abddd878202cc5fb06bd661ef577aaa63786","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    @functools.wraps(f)"},{"line_number":122,"context_line":"    def wrapper(self, *args, **kwargs):"},{"line_number":123,"context_line":"        if self.cells_config_file:"},{"line_number":124,"context_line":"            self._file_needs_resync():"},{"line_number":125,"context_line":"            if self._time_to_sync():"},{"line_number":126,"context_line":"                self.last_cell_db_check \u003d timeutils.utcnow()"},{"line_number":127,"context_line":"                self._update_our_capacity()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2Fp6c%3D","line":124,"updated":"2013-06-25 21:15:05.000000000","message":"extra colon at the end","commit_id":"8c94c97021ab31fb7b6c28536735e2f7bca1014b"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"172fc6b1b6a783a70166999e289aaec82c073dc3","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        return \"Cell \u0027%s\u0027 (%s)\" % (self.name, me)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"def sync_from_db(f):"},{"line_number":118,"context_line":"    \"\"\"Use as a decorator to wrap methods that use cell information to"},{"line_number":119,"context_line":"    make sure they sync the latest information from the DB periodically."},{"line_number":120,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FjmA%3D","line":117,"updated":"2013-06-27 20:48:14.000000000","message":"Function may no longer use the DB.  Name change?","commit_id":"bb360622beed16e6581eb8b6c4a447454272d962"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"37b71fae5b2e81815e7eaff82fcc8a001ddef453","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        return \"Cell \u0027%s\u0027 (%s)\" % (self.name, me)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"def sync_from_db(f):"},{"line_number":118,"context_line":"    \"\"\"Use as a decorator to wrap methods that use cell information to"},{"line_number":119,"context_line":"    make sure they sync the latest information from the DB periodically."},{"line_number":120,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FgbE%3D","line":117,"in_reply_to":"AAAAPn%2F%2Fji4%3D","updated":"2013-06-28 21:36:25.000000000","message":"How about just sync_before and sync_after? :)","commit_id":"bb360622beed16e6581eb8b6c4a447454272d962"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"8d6c075e685a8db26bc60a88469fef9524b97595","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        return \"Cell \u0027%s\u0027 (%s)\" % (self.name, me)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"def sync_from_db(f):"},{"line_number":118,"context_line":"    \"\"\"Use as a decorator to wrap methods that use cell information to"},{"line_number":119,"context_line":"    make sure they sync the latest information from the DB periodically."},{"line_number":120,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2Fji4%3D","line":117,"in_reply_to":"AAAAPn%2F%2FjmA%3D","updated":"2013-06-27 21:07:37.000000000","message":"Possibly.  I\u0027ve debated that.  Suggestions?","commit_id":"bb360622beed16e6581eb8b6c4a447454272d962"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"172fc6b1b6a783a70166999e289aaec82c073dc3","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        # NOTE(Vek): We want the constructor argument to override the"},{"line_number":162,"context_line":"        #            configuration setting even if it\u0027s None, which is"},{"line_number":163,"context_line":"        #            where the _unset singleton comes in..."},{"line_number":164,"context_line":"        if cells_config is _unset:"},{"line_number":165,"context_line":"            self.cells_config_file \u003d CONF.cells.cells_config"},{"line_number":166,"context_line":"        else:"},{"line_number":167,"context_line":"            self.cells_config_file \u003d cells_config"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2Fjkw%3D","line":164,"updated":"2013-06-27 20:48:14.000000000","message":"The if/else pattern with the cells_config_file everywhere is slightly awkward.\n\nWhat about using a factory to create the appropriate cell config manager?\n\nSomething like:\n\nself.cells_config \u003d CellConfigFactory(data_source)  # where data_source is either \u0027file\u0027 or \u0027db\u0027\n\nThe factory would return an object capable of doing sync, create, update, read, or delete.  In the case of file-based config, it could just raise the UpdateProhibited exception.","commit_id":"bb360622beed16e6581eb8b6c4a447454272d962"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"37b71fae5b2e81815e7eaff82fcc8a001ddef453","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        # NOTE(Vek): We want the constructor argument to override the"},{"line_number":162,"context_line":"        #            configuration setting even if it\u0027s None, which is"},{"line_number":163,"context_line":"        #            where the _unset singleton comes in..."},{"line_number":164,"context_line":"        if cells_config is _unset:"},{"line_number":165,"context_line":"            self.cells_config_file \u003d CONF.cells.cells_config"},{"line_number":166,"context_line":"        else:"},{"line_number":167,"context_line":"            self.cells_config_file \u003d cells_config"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FgbQ%3D","line":164,"in_reply_to":"AAAAPn%2F%2FjhM%3D","updated":"2013-06-28 21:36:25.000000000","message":"I certainly see that argument;  With only 2 implementations, it may not be worth the effort.","commit_id":"bb360622beed16e6581eb8b6c4a447454272d962"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"8d6c075e685a8db26bc60a88469fef9524b97595","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        # NOTE(Vek): We want the constructor argument to override the"},{"line_number":162,"context_line":"        #            configuration setting even if it\u0027s None, which is"},{"line_number":163,"context_line":"        #            where the _unset singleton comes in..."},{"line_number":164,"context_line":"        if cells_config is _unset:"},{"line_number":165,"context_line":"            self.cells_config_file \u003d CONF.cells.cells_config"},{"line_number":166,"context_line":"        else:"},{"line_number":167,"context_line":"            self.cells_config_file \u003d cells_config"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FjhM%3D","line":164,"in_reply_to":"AAAAPn%2F%2Fjkw%3D","updated":"2013-06-27 21:07:37.000000000","message":"Let\u0027s see…if I were to go that route, I would need to re-create this class as a common superclass, with two subclasses, one for each data source type.  I would need to rewrite the @sync_* decorators to call a single method on the instance to determine if a sync is needed, which is a little different than @sync_from_db right now.\n\nAt first, I was thinking this might end up more complex, but the more I think about it, the more it seems reasonable…","commit_id":"bb360622beed16e6581eb8b6c4a447454272d962"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"19c1bd507a8042e8e0bb29ab30c5ed3bcbf47c07","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"class CellStateManager(base.Base):"},{"line_number":144,"context_line":"    def __new__(cls, cell_state_cls\u003dNone, cells_config\u003d_unset):"},{"line_number":145,"context_line":"        if cls is not CellStateManager:"},{"line_number":146,"context_line":"            return super(CellStateManager, cls).__new__(cls)"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FsOE%3D","line":144,"updated":"2013-07-12 22:37:34.000000000","message":"cleverness :)","commit_id":"c75f2481b98c6815cca0c98dbe16509ebd6d8bbd"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"a7a06e02d799c96220bca51d93e02d6cee2e1e2d","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"class CellStateManager(base.Base):"},{"line_number":144,"context_line":"    def __new__(cls, cell_state_cls\u003dNone, cells_config\u003d_unset):"},{"line_number":145,"context_line":"        if cls is not CellStateManager:"},{"line_number":146,"context_line":"            return super(CellStateManager, cls).__new__(cls)"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FsIA%3D","line":144,"in_reply_to":"AAAAP3%2F%2FsOE%3D","updated":"2013-07-12 22:48:28.000000000","message":"*bow* thank you.  I started off with a standard factory function, then thought about it and decided I could do this easily with __new__()…","commit_id":"c75f2481b98c6815cca0c98dbe16509ebd6d8bbd"}],"nova/exception.py":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"19c1bd507a8042e8e0bb29ab30c5ed3bcbf47c07","unresolved":false,"context_lines":[{"line_number":884,"context_line":"    message \u003d _(\"Exception received during cell processing: %(exc_name)s.\")"},{"line_number":885,"context_line":""},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"class CellsUpdateProhibited(NovaException):"},{"line_number":888,"context_line":"    message \u003d _(\"Cannot update cells configuration file.\")"},{"line_number":889,"context_line":""},{"line_number":890,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FsNM%3D","line":887,"updated":"2013-07-12 22:37:34.000000000","message":"Unsupported might be more accurate than Prohibited?","commit_id":"c75f2481b98c6815cca0c98dbe16509ebd6d8bbd"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"a7a06e02d799c96220bca51d93e02d6cee2e1e2d","unresolved":false,"context_lines":[{"line_number":884,"context_line":"    message \u003d _(\"Exception received during cell processing: %(exc_name)s.\")"},{"line_number":885,"context_line":""},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"class CellsUpdateProhibited(NovaException):"},{"line_number":888,"context_line":"    message \u003d _(\"Cannot update cells configuration file.\")"},{"line_number":889,"context_line":""},{"line_number":890,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FsHg%3D","line":887,"in_reply_to":"AAAAP3%2F%2FsNM%3D","updated":"2013-07-12 22:48:28.000000000","message":"fair enough…","commit_id":"c75f2481b98c6815cca0c98dbe16509ebd6d8bbd"}]}
