)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"97376ba40f640500e70678aaef12989987721e11","unresolved":false,"context_lines":[{"line_number":11,"context_line":"we just call down to the old allow/deny methods"},{"line_number":12,"context_line":"iteratively."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Howver, they got underscore prefixed:"},{"line_number":15,"context_line":"{allow,deny}_access -\u003e _{allow,deny}_access"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Partially implements bp new-share-access-driver-interface"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9aed3d3a_399043ec","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":6},"updated":"2016-02-27 03:06:49.000000000","message":"However","commit_id":"a12defa308700d52f506d7337249801d571ebac6"},{"author":{"_account_id":9521,"name":"Csaba Henk","email":"chenk@redhat.com","username":"chenk"},"change_message_id":"589a997608eaddee99822ff5226238be4c4d2d05","unresolved":false,"context_lines":[{"line_number":11,"context_line":"we just call down to the old allow/deny methods"},{"line_number":12,"context_line":"iteratively."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Howver, they got underscore prefixed:"},{"line_number":15,"context_line":"{allow,deny}_access -\u003e _{allow,deny}_access"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Partially implements bp new-share-access-driver-interface"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9aed3d3a_76d2a45d","line":14,"in_reply_to":"9aed3d3a_399043ec","updated":"2016-02-29 12:45:10.000000000","message":"Done","commit_id":"a12defa308700d52f506d7337249801d571ebac6"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"97376ba40f640500e70678aaef12989987721e11","unresolved":false,"context_lines":[{"line_number":14,"context_line":"Howver, they got underscore prefixed:"},{"line_number":15,"context_line":"{allow,deny}_access -\u003e _{allow,deny}_access"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Partially implements bp new-share-access-driver-interface"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: Iea3a3ce3db44df792b5cf516979ff79c61d5b182"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9aed3d3a_19b29f94","line":17,"range":{"start_line":17,"start_character":24,"end_line":17,"end_character":57},"updated":"2016-02-27 03:06:49.000000000","message":"Please create a BP as suggested by other reviewers.","commit_id":"a12defa308700d52f506d7337249801d571ebac6"},{"author":{"_account_id":9521,"name":"Csaba Henk","email":"chenk@redhat.com","username":"chenk"},"change_message_id":"589a997608eaddee99822ff5226238be4c4d2d05","unresolved":false,"context_lines":[{"line_number":14,"context_line":"Howver, they got underscore prefixed:"},{"line_number":15,"context_line":"{allow,deny}_access -\u003e _{allow,deny}_access"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Partially implements bp new-share-access-driver-interface"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: Iea3a3ce3db44df792b5cf516979ff79c61d5b182"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9aed3d3a_56d7a04a","line":17,"in_reply_to":"9aed3d3a_19b29f94","updated":"2016-02-29 12:45:10.000000000","message":"Done","commit_id":"a12defa308700d52f506d7337249801d571ebac6"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"a24eb8fae9930269da05f4977442216a4fbda400","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"  update_access(..., access_rules, add_rules, delete_rules, ...)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"inferace should decide about recovery mode by access_rules"},{"line_number":27,"context_line":"conent and pass down either access_rules or add_rules"},{"line_number":28,"context_line":"to the helper\u0027s update_rules as add_rules (respectively in recovery"},{"line_number":29,"context_line":"and normal mode, and also setting the recovery_mode flag"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"dab17558_19f6d35c","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":8},"updated":"2016-05-17 02:44:59.000000000","message":"s / inferace / interface?","commit_id":"0b4285850c55b9d8a419b21ac37168c04efff94c"},{"author":{"_account_id":9521,"name":"Csaba Henk","email":"chenk@redhat.com","username":"chenk"},"change_message_id":"6766faf80dcaafec3913cebf60ddf7506ce40f3c","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"  update_access(..., access_rules, add_rules, delete_rules, ...)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"inferace should decide about recovery mode by access_rules"},{"line_number":27,"context_line":"conent and pass down either access_rules or add_rules"},{"line_number":28,"context_line":"to the helper\u0027s update_rules as add_rules (respectively in recovery"},{"line_number":29,"context_line":"and normal mode, and also setting the recovery_mode flag"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"9abb7d3a_0f47c177","line":26,"in_reply_to":"dab17558_19f6d35c","updated":"2016-05-31 18:22:00.000000000","message":"Done","commit_id":"0b4285850c55b9d8a419b21ac37168c04efff94c"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"a24eb8fae9930269da05f4977442216a4fbda400","unresolved":false,"context_lines":[{"line_number":24,"context_line":"  update_access(..., access_rules, add_rules, delete_rules, ...)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"inferace should decide about recovery mode by access_rules"},{"line_number":27,"context_line":"conent and pass down either access_rules or add_rules"},{"line_number":28,"context_line":"to the helper\u0027s update_rules as add_rules (respectively in recovery"},{"line_number":29,"context_line":"and normal mode, and also setting the recovery_mode flag"},{"line_number":30,"context_line":"appropriately). The driver is also responsible for checking"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"dab17558_3992b7f6","line":27,"range":{"start_line":27,"start_character":0,"end_line":27,"end_character":6},"updated":"2016-05-17 02:44:59.000000000","message":"s/conent/content ?","commit_id":"0b4285850c55b9d8a419b21ac37168c04efff94c"},{"author":{"_account_id":9521,"name":"Csaba Henk","email":"chenk@redhat.com","username":"chenk"},"change_message_id":"6766faf80dcaafec3913cebf60ddf7506ce40f3c","unresolved":false,"context_lines":[{"line_number":24,"context_line":"  update_access(..., access_rules, add_rules, delete_rules, ...)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"inferace should decide about recovery mode by access_rules"},{"line_number":27,"context_line":"conent and pass down either access_rules or add_rules"},{"line_number":28,"context_line":"to the helper\u0027s update_rules as add_rules (respectively in recovery"},{"line_number":29,"context_line":"and normal mode, and also setting the recovery_mode flag"},{"line_number":30,"context_line":"appropriately). The driver is also responsible for checking"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"9abb7d3a_4f5d4946","line":27,"in_reply_to":"dab17558_3992b7f6","updated":"2016-05-31 18:22:00.000000000","message":"Done","commit_id":"0b4285850c55b9d8a419b21ac37168c04efff94c"}],"manila/share/drivers/ganesha/__init__.py":[{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"1fb87593d1c0a4a3bba66d4bda36f013db93a06f","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                self._deny_access(base_path, share, rule)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        if add_rules is None and delete_rules is None:"},{"line_number":152,"context_line":"            for rule in access_rules:"},{"line_number":153,"context_line":"                self._allow_access(base_path, share, rule)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aed3d3a_67e6d4b5","line":153,"range":{"start_line":152,"start_character":0,"end_line":153,"end_character":58},"updated":"2016-02-26 12:20:11.000000000","message":"The implementation is wrong. This is the recovery mode of update_access. You must cleanup any previous rules existing on your backend.","commit_id":"85b7b4f16d4d45c59d8a4961d887939a1be2cf60"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"97376ba40f640500e70678aaef12989987721e11","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        \"\"\"Deny access to the share.\"\"\""},{"line_number":137,"context_line":"        self.ganesha.remove_export(\"%s--%s\" % (share[\u0027name\u0027], access[\u0027id\u0027]))"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def update_access(self, base_path, share, access_rules, add_rules\u003dNone,"},{"line_number":140,"context_line":"                      delete_rules\u003dNone):"},{"line_number":141,"context_line":"        \"\"\"Update access rules of share.\"\"\""},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_397e83ae","line":139,"range":{"start_line":139,"start_character":28,"end_line":139,"end_character":37},"updated":"2016-02-27 03:06:49.000000000","message":"base_path? Why is the RequestContext object called base_path? (here and everywhere else in this file?) \n\n(I hope the answer isn\u0027t that this isn\u0027t the goal of the commit to correct it here. Please correct it to \u0027context\u0027 or something along those lines in this method and everywhere else that you\u0027ve touched in this commit; i hope you\u0027ll be able to correct the other occurrences as a bug fix.)","commit_id":"a12defa308700d52f506d7337249801d571ebac6"},{"author":{"_account_id":9521,"name":"Csaba Henk","email":"chenk@redhat.com","username":"chenk"},"change_message_id":"589a997608eaddee99822ff5226238be4c4d2d05","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        \"\"\"Deny access to the share.\"\"\""},{"line_number":137,"context_line":"        self.ganesha.remove_export(\"%s--%s\" % (share[\u0027name\u0027], access[\u0027id\u0027]))"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def update_access(self, base_path, share, access_rules, add_rules\u003dNone,"},{"line_number":140,"context_line":"                      delete_rules\u003dNone):"},{"line_number":141,"context_line":"        \"\"\"Update access rules of share.\"\"\""},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_02fe9136","line":139,"in_reply_to":"9aed3d3a_397e83ae","updated":"2016-02-29 12:45:10.000000000","message":"Ganesha is not driver, but a library that allows one to implement an NFS Ganesha backed access helpers for drivers. It has its own interface for access management, which is not identical to, but resembles that of the driver interface (see http://docs.openstack.org/developer/manila/devref/ganesha.html#the-manila-share-drivers-ganesha-module). Thus we are changing the ganesa lib access interface to update_access not to comply the Manila project requirements (there being none against this lib), but to maintain that resemblance.\nAnd then base_path is indeed a path (a string), not a RequestContext instance. The ganesha lib allows one to establish exports under a certain prefix path -- that prefix is the base_path. So the Ganesha server running on \u003chost\u003e will export the shares \u003cshare1\u003e, \u003cshare2\u003e ... at \u003chost\u003e:/\u003cbase_path\u003e/\u003cshare1\u003e, \u003chost\u003e:/\u003cbase_path\u003e/\u003cshare2\u003e,  etc.\n\nThe only driver that currently makes use of the ganesha lib is glusterfs, and it\u0027s not setting the base_path. (Or more precisely, uses only base_parh \u003d \"/\").","commit_id":"a12defa308700d52f506d7337249801d571ebac6"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"97376ba40f640500e70678aaef12989987721e11","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        if add_rules is None and delete_rules is None:"},{"line_number":152,"context_line":"            for rule in access_rules:"},{"line_number":153,"context_line":"                self._allow_access(base_path, share, rule)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_3c48315b","line":153,"range":{"start_line":153,"start_character":16,"end_line":153,"end_character":58},"updated":"2016-02-27 03:06:49.000000000","message":"As Tiago suggested, this is a \"recovery\" case.. i.e, called when the driver is bounced; etc. So, by the logic expected, you should probably not have any export policies that aren\u0027t in the access_rules list being passed. Should you expunge all exports, or probably read all of them and delete those that aren\u0027t in the list?\n\nhttps://github.com/openstack/manila/blob/c288d90/manila/share/driver.py#L649","commit_id":"a12defa308700d52f506d7337249801d571ebac6"},{"author":{"_account_id":9521,"name":"Csaba Henk","email":"chenk@redhat.com","username":"chenk"},"change_message_id":"589a997608eaddee99822ff5226238be4c4d2d05","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        if add_rules is None and delete_rules is None:"},{"line_number":152,"context_line":"            for rule in access_rules:"},{"line_number":153,"context_line":"                self._allow_access(base_path, share, rule)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_4e62763f","line":153,"in_reply_to":"9aed3d3a_3c48315b","updated":"2016-02-29 12:45:10.000000000","message":"Thank you for spotting this, this is a really important point I missed. Actually we do expunge exports unconditionally upon service start, because as of the old access API, all service restart is considered a recovery case. I really hated to have to do that. Now with update_access we can move that reset action here, where it will be called only in due necessity.This is the main benefit of the update_access change as far as the ganesha lib is concerned. I just fell oblivious to that by some temporary mental malfunctions.","commit_id":"a12defa308700d52f506d7337249801d571ebac6"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"4c9a9549ddccf7648e9e52dd4fdf88d74b740c16","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                      delete_rules\u003dNone):"},{"line_number":141,"context_line":"        \"\"\"Update access rules of share.\"\"\""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        if add_rules:"},{"line_number":144,"context_line":"            for rule in add_rules:"},{"line_number":145,"context_line":"                self._allow_access(base_path, share, rule)"},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_19fe3138","line":143,"range":{"start_line":143,"start_character":8,"end_line":143,"end_character":20},"updated":"2016-03-02 12:57:42.000000000","message":"you should not need this check. \"\u003dNone\" will be removed from method signature in a later patch.","commit_id":"53c5673554e58997b762af951817689087166973"},{"author":{"_account_id":9521,"name":"Csaba Henk","email":"chenk@redhat.com","username":"chenk"},"change_message_id":"17f489f6480214fb1c5caa8281e14027e44577b7","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                      delete_rules\u003dNone):"},{"line_number":141,"context_line":"        \"\"\"Update access rules of share.\"\"\""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        if add_rules:"},{"line_number":144,"context_line":"            for rule in add_rules:"},{"line_number":145,"context_line":"                self._allow_access(base_path, share, rule)"},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_36caa01b","line":143,"in_reply_to":"7af24918_19fe3138","updated":"2016-03-10 12:47:51.000000000","message":"This function gets rewritten in next revison.","commit_id":"53c5673554e58997b762af951817689087166973"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"4c9a9549ddccf7648e9e52dd4fdf88d74b740c16","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            for rule in add_rules:"},{"line_number":145,"context_line":"                self._allow_access(base_path, share, rule)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        if delete_rules:"},{"line_number":148,"context_line":"            for rule in delete_rules:"},{"line_number":149,"context_line":"                self._deny_access(base_path, share, rule)"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_59f8b949","line":147,"range":{"start_line":147,"start_character":11,"end_line":147,"end_character":24},"updated":"2016-03-02 12:57:42.000000000","message":"you should not need this check. \"\u003dNone\" will be removed from method signature in a later patch.","commit_id":"53c5673554e58997b762af951817689087166973"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"4c9a9549ddccf7648e9e52dd4fdf88d74b740c16","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            for rule in delete_rules:"},{"line_number":149,"context_line":"                self._deny_access(base_path, share, rule)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        if add_rules is None and delete_rules is None:"},{"line_number":152,"context_line":"            self.ganesha.reset_exports()"},{"line_number":153,"context_line":"            self.ganesha.restart_service()"},{"line_number":154,"context_line":"            for rule in access_rules:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_59a6f953","line":151,"range":{"start_line":151,"start_character":8,"end_line":151,"end_character":54},"updated":"2016-03-02 12:57:42.000000000","message":"\"if not (add_rules or delete_rules)\" is nicer","commit_id":"53c5673554e58997b762af951817689087166973"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"675c5444e523991ab0d5dc79403c35e2f939c28d","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        \"\"\"Deny access to the share.\"\"\""},{"line_number":148,"context_line":"        self.ganesha.remove_export(\"%s--%s\" % (share[\u0027name\u0027], access[\u0027id\u0027]))"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def update_access(self, base_path, share, add_rules\u003d[], delete_rules\u003d[],"},{"line_number":151,"context_line":"                      recovery\u003dFalse):"},{"line_number":152,"context_line":"        \"\"\"Update access rules of share.\"\"\""},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5aef4532_cd5c831b","line":150,"range":{"start_line":150,"start_character":46,"end_line":150,"end_character":75},"updated":"2016-03-10 15:48:10.000000000","message":"These should not have default values.","commit_id":"a3830bb0c34290ca1b48a1d949d068ae052e9414"}],"manila/share/drivers/ganesha/manager.py":[{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"4c9a9549ddccf7648e9e52dd4fdf88d74b740c16","unresolved":false,"context_lines":[{"line_number":211,"context_line":"                     \u0027value int); insert into ganesha values(\"exportid\", \u0027"},{"line_number":212,"context_line":"                     \u0027100);\u0027, run_as_root\u003dFalse, check_exit_code\u003dFalse)"},{"line_number":213,"context_line":"        self.get_export_id(bump\u003dFalse)"},{"line_number":214,"context_line":"        # Starting from empty state. State will be rebuilt in a later"},{"line_number":215,"context_line":"        # stage of service initalization."},{"line_number":216,"context_line":"        self.reset_exports()"},{"line_number":217,"context_line":"        self.restart_service()"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _getpath(self, name):"},{"line_number":220,"context_line":"        \"\"\"Get the path of config file for name.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_193bd139","side":"PARENT","line":217,"range":{"start_line":214,"start_character":8,"end_line":217,"end_character":30},"updated":"2016-03-02 12:57:42.000000000","message":"how is this change related to the commit?","commit_id":"cdd2fb95b0ccc84cc66e0580ff1843ffa4786514"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a3c09511515e07e634977e06e305a798165027fc","unresolved":false,"context_lines":[{"line_number":211,"context_line":"                     \u0027value int); insert into ganesha values(\"exportid\", \u0027"},{"line_number":212,"context_line":"                     \u0027100);\u0027, run_as_root\u003dFalse, check_exit_code\u003dFalse)"},{"line_number":213,"context_line":"        self.get_export_id(bump\u003dFalse)"},{"line_number":214,"context_line":"        # Starting from empty state. State will be rebuilt in a later"},{"line_number":215,"context_line":"        # stage of service initalization."},{"line_number":216,"context_line":"        self.reset_exports()"},{"line_number":217,"context_line":"        self.restart_service()"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _getpath(self, name):"},{"line_number":220,"context_line":"        \"\"\"Get the path of config file for name.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_4eabcad6","side":"PARENT","line":217,"range":{"start_line":214,"start_character":8,"end_line":217,"end_character":30},"in_reply_to":"7af24918_193bd139","updated":"2016-03-02 13:15:37.000000000","message":"I guess it was because of this conversation regarding line # 153.. \n\nhttps://review.openstack.org/#/c/282602/3/manila/share/drivers/ganesha/__init__.py","commit_id":"cdd2fb95b0ccc84cc66e0580ff1843ffa4786514"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"3aa0108d35720acb0c5be50d2cc9c82e1dc9bfb3","unresolved":false,"context_lines":[{"line_number":211,"context_line":"                     \u0027value int); insert into ganesha values(\"exportid\", \u0027"},{"line_number":212,"context_line":"                     \u0027100);\u0027, run_as_root\u003dFalse, check_exit_code\u003dFalse)"},{"line_number":213,"context_line":"        self.get_export_id(bump\u003dFalse)"},{"line_number":214,"context_line":"        # Starting from empty state. State will be rebuilt in a later"},{"line_number":215,"context_line":"        # stage of service initalization."},{"line_number":216,"context_line":"        self.reset_exports()"},{"line_number":217,"context_line":"        self.restart_service()"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _getpath(self, name):"},{"line_number":220,"context_line":"        \"\"\"Get the path of config file for name.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_3778388f","side":"PARENT","line":217,"range":{"start_line":214,"start_character":8,"end_line":217,"end_character":30},"in_reply_to":"7af24918_4eabcad6","updated":"2016-03-02 18:12:39.000000000","message":"Thanks! indeed makes sense!","commit_id":"cdd2fb95b0ccc84cc66e0580ff1843ffa4786514"}],"manila/share/drivers/ganesha/utils.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"ce02007ce9d25cb316e246f82f637a84a00a4106","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            return True"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        access_param[\u0027field\u0027] \u003d field"},{"line_number":115,"context_line":"        access_param[\u0027supported\u0027] \u003d \u0027, \u0027.join(tuple("},{"line_number":116,"context_line":"            [\"\u0027%s\u0027\" % x for x in supported_tokens]))"},{"line_number":117,"context_line":"        if abort:"},{"line_number":118,"context_line":"            LOG.error(errmsg % access_param)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_dcecfc94","line":115,"range":{"start_line":115,"start_character":46,"end_line":115,"end_character":52},"updated":"2016-04-21 14:23:18.000000000","message":"\"tuple\" translation looks redundant.","commit_id":"0b4285850c55b9d8a419b21ac37168c04efff94c"},{"author":{"_account_id":9521,"name":"Csaba Henk","email":"chenk@redhat.com","username":"chenk"},"change_message_id":"6766faf80dcaafec3913cebf60ddf7506ce40f3c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            return True"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        access_param[\u0027field\u0027] \u003d field"},{"line_number":115,"context_line":"        access_param[\u0027supported\u0027] \u003d \u0027, \u0027.join(tuple("},{"line_number":116,"context_line":"            [\"\u0027%s\u0027\" % x for x in supported_tokens]))"},{"line_number":117,"context_line":"        if abort:"},{"line_number":118,"context_line":"            LOG.error(errmsg % access_param)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9abb7d3a_afa83521","line":115,"in_reply_to":"1a122d0e_dcecfc94","updated":"2016-05-31 18:22:00.000000000","message":"Done","commit_id":"0b4285850c55b9d8a419b21ac37168c04efff94c"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"96261071c8ade66c10cb2719614ba137a5763344","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            [\"\u0027%s\u0027\" % x for x in supported_tokens]))"},{"line_number":117,"context_line":"        if abort:"},{"line_number":118,"context_line":"            LOG.error(errmsg % access_param)"},{"line_number":119,"context_line":"            raise excinfo[0](**{excinfo[1]: excinfo[2] % access_param})"},{"line_number":120,"context_line":"        else:"},{"line_number":121,"context_line":"            LOG.warning(errmsg % access_param)"},{"line_number":122,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a061dce_f10a0325","line":119,"updated":"2016-04-07 12:02:29.000000000","message":"A nit. I believe a dictionary instead of a tuple here would make the code much clearer.","commit_id":"0b4285850c55b9d8a419b21ac37168c04efff94c"},{"author":{"_account_id":9521,"name":"Csaba Henk","email":"chenk@redhat.com","username":"chenk"},"change_message_id":"6766faf80dcaafec3913cebf60ddf7506ce40f3c","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            [\"\u0027%s\u0027\" % x for x in supported_tokens]))"},{"line_number":117,"context_line":"        if abort:"},{"line_number":118,"context_line":"            LOG.error(errmsg % access_param)"},{"line_number":119,"context_line":"            raise excinfo[0](**{excinfo[1]: excinfo[2] % access_param})"},{"line_number":120,"context_line":"        else:"},{"line_number":121,"context_line":"            LOG.warning(errmsg % access_param)"},{"line_number":122,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":12,"id":"9abb7d3a_ef64fd22","line":119,"in_reply_to":"9a061dce_f10a0325","updated":"2016-05-31 18:22:00.000000000","message":"Done","commit_id":"0b4285850c55b9d8a419b21ac37168c04efff94c"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"10484a6eebb8ad3de7e8aafcc261133d711dbdc7","unresolved":false,"context_lines":[{"line_number":97,"context_line":"           valid."},{"line_number":98,"context_line":"    :param supported_access_levels: List of access levels that are"},{"line_number":99,"context_line":"           regarded valid."},{"line_number":100,"context_line":"    :param abort: Boolean; if rule is invalid and abort, an exception is"},{"line_number":101,"context_line":"                  raised."},{"line_number":102,"context_line":"    :return: Boolean."},{"line_number":103,"context_line":"    \"\"\""},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7aa08908_e3774d9d","line":101,"range":{"start_line":100,"start_character":0,"end_line":101,"end_character":25},"updated":"2016-06-06 19:34:04.000000000","message":"this wording is confusing, could you please replace to:\n\n    :param abort: a boolean value that indicates if an exception should be raised whether the rule is invalid.","commit_id":"1cb1bfff8732937b643c69325f2f3e54e680d803"},{"author":{"_account_id":9521,"name":"Csaba Henk","email":"chenk@redhat.com","username":"chenk"},"change_message_id":"c18528cd483ce990d32da2f17d8b24ebfa7a7763","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    :param supported_access_levels: List of access levels that are"},{"line_number":99,"context_line":"           regarded valid."},{"line_number":100,"context_line":"    :param abort: Boolean; if rule is invalid and abort, an exception is"},{"line_number":101,"context_line":"                  raised."},{"line_number":102,"context_line":"    :return: Boolean."},{"line_number":103,"context_line":"    \"\"\""},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7aa08908_18760d06","line":101,"in_reply_to":"7aa08908_e3774d9d","updated":"2016-06-07 16:22:40.000000000","message":"Thanks for the improved wording. One nit, I think \"Boolean\" should be kept capitalized.","commit_id":"1cb1bfff8732937b643c69325f2f3e54e680d803"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"e40d0360ae9c74f71cb80677fa357271e9176581","unresolved":false,"context_lines":[{"line_number":97,"context_line":"           valid."},{"line_number":98,"context_line":"    :param supported_access_levels: List of access levels that are"},{"line_number":99,"context_line":"           regarded valid."},{"line_number":100,"context_line":"    :param abort: a Bboolean value that indicates if an exception should"},{"line_number":101,"context_line":"                  be raised whether the rule is invalid."},{"line_number":102,"context_line":"    :return: Boolean."},{"line_number":103,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"7aa08908_559ce95c","line":100,"range":{"start_line":100,"start_character":18,"end_line":100,"end_character":28},"updated":"2016-06-12 03:35:27.000000000","message":"s/ a Bboolean / a boolean","commit_id":"20063ea894bc37ceea6ba67de6e0de49c51e4374"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"c474f00e82ecc225f761566d2f32e2e060da5c70","unresolved":false,"context_lines":[{"line_number":97,"context_line":"           valid."},{"line_number":98,"context_line":"    :param supported_access_levels: List of access levels that are"},{"line_number":99,"context_line":"           regarded valid."},{"line_number":100,"context_line":"    :param abort: a Bboolean value that indicates if an exception should"},{"line_number":101,"context_line":"                  be raised whether the rule is invalid."},{"line_number":102,"context_line":"    :return: Boolean."},{"line_number":103,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"7aa08908_e996c03c","line":100,"range":{"start_line":100,"start_character":18,"end_line":100,"end_character":28},"in_reply_to":"7aa08908_559ce95c","updated":"2016-06-13 12:45:51.000000000","message":"+1","commit_id":"20063ea894bc37ceea6ba67de6e0de49c51e4374"},{"author":{"_account_id":9521,"name":"Csaba Henk","email":"chenk@redhat.com","username":"chenk"},"change_message_id":"51ac9a5558d1938aa87a951a0c3208d823af110a","unresolved":false,"context_lines":[{"line_number":97,"context_line":"           valid."},{"line_number":98,"context_line":"    :param supported_access_levels: List of access levels that are"},{"line_number":99,"context_line":"           regarded valid."},{"line_number":100,"context_line":"    :param abort: a Bboolean value that indicates if an exception should"},{"line_number":101,"context_line":"                  be raised whether the rule is invalid."},{"line_number":102,"context_line":"    :return: Boolean."},{"line_number":103,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"7aa08908_2911da52","line":100,"in_reply_to":"7aa08908_e996c03c","updated":"2016-06-13 17:30:06.000000000","message":"Done","commit_id":"20063ea894bc37ceea6ba67de6e0de49c51e4374"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"1aea88a15b1062d8c02097b05314a1711ecec8dc","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    :return: Boolean."},{"line_number":103,"context_line":"    \"\"\""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    errmsg \u003d _(\"Unsupported access rule of \u0027type\u0027 %(access_type)s, \""},{"line_number":106,"context_line":"               \"\u0027level\u0027 %(access_level)s, \u0027to\u0027 %(access_to)s: \""},{"line_number":107,"context_line":"               \"%(field)s should be one of %(supported)s.\")"},{"line_number":108,"context_line":"    access_param \u003d access_rule.to_dict()"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def validate(field, supported_tokens, excinfo):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7aa08908_4901d405","line":107,"range":{"start_line":105,"start_character":4,"end_line":107,"end_character":59},"updated":"2016-06-13 13:03:47.000000000","message":"errmsg \u003d (\n    \"Unsupported access rule of \u0027type\u0027 %(access_type)s, \"\n    \"\u0027level\u0027 %(access_level)s, \u0027to\u0027 %(access_to)s: \"\n    \"%(field)s should be one of %(supported)s.\")\n\nLOG.error(_LE(errmsg), access_param)\nLOG.error(_LW(errmsg), access_param)","commit_id":"20063ea894bc37ceea6ba67de6e0de49c51e4374"},{"author":{"_account_id":9521,"name":"Csaba Henk","email":"chenk@redhat.com","username":"chenk"},"change_message_id":"51ac9a5558d1938aa87a951a0c3208d823af110a","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    errmsg \u003d _(\"Unsupported access rule of \u0027type\u0027 %(access_type)s, \""},{"line_number":106,"context_line":"               \"\u0027level\u0027 %(access_level)s, \u0027to\u0027 %(access_to)s: \""},{"line_number":107,"context_line":"               \"%(field)s should be one of %(supported)s.\")"},{"line_number":108,"context_line":"    access_param \u003d access_rule.to_dict()"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def validate(field, supported_tokens, excinfo):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7aa08908_e9587233","line":107,"in_reply_to":"7aa08908_4901d405","updated":"2016-06-13 17:30:06.000000000","message":"This throws \"H701  Empty localization string\". Is it not the case that the _*() localization functions should only be used on literals?","commit_id":"20063ea894bc37ceea6ba67de6e0de49c51e4374"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"e40d0360ae9c74f71cb80677fa357271e9176581","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            raise excinfo[\u0027type\u0027]("},{"line_number":120,"context_line":"                **{excinfo[\u0027about\u0027]: excinfo[\u0027details\u0027] % access_param})"},{"line_number":121,"context_line":"        else:"},{"line_number":122,"context_line":"            LOG.warning(errmsg % access_param)"},{"line_number":123,"context_line":"            return False"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    valid \u003d True"}],"source_content_type":"text/x-python","patch_set":14,"id":"7aa08908_55850905","line":122,"range":{"start_line":122,"start_character":12,"end_line":122,"end_character":23},"updated":"2016-06-12 03:35:27.000000000","message":"The warning log need to add \u0027_LW\u0027 in front of a word.","commit_id":"20063ea894bc37ceea6ba67de6e0de49c51e4374"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"c474f00e82ecc225f761566d2f32e2e060da5c70","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            raise excinfo[\u0027type\u0027]("},{"line_number":120,"context_line":"                **{excinfo[\u0027about\u0027]: excinfo[\u0027details\u0027] % access_param})"},{"line_number":121,"context_line":"        else:"},{"line_number":122,"context_line":"            LOG.warning(errmsg % access_param)"},{"line_number":123,"context_line":"            return False"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    valid \u003d True"}],"source_content_type":"text/x-python","patch_set":14,"id":"7aa08908_69abf075","line":122,"range":{"start_line":122,"start_character":12,"end_line":122,"end_character":23},"in_reply_to":"7aa08908_55850905","updated":"2016-06-13 12:45:51.000000000","message":"I believe this is not needed, since _() is already used.","commit_id":"20063ea894bc37ceea6ba67de6e0de49c51e4374"}],"manila/share/drivers/glusterfs/__init__.py":[{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"4c9a9549ddccf7648e9e52dd4fdf88d74b740c16","unresolved":false,"context_lines":[{"line_number":246,"context_line":"                      delete_rules\u003dNone):"},{"line_number":247,"context_line":"        \"\"\"Update access rules of share.\"\"\""},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"        # Stub needed to meeet parent\u0027s implementation enforcement."},{"line_number":250,"context_line":"        raise NotImplementedError"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_3927ad13","line":249,"range":{"start_line":249,"start_character":26,"end_line":249,"end_character":29},"updated":"2016-03-02 12:57:42.000000000","message":"meet","commit_id":"53c5673554e58997b762af951817689087166973"},{"author":{"_account_id":9521,"name":"Csaba Henk","email":"chenk@redhat.com","username":"chenk"},"change_message_id":"17f489f6480214fb1c5caa8281e14027e44577b7","unresolved":false,"context_lines":[{"line_number":246,"context_line":"                      delete_rules\u003dNone):"},{"line_number":247,"context_line":"        \"\"\"Update access rules of share.\"\"\""},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"        # Stub needed to meeet parent\u0027s implementation enforcement."},{"line_number":250,"context_line":"        raise NotImplementedError"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_f6f038cb","line":249,"in_reply_to":"7af24918_3927ad13","updated":"2016-03-10 12:47:51.000000000","message":"Done","commit_id":"53c5673554e58997b762af951817689087166973"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"675c5444e523991ab0d5dc79403c35e2f939c28d","unresolved":false,"context_lines":[{"line_number":242,"context_line":"        self._manage_access(path[1:], access[\u0027access_type\u0027],"},{"line_number":243,"context_line":"                            access[\u0027access_to\u0027], cbk)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    def update_access(self, base_path, share, add_rules\u003d[], delete_rules\u003d[],"},{"line_number":246,"context_line":"                      recovery\u003dFalse):"},{"line_number":247,"context_line":"        \"\"\"Update access rules of share.\"\"\""},{"line_number":248,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5aef4532_4d7073a4","line":245,"range":{"start_line":245,"start_character":46,"end_line":245,"end_character":75},"updated":"2016-03-10 15:48:10.000000000","message":"These should not have default values.","commit_id":"a3830bb0c34290ca1b48a1d949d068ae052e9414"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"10484a6eebb8ad3de7e8aafcc261133d711dbdc7","unresolved":false,"context_lines":[{"line_number":361,"context_line":"                \"Volume\": self.gluster_manager.volume,"},{"line_number":362,"context_line":"                \"Volpath\": self.gluster_manager.path}"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    # TODO(csaba): remove the following when the driver moves to update_access"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    def allow_access(self, *a, **kw):"},{"line_number":367,"context_line":"        self._allow_access(*a, **kw)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    def deny_access(self, *a, **kw):"},{"line_number":370,"context_line":"        self._deny_access(*a, **kw)"}],"source_content_type":"text/x-python","patch_set":13,"id":"7aa08908_e3d3cd5d","line":370,"range":{"start_line":364,"start_character":4,"end_line":370,"end_character":35},"updated":"2016-06-06 19:34:04.000000000","message":"isn\u0027t the driver moving to update_access right now??","commit_id":"1cb1bfff8732937b643c69325f2f3e54e680d803"},{"author":{"_account_id":9521,"name":"Csaba Henk","email":"chenk@redhat.com","username":"chenk"},"change_message_id":"c18528cd483ce990d32da2f17d8b24ebfa7a7763","unresolved":false,"context_lines":[{"line_number":367,"context_line":"        self._allow_access(*a, **kw)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    def deny_access(self, *a, **kw):"},{"line_number":370,"context_line":"        self._deny_access(*a, **kw)"}],"source_content_type":"text/x-python","patch_set":13,"id":"7aa08908_92977c39","line":370,"in_reply_to":"7aa08908_e3d3cd5d","updated":"2016-06-07 16:22:40.000000000","message":"The GlusterFS drivers and the Ganesha lib are independent bodies of code, so I\u0027d like to keep their respective API updates separate. So the question is, in what order should we have the two changes?\n\nIn whatever order, we have to insert some temporary glue code to the change that comes first to avoid breaking it.\n\nIf we update the lib first, the {allow,deny}_access lib interface, to which the glusterfs driver is delegating to, is going away, and we have to work that around. If we update the drivers first, then the update_access driver method needs a temporary implementation: it has to be assembled in driver scope from the {allow,deny}_access primitives of the library; but then in the subsequent change, which endows the lib with an update_access interface, it would be dropped and replaced by delegation.\n\nAs the lib\u0027s change does not drop the {allow,deny}_access logic, just removes it from the interface (by underscore prefixing these methods), restoring the delegation is cheap and can be done as in the disputed hunk. Assembling the driver\u0027s update_access on a temporary base would be much more laborious and error prone.\n\nTherefore I opted for the \"lib update first, driver update second\" approach.","commit_id":"1cb1bfff8732937b643c69325f2f3e54e680d803"}],"manila/tests/share/drivers/ganesha/test_manager.py":[{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"4c9a9549ddccf7648e9e52dd4fdf88d74b740c16","unresolved":false,"context_lines":[{"line_number":169,"context_line":"                       \u0027100);\u0027, run_as_root\u003dFalse, check_exit_code\u003dFalse)],"},{"line_number":170,"context_line":"            self._execute.call_args_list)"},{"line_number":171,"context_line":"        self.mock_get_export_id.assert_called_once_with(bump\u003dFalse)"},{"line_number":172,"context_line":"        self.mock_reset_exports.assert_called_once_with()"},{"line_number":173,"context_line":"        self.mock_restart_service.assert_called_once_with()"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def test_init_execute_error_log_message(self):"},{"line_number":176,"context_line":"        fake_args \u003d (\u0027foo\u0027, \u0027bar\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_f95a6582","side":"PARENT","line":173,"range":{"start_line":172,"start_character":5,"end_line":173,"end_character":59},"updated":"2016-03-02 12:57:42.000000000","message":"how is this change related to commit?","commit_id":"cdd2fb95b0ccc84cc66e0580ff1843ffa4786514"},{"author":{"_account_id":9521,"name":"Csaba Henk","email":"chenk@redhat.com","username":"chenk"},"change_message_id":"17f489f6480214fb1c5caa8281e14027e44577b7","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            self._execute.call_args_list)"},{"line_number":171,"context_line":"        self.mock_get_export_id.assert_called_once_with(bump\u003dFalse)"},{"line_number":172,"context_line":"        self.mock_reset_exports.assert_called_once_with()"},{"line_number":173,"context_line":"        self.mock_restart_service.assert_called_once_with()"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def test_init_execute_error_log_message(self):"},{"line_number":176,"context_line":"        fake_args \u003d (\u0027foo\u0027, \u0027bar\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5aef4532_7640a807","side":"PARENT","line":173,"in_reply_to":"7af24918_f95a6582","updated":"2016-03-10 12:47:51.000000000","message":"follows up with the change in GaneshaManager.__init__ as discussed there.","commit_id":"cdd2fb95b0ccc84cc66e0580ff1843ffa4786514"}]}
