)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"8e4bd3b5f727ddbc33ccd95f024a810a77a6566f","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds the support of NFS Ganesha in GPFS driver through"},{"line_number":10,"context_line":"Spectrum Scale CES/protocol servers for NFS exports."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I8eb307c19761788ea71c15c889794f8b5f110253"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"1aa78d24_48ae2ce8","line":11,"updated":"2016-07-15 09:47:51.000000000","message":"Any blueprint or bugreport? Why you do \"replacement\" instead of \"extending\" functionality?","commit_id":"d3d1ba16ff21eb575f8d62d7bb3dd0c4f68e5954"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"4251448ce48ca1fba712710e8bb5176fcc3c0099","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Gaurang \u003cgaurang.tapase@in.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-18 16:40:02 +0530"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Refactor GPFS driver to support NFS Ganesha through Spectrum Scale CES"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Spectrum Scale supports NFS ganesha through CES protocol services. This"},{"line_number":10,"context_line":"change replaces the current NFS ganesha support with the Spectrum Scale"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"dada55a8_c13ccb31","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":70},"updated":"2016-07-19 01:56:18.000000000","message":"Please limit to 50 characters.","commit_id":"638b7e0097accefbe49ea2253ac057b8e45a0a18"}],"manila/share/drivers/ibm/gpfs.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"f0e847e6b3ea7f1d6e6b7db7f9440c5c1621d1f5","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                    \u0027GNFS\u003dmanila.share.drivers.ibm.gpfs.GNFSHelper\u0027,"},{"line_number":90,"context_line":"                ],"},{"line_number":91,"context_line":"                help\u003d\u0027Specify list of share export helpers.\u0027),"},{"line_number":92,"context_line":"    cfg.StrOpt(\u0027knfs_export_options\u0027,"},{"line_number":93,"context_line":"               default\u003d(\u0027rw,sync,no_root_squash,insecure,no_wdelay,\u0027"},{"line_number":94,"context_line":"                        \u0027no_subtree_check\u0027),"},{"line_number":95,"context_line":"               help\u003d(\u0027Options to use when exporting a share using kernel \u0027"},{"line_number":96,"context_line":"                     \u0027NFS server. Note that these defaults can be overridden \u0027"},{"line_number":97,"context_line":"                     \u0027when a share is created by passing metadata with key \u0027"},{"line_number":98,"context_line":"                     \u0027name export_options.\u0027)),"},{"line_number":99,"context_line":"]"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_0c7b5a29","side":"PARENT","line":98,"range":{"start_line":92,"start_character":4,"end_line":98,"end_character":46},"updated":"2016-06-13 13:23:15.000000000","message":"It should follow \"deprecation\" approach saying it is ignored.","commit_id":"48ba5fc1173eb6f338323335890391c70323d319"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"f0e847e6b3ea7f1d6e6b7db7f9440c5c1621d1f5","unresolved":false,"context_lines":[{"line_number":528,"context_line":"            LOG.error(msg)"},{"line_number":529,"context_line":"            raise exception.GPFSException(msg)"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"        if self.configuration.gpfs_nfs_server_type not in [\u0027KNFS\u0027, \u0027CES\u0027]:"},{"line_number":532,"context_line":"            msg \u003d (_(\u0027Invalid gpfs_nfs_server_type value: %s. \u0027"},{"line_number":533,"context_line":"                     \u0027Valid values are: \"KNFS\", \"CES\".\u0027)"},{"line_number":534,"context_line":"                   % self.configuration.gpfs_nfs_server_type)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_6c565e2b","line":531,"range":{"start_line":531,"start_character":60,"end_line":531,"end_character":71},"updated":"2016-06-13 13:23:15.000000000","message":"What about backwards compatibility? How people should port existing GNFS stuff to CES?","commit_id":"dd8ea88678b9332f0541340b58b3473dfde5f75b"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"f0e847e6b3ea7f1d6e6b7db7f9440c5c1621d1f5","unresolved":false,"context_lines":[{"line_number":652,"context_line":"        options_not_allowed \u003d [\u0027ro\u0027, \u0027rw\u0027]"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"        invalid_options \u003d ["},{"line_number":655,"context_line":"            option for option in options if option in options_not_allowed"},{"line_number":656,"context_line":"        ]"},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"        if invalid_options:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_a727bfb4","line":655,"range":{"start_line":655,"start_character":12,"end_line":655,"end_character":73},"updated":"2016-06-13 13:23:15.000000000","message":"Nice line. \u003d)","commit_id":"dd8ea88678b9332f0541340b58b3473dfde5f75b"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"255183abbe4f265e68276d5f05c4dc7b82e12fb2","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                    \u0027GNFS\u003dmanila.share.drivers.ibm.gpfs.GNFSHelper\u0027,"},{"line_number":90,"context_line":"                ],"},{"line_number":91,"context_line":"                help\u003d\u0027Specify list of share export helpers.\u0027),"},{"line_number":92,"context_line":"    cfg.StrOpt(\u0027knfs_export_options\u0027,"},{"line_number":93,"context_line":"               default\u003d(\u0027rw,sync,no_root_squash,insecure,no_wdelay,\u0027"},{"line_number":94,"context_line":"                        \u0027no_subtree_check\u0027),"},{"line_number":95,"context_line":"               help\u003d(\u0027Options to use when exporting a share using kernel \u0027"},{"line_number":96,"context_line":"                     \u0027NFS server. Note that these defaults can be overridden \u0027"},{"line_number":97,"context_line":"                     \u0027when a share is created by passing metadata with key \u0027"},{"line_number":98,"context_line":"                     \u0027name export_options.\u0027)),"},{"line_number":99,"context_line":"]"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_6d45d16d","side":"PARENT","line":98,"range":{"start_line":92,"start_character":4,"end_line":98,"end_character":46},"updated":"2016-06-17 11:06:31.000000000","message":"Once again, we should not just remove any options without \"deprecation\" approach. It means, that if you stop using it, then you need to catch its definition and make warning that it is ignored.","commit_id":"48ba5fc1173eb6f338323335890391c70323d319"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"255183abbe4f265e68276d5f05c4dc7b82e12fb2","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    cfg.ListOpt(\u0027gpfs_nfs_server_list\u0027,"},{"line_number":71,"context_line":"                help\u003d(\u0027A list of the fully qualified NFS server names that \u0027"},{"line_number":72,"context_line":"                      \u0027make up the OpenStack Manila configuration.\u0027)),"},{"line_number":73,"context_line":"    cfg.StrOpt(\u0027is_gpfs_node\u0027,"},{"line_number":74,"context_line":"               help\u003d(\u0027True:when Manila services are running on one of the\u0027"},{"line_number":75,"context_line":"                     \u0027Spectrum Scale node \u0027"},{"line_number":76,"context_line":"                     \u0027False:when Manila services are not running on any of \u0027"},{"line_number":77,"context_line":"                     \u0027the Spectrum Scale node \u0027)),"},{"line_number":78,"context_line":"    cfg.PortOpt(\u0027gpfs_ssh_port\u0027,"},{"line_number":79,"context_line":"                default\u003d22,"},{"line_number":80,"context_line":"                help\u003d\u0027GPFS server SSH port.\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_adacd9ed","line":77,"range":{"start_line":73,"start_character":4,"end_line":77,"end_character":50},"updated":"2016-06-17 11:06:31.000000000","message":"Why do you define \"bool\" option as \"string\" and then workaround it below?","commit_id":"f1446934400bac3b34106301dec0ff44f6bc52d4"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"255183abbe4f265e68276d5f05c4dc7b82e12fb2","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    def do_setup(self, context):"},{"line_number":130,"context_line":"        \"\"\"Any initialization the share driver does while starting.\"\"\""},{"line_number":131,"context_line":"        super(GPFSShareDriver, self).do_setup(context)"},{"line_number":132,"context_line":"        if self.configuration.is_gpfs_node \u003d\u003d \u0027True\u0027:"},{"line_number":133,"context_line":"            self._gpfs_execute \u003d self._gpfs_local_execute"},{"line_number":134,"context_line":"        else:"},{"line_number":135,"context_line":"            self._gpfs_execute \u003d self._gpfs_remote_execute"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_4d829553","line":132,"range":{"start_line":132,"start_character":8,"end_line":132,"end_character":53},"updated":"2016-06-17 11:06:31.000000000","message":"Just define this opt as boolean and do following:\n\n\"\"\"\nif self.configuration.is_gpfs_node:\n\"\"\"","commit_id":"f1446934400bac3b34106301dec0ff44f6bc52d4"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"255183abbe4f265e68276d5f05c4dc7b82e12fb2","unresolved":false,"context_lines":[{"line_number":535,"context_line":"            LOG.error(msg)"},{"line_number":536,"context_line":"            raise exception.GPFSException(msg)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        if self.configuration.is_gpfs_node not in [\u0027True\u0027, \u0027False\u0027]:"},{"line_number":539,"context_line":"            msg \u003d (_(\u0027Invalid is_gpfs_node value: %s. \u0027"},{"line_number":540,"context_line":"                     \u0027Valid values are: \"True\", \"False\".\u0027)"},{"line_number":541,"context_line":"                   % self.configuration.gpfs_nfs_server_type)"},{"line_number":542,"context_line":"            LOG.error(msg)"},{"line_number":543,"context_line":"            raise exception.InvalidParameterValue(err\u003dmsg)"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"        if self.configuration.gpfs_nfs_server_type not in [\u0027KNFS\u0027, \u0027CES\u0027]:"},{"line_number":546,"context_line":"            msg \u003d (_(\u0027Invalid gpfs_nfs_server_type value: %s. \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_0d8d2d7c","line":543,"range":{"start_line":538,"start_character":8,"end_line":543,"end_character":58},"updated":"2016-06-17 11:06:31.000000000","message":"It is redundant if make option required and be defined as of boolean type not setting default value.","commit_id":"f1446934400bac3b34106301dec0ff44f6bc52d4"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"255183abbe4f265e68276d5f05c4dc7b82e12fb2","unresolved":false,"context_lines":[{"line_number":542,"context_line":"            LOG.error(msg)"},{"line_number":543,"context_line":"            raise exception.InvalidParameterValue(err\u003dmsg)"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"        if self.configuration.gpfs_nfs_server_type not in [\u0027KNFS\u0027, \u0027CES\u0027]:"},{"line_number":546,"context_line":"            msg \u003d (_(\u0027Invalid gpfs_nfs_server_type value: %s. \u0027"},{"line_number":547,"context_line":"                     \u0027Valid values are: \"KNFS\", \"CES\".\u0027)"},{"line_number":548,"context_line":"                   % self.configuration.gpfs_nfs_server_type)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_38a029f4","line":545,"range":{"start_line":545,"start_character":58,"end_line":545,"end_character":74},"updated":"2016-06-17 11:06:31.000000000","message":"Use tuple for cases when you do not need special list methods/possibilities. Tuple is 10 times faster than list.\n\n\"\"\"\nif self.configuration.gpfs_nfs_server_type not in (\"KNFS\", \"CES\"):\n\n\"\"\"","commit_id":"f1446934400bac3b34106301dec0ff44f6bc52d4"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"130c83ceceb7d9805c450efb18c660f469033258","unresolved":false,"context_lines":[{"line_number":411,"context_line":"        sharename \u003d snapshot[\u0027share_name\u0027]"},{"line_number":412,"context_line":"        snapshotname \u003d snapshot[\u0027name\u0027]"},{"line_number":413,"context_line":"        fsdev \u003d self._get_gpfs_device()"},{"line_number":414,"context_line":"        msg \u003d (_(\u0027sharename \u003d %(share)s, snapshotname \u003d %(snap)s,\u0027"},{"line_number":415,"context_line":"                 \u0027fsdev \u003d %(dev)s\u0027) %"},{"line_number":416,"context_line":"               {\u0027share\u0027: sharename, \u0027snap\u0027: snapshotname, \u0027dev\u0027: fsdev})"},{"line_number":417,"context_line":"        LOG.debug(msg)"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"        try:"},{"line_number":420,"context_line":"            self._gpfs_execute(\u0027mmcrsnapshot\u0027, fsdev, snapshot[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"fad55976_4d1dedbc","line":417,"range":{"start_line":414,"start_character":8,"end_line":417,"end_character":22},"updated":"2016-07-15 14:46:43.000000000","message":"Debug message should not be translated and substitution container should be second argument. Example:\n\n\"\"\"\nLOG.debug(\n    \"sharename \u003d %(share)s, snapshotname \u003d %(snap)s, fsdev \u003d %(dev)s\",\n    {\u0027share\u0027: sharename, \u0027snap\u0027: snapshotname, \u0027dev\u0027: fsdev}\n)\n\"\"\"\n\nP.S. you also lost space between \"%(snap)s,\" and \"fsdev\".\n\nSee: https://github.com/openstack/manila/blob/master/HACKING.rst","commit_id":"6fe2ff08eef3962e835a836238a27b8b258a743d"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"cc3b87555fb51ffc326ab22f04d6742ef1e2ed4e","unresolved":false,"context_lines":[{"line_number":411,"context_line":"        sharename \u003d snapshot[\u0027share_name\u0027]"},{"line_number":412,"context_line":"        snapshotname \u003d snapshot[\u0027name\u0027]"},{"line_number":413,"context_line":"        fsdev \u003d self._get_gpfs_device()"},{"line_number":414,"context_line":"        msg \u003d (_(\u0027sharename \u003d %(share)s, snapshotname \u003d %(snap)s,\u0027"},{"line_number":415,"context_line":"                 \u0027fsdev \u003d %(dev)s\u0027) %"},{"line_number":416,"context_line":"               {\u0027share\u0027: sharename, \u0027snap\u0027: snapshotname, \u0027dev\u0027: fsdev})"},{"line_number":417,"context_line":"        LOG.debug(msg)"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"        try:"},{"line_number":420,"context_line":"            self._gpfs_execute(\u0027mmcrsnapshot\u0027, fsdev, snapshot[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_40ed9d8a","line":417,"range":{"start_line":414,"start_character":8,"end_line":417,"end_character":22},"in_reply_to":"fad55976_4d1dedbc","updated":"2016-07-18 11:14:30.000000000","message":"Done","commit_id":"6fe2ff08eef3962e835a836238a27b8b258a743d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"130c83ceceb7d9805c450efb18c660f469033258","unresolved":false,"context_lines":[{"line_number":670,"context_line":""},{"line_number":671,"context_line":"        # rw \u0026 ro options are not allowed in"},{"line_number":672,"context_line":"        # extra_specs because they will be set by access_type."},{"line_number":673,"context_line":"        options_not_allowed \u003d [\u0027ro\u0027, \u0027rw\u0027]"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"        invalid_options \u003d ["},{"line_number":676,"context_line":"            option for option in options if option in options_not_allowed"},{"line_number":677,"context_line":"        ]"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        if invalid_options:"},{"line_number":680,"context_line":"            raise exception.InvalidInput(\u0027Invalid knfs:export_options %s\u0027"},{"line_number":681,"context_line":"                                         % invalid_options)"},{"line_number":682,"context_line":""},{"line_number":683,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d \u0027ro\u0027:"},{"line_number":684,"context_line":"            options.append(\u0027ro\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fad55976_6d81d18f","line":681,"range":{"start_line":673,"start_character":8,"end_line":681,"end_character":59},"updated":"2016-07-15 14:46:43.000000000","message":"These are not \"invalid\", these are restricted. And you do not have check for really \"invalid\" options. So, better to add check for \"fake\" options.","commit_id":"6fe2ff08eef3962e835a836238a27b8b258a743d"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"cc3b87555fb51ffc326ab22f04d6742ef1e2ed4e","unresolved":false,"context_lines":[{"line_number":670,"context_line":""},{"line_number":671,"context_line":"        # rw \u0026 ro options are not allowed in"},{"line_number":672,"context_line":"        # extra_specs because they will be set by access_type."},{"line_number":673,"context_line":"        options_not_allowed \u003d [\u0027ro\u0027, \u0027rw\u0027]"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"        invalid_options \u003d ["},{"line_number":676,"context_line":"            option for option in options if option in options_not_allowed"},{"line_number":677,"context_line":"        ]"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        if invalid_options:"},{"line_number":680,"context_line":"            raise exception.InvalidInput(\u0027Invalid knfs:export_options %s\u0027"},{"line_number":681,"context_line":"                                         % invalid_options)"},{"line_number":682,"context_line":""},{"line_number":683,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d \u0027ro\u0027:"},{"line_number":684,"context_line":"            options.append(\u0027ro\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_e0813191","line":681,"range":{"start_line":673,"start_character":8,"end_line":681,"end_character":59},"in_reply_to":"fad55976_6d81d18f","updated":"2016-07-18 11:14:30.000000000","message":"There are plenty of NFS options that user can supply. If we validate each one of them here, it would be a hassle. The export commands will fail if something is specified wrong and we raise an error.\nWe can change the message in the exception here to something like \"restricted input\".\nThoughts?","commit_id":"6fe2ff08eef3962e835a836238a27b8b258a743d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"130c83ceceb7d9805c450efb18c660f469033258","unresolved":false,"context_lines":[{"line_number":764,"context_line":"        # extra_specs because they will be set by access_type."},{"line_number":765,"context_line":"        options_not_allowed \u003d [\u0027access_type\u003dro\u0027, \u0027access_type\u003drw\u0027]"},{"line_number":766,"context_line":""},{"line_number":767,"context_line":"        invalid_options \u003d ["},{"line_number":768,"context_line":"            option for option in options if option in options_not_allowed"},{"line_number":769,"context_line":"        ]"},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"        if invalid_options:"},{"line_number":772,"context_line":"            raise exception.InvalidInput(\u0027Invalid ces:export_options %s\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"fad55976_cd48bd8a","line":769,"range":{"start_line":767,"start_character":8,"end_line":769,"end_character":9},"updated":"2016-07-15 14:46:43.000000000","message":"Same here.","commit_id":"6fe2ff08eef3962e835a836238a27b8b258a743d"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"4251448ce48ca1fba712710e8bb5176fcc3c0099","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                      \u0027make up the OpenStack Manila configuration.\u0027)),"},{"line_number":73,"context_line":"    cfg.BoolOpt(\u0027is_gpfs_node\u0027,"},{"line_number":74,"context_line":"                default\u003dFalse,"},{"line_number":75,"context_line":"                help\u003d(\u0027True:when Manila services are running on one of the\u0027"},{"line_number":76,"context_line":"                      \u0027Spectrum Scale node \u0027"},{"line_number":77,"context_line":"                      \u0027False:when Manila services are not running on any of \u0027"},{"line_number":78,"context_line":"                      \u0027the Spectrum Scale node \u0027)),"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_21a0479f","line":75,"range":{"start_line":75,"start_character":74,"end_line":75,"end_character":75},"updated":"2016-07-19 01:56:18.000000000","message":"missing space","commit_id":"638b7e0097accefbe49ea2253ac057b8e45a0a18"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"4251448ce48ca1fba712710e8bb5176fcc3c0099","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    cfg.BoolOpt(\u0027is_gpfs_node\u0027,"},{"line_number":74,"context_line":"                default\u003dFalse,"},{"line_number":75,"context_line":"                help\u003d(\u0027True:when Manila services are running on one of the\u0027"},{"line_number":76,"context_line":"                      \u0027Spectrum Scale node \u0027"},{"line_number":77,"context_line":"                      \u0027False:when Manila services are not running on any of \u0027"},{"line_number":78,"context_line":"                      \u0027the Spectrum Scale node \u0027)),"},{"line_number":79,"context_line":"    cfg.PortOpt(\u0027gpfs_ssh_port\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_61887f23","line":76,"range":{"start_line":76,"start_character":42,"end_line":76,"end_character":43},"updated":"2016-07-19 01:56:18.000000000","message":"period. space.","commit_id":"638b7e0097accefbe49ea2253ac057b8e45a0a18"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"4251448ce48ca1fba712710e8bb5176fcc3c0099","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                help\u003d(\u0027True:when Manila services are running on one of the\u0027"},{"line_number":76,"context_line":"                      \u0027Spectrum Scale node \u0027"},{"line_number":77,"context_line":"                      \u0027False:when Manila services are not running on any of \u0027"},{"line_number":78,"context_line":"                      \u0027the Spectrum Scale node \u0027)),"},{"line_number":79,"context_line":"    cfg.PortOpt(\u0027gpfs_ssh_port\u0027,"},{"line_number":80,"context_line":"                default\u003d22,"},{"line_number":81,"context_line":"                help\u003d\u0027GPFS server SSH port.\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_8187730e","line":78,"range":{"start_line":78,"start_character":46,"end_line":78,"end_character":47},"updated":"2016-07-19 01:56:18.000000000","message":"period. no space.","commit_id":"638b7e0097accefbe49ea2253ac057b8e45a0a18"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"4251448ce48ca1fba712710e8bb5176fcc3c0099","unresolved":false,"context_lines":[{"line_number":816,"context_line":"                                    \u0027list\u0027, \u0027-n\u0027, local_path)"},{"line_number":817,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":818,"context_line":"            msg \u003d (_(\u0027Failed to check exports on the systems. \u0027"},{"line_number":819,"context_line":"                     \u0027 Error: %s.\u0027) % e)"},{"line_number":820,"context_line":"            LOG.error(msg)"},{"line_number":821,"context_line":"            raise exception.GPFSException(msg)"},{"line_number":822,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dada55a8_41e29bd6","line":819,"range":{"start_line":819,"start_character":22,"end_line":819,"end_character":23},"updated":"2016-07-19 01:56:18.000000000","message":"remove space.","commit_id":"638b7e0097accefbe49ea2253ac057b8e45a0a18"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"0c51af354123292979d34ea16624376369ef7aa1","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    cfg.StrOpt(\u0027gpfs_nfs_server_type\u0027,"},{"line_number":67,"context_line":"               default\u003d\u0027KNFS\u0027,"},{"line_number":68,"context_line":"               help\u003d(\u0027NFS Server type. Valid choices are \"KNFS\" (kernel NFS) \u0027"},{"line_number":69,"context_line":"                     \u0027or \"GNFS\" (Ganesha NFS).\u0027)),"},{"line_number":70,"context_line":"    cfg.ListOpt(\u0027gpfs_nfs_server_list\u0027,"},{"line_number":71,"context_line":"                help\u003d(\u0027A list of the fully qualified NFS server names that \u0027"},{"line_number":72,"context_line":"                      \u0027make up the OpenStack Manila configuration.\u0027)),"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_73db221c","line":69,"range":{"start_line":69,"start_character":25,"end_line":69,"end_character":31},"updated":"2016-07-25 11:01:24.000000000","message":"In code line 553: \u0027Valid values are: \"KNFS\", \"CES\"\u0027.So, need to change GNFS to CES?","commit_id":"e86ed55629f12cf4b05caedfdababbcc7a11a44a"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"ca10f91fa653f85ab7b9b3f2c9eea20245dfbfeb","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    cfg.StrOpt(\u0027gpfs_nfs_server_type\u0027,"},{"line_number":67,"context_line":"               default\u003d\u0027KNFS\u0027,"},{"line_number":68,"context_line":"               help\u003d(\u0027NFS Server type. Valid choices are \"KNFS\" (kernel NFS) \u0027"},{"line_number":69,"context_line":"                     \u0027or \"GNFS\" (Ganesha NFS).\u0027)),"},{"line_number":70,"context_line":"    cfg.ListOpt(\u0027gpfs_nfs_server_list\u0027,"},{"line_number":71,"context_line":"                help\u003d(\u0027A list of the fully qualified NFS server names that \u0027"},{"line_number":72,"context_line":"                      \u0027make up the OpenStack Manila configuration.\u0027)),"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_4dbec4ae","line":69,"range":{"start_line":69,"start_character":25,"end_line":69,"end_character":31},"in_reply_to":"dada55a8_73db221c","updated":"2016-07-27 08:25:30.000000000","message":"Good catch. Fixed. Thanks","commit_id":"e86ed55629f12cf4b05caedfdababbcc7a11a44a"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"0c51af354123292979d34ea16624376369ef7aa1","unresolved":false,"context_lines":[{"line_number":556,"context_line":"            raise exception.InvalidParameterValue(err\u003dmsg)"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":"        if ((not self.configuration.gpfs_nfs_server_list) and"},{"line_number":559,"context_line":"           (self.configuration.gpfs_nfs_server_type !\u003d \u0027CES\u0027)):"},{"line_number":560,"context_line":"            msg \u003d (_(\u0027Missing value for gpfs_nfs_server_list.\u0027))"},{"line_number":561,"context_line":"            LOG.error(msg)"},{"line_number":562,"context_line":"            raise exception.InvalidParameterValue(err\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_7377a202","line":559,"range":{"start_line":559,"start_character":8,"end_line":559,"end_character":11},"updated":"2016-07-25 11:01:24.000000000","message":"This need to backspace eight spaces.\n\"\"\"\"\"\"\"\"\"\"\"\nif ((not self.configuration.gpfs_nfs_server_list) and\n        (self.configuration.gpfs_nfs_server_type !\u003d \u0027CES\u0027)):\n\n\"\"\"\"\"\"\"\"\"\"\"","commit_id":"e86ed55629f12cf4b05caedfdababbcc7a11a44a"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"ca10f91fa653f85ab7b9b3f2c9eea20245dfbfeb","unresolved":false,"context_lines":[{"line_number":556,"context_line":"            raise exception.InvalidParameterValue(err\u003dmsg)"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":"        if ((not self.configuration.gpfs_nfs_server_list) and"},{"line_number":559,"context_line":"           (self.configuration.gpfs_nfs_server_type !\u003d \u0027CES\u0027)):"},{"line_number":560,"context_line":"            msg \u003d (_(\u0027Missing value for gpfs_nfs_server_list.\u0027))"},{"line_number":561,"context_line":"            LOG.error(msg)"},{"line_number":562,"context_line":"            raise exception.InvalidParameterValue(err\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_addf800b","line":559,"range":{"start_line":559,"start_character":8,"end_line":559,"end_character":11},"in_reply_to":"dada55a8_7377a202","updated":"2016-07-27 08:25:30.000000000","message":"Done","commit_id":"e86ed55629f12cf4b05caedfdababbcc7a11a44a"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"0c51af354123292979d34ea16624376369ef7aa1","unresolved":false,"context_lines":[{"line_number":769,"context_line":"        ]"},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"        if invalid_options:"},{"line_number":772,"context_line":"            raise exception.InvalidInput(\u0027Invalid ces:export_options %s\u0027"},{"line_number":773,"context_line":"                                         % invalid_options)"},{"line_number":774,"context_line":""},{"line_number":775,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d \u0027ro\u0027:"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_59a55d45","line":772,"range":{"start_line":772,"start_character":28,"end_line":772,"end_character":40},"updated":"2016-07-25 11:01:24.000000000","message":"InvalidInput(reason\u003d.........)","commit_id":"e86ed55629f12cf4b05caedfdababbcc7a11a44a"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"ca10f91fa653f85ab7b9b3f2c9eea20245dfbfeb","unresolved":false,"context_lines":[{"line_number":769,"context_line":"        ]"},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"        if invalid_options:"},{"line_number":772,"context_line":"            raise exception.InvalidInput(\u0027Invalid ces:export_options %s\u0027"},{"line_number":773,"context_line":"                                         % invalid_options)"},{"line_number":774,"context_line":""},{"line_number":775,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d \u0027ro\u0027:"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_ede5f8db","line":772,"range":{"start_line":772,"start_character":28,"end_line":772,"end_character":40},"in_reply_to":"dada55a8_59a55d45","updated":"2016-07-27 08:25:30.000000000","message":"Done","commit_id":"e86ed55629f12cf4b05caedfdababbcc7a11a44a"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"0c51af354123292979d34ea16624376369ef7aa1","unresolved":false,"context_lines":[{"line_number":772,"context_line":"            raise exception.InvalidInput(\u0027Invalid ces:export_options %s\u0027"},{"line_number":773,"context_line":"                                         % invalid_options)"},{"line_number":774,"context_line":""},{"line_number":775,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d \u0027ro\u0027:"},{"line_number":776,"context_line":"            options.append(\u0027access_type\u003dro\u0027)"},{"line_number":777,"context_line":"        else:"},{"line_number":778,"context_line":"            options.append(\u0027access_type\u003drw\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_f99ed105","line":775,"range":{"start_line":775,"start_character":36,"end_line":775,"end_character":41},"updated":"2016-07-25 11:01:24.000000000","message":"please use constans instead of \u0027ro\u0027.\n\"\"\"\"\"\"\"\"\"\"\"\"\nfrom manila.common import constants\nconstants.ACCESS_LEVEL_RO\n\"\"\"\"\"\"\"\"\"\"\"\"\"","commit_id":"e86ed55629f12cf4b05caedfdababbcc7a11a44a"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"ca10f91fa653f85ab7b9b3f2c9eea20245dfbfeb","unresolved":false,"context_lines":[{"line_number":772,"context_line":"            raise exception.InvalidInput(\u0027Invalid ces:export_options %s\u0027"},{"line_number":773,"context_line":"                                         % invalid_options)"},{"line_number":774,"context_line":""},{"line_number":775,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d \u0027ro\u0027:"},{"line_number":776,"context_line":"            options.append(\u0027access_type\u003dro\u0027)"},{"line_number":777,"context_line":"        else:"},{"line_number":778,"context_line":"            options.append(\u0027access_type\u003drw\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_cde8f4b5","line":775,"range":{"start_line":775,"start_character":36,"end_line":775,"end_character":41},"in_reply_to":"dada55a8_f99ed105","updated":"2016-07-27 08:25:30.000000000","message":"Done","commit_id":"e86ed55629f12cf4b05caedfdababbcc7a11a44a"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"0c51af354123292979d34ea16624376369ef7aa1","unresolved":false,"context_lines":[{"line_number":809,"context_line":"        \"\"\"Allow access to the host.\"\"\""},{"line_number":810,"context_line":""},{"line_number":811,"context_line":"        if access[\u0027access_type\u0027] !\u003d \u0027ip\u0027:"},{"line_number":812,"context_line":"            raise exception.InvalidShareAccess(\u0027Only ip access type \u0027"},{"line_number":813,"context_line":"                                               \u0027supported.\u0027)"},{"line_number":814,"context_line":"        try:"},{"line_number":815,"context_line":"            out, __ \u003d self._execute(\u0027mmnfs\u0027, \u0027export\u0027,"},{"line_number":816,"context_line":"                                    \u0027list\u0027, \u0027-n\u0027, local_path)"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_59155de3","line":813,"range":{"start_line":812,"start_character":28,"end_line":813,"end_character":60},"updated":"2016-07-25 11:01:24.000000000","message":"InvalidShareAccess(reason\u003d.....)","commit_id":"e86ed55629f12cf4b05caedfdababbcc7a11a44a"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"ca10f91fa653f85ab7b9b3f2c9eea20245dfbfeb","unresolved":false,"context_lines":[{"line_number":809,"context_line":"        \"\"\"Allow access to the host.\"\"\""},{"line_number":810,"context_line":""},{"line_number":811,"context_line":"        if access[\u0027access_type\u0027] !\u003d \u0027ip\u0027:"},{"line_number":812,"context_line":"            raise exception.InvalidShareAccess(\u0027Only ip access type \u0027"},{"line_number":813,"context_line":"                                               \u0027supported.\u0027)"},{"line_number":814,"context_line":"        try:"},{"line_number":815,"context_line":"            out, __ \u003d self._execute(\u0027mmnfs\u0027, \u0027export\u0027,"},{"line_number":816,"context_line":"                                    \u0027list\u0027, \u0027-n\u0027, local_path)"}],"source_content_type":"text/x-python","patch_set":9,"id":"dada55a8_0dcfac56","line":813,"range":{"start_line":812,"start_character":28,"end_line":813,"end_character":60},"in_reply_to":"dada55a8_59155de3","updated":"2016-07-27 08:25:30.000000000","message":"Done","commit_id":"e86ed55629f12cf4b05caedfdababbcc7a11a44a"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"34b774723b71600d0c0e575433a78244cff9f95c","unresolved":false,"context_lines":[{"line_number":105,"context_line":"               deprecated_for_removal\u003dTrue,"},{"line_number":106,"context_line":"               deprecated_reason\u003d\"This option isn\u0027t used any longer. Please \""},{"line_number":107,"context_line":"                                 \"use share-type extra specs for export \""},{"line_number":108,"context_line":"                                 \"options\"),"},{"line_number":109,"context_line":"]"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_9e790496","line":108,"range":{"start_line":108,"start_character":41,"end_line":108,"end_character":42},"updated":"2016-07-27 10:01:49.000000000","message":"Dot-nit: a dot is missing.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"908f213f507106ffb01288e4ced90e4b364fc4c1","unresolved":false,"context_lines":[{"line_number":105,"context_line":"               deprecated_for_removal\u003dTrue,"},{"line_number":106,"context_line":"               deprecated_reason\u003d\"This option isn\u0027t used any longer. Please \""},{"line_number":107,"context_line":"                                 \"use share-type extra specs for export \""},{"line_number":108,"context_line":"                                 \"options\"),"},{"line_number":109,"context_line":"]"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_0676766f","line":108,"range":{"start_line":108,"start_character":41,"end_line":108,"end_character":42},"in_reply_to":"dada55a8_9e790496","updated":"2016-08-01 14:13:12.000000000","message":"Done","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"b07714a2a185835270bc61160443e94dc25577f1","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"},{"line_number":201,"context_line":"                       {\u0027cmd\u0027: command, \u0027excmsg\u0027: e})"},{"line_number":202,"context_line":"                LOG.error(msg)"},{"line_number":203,"context_line":"                raise exception.GPFSException(e)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def _gpfs_ssh_execute(self, ssh, cmd, ignore_exit_code\u003dNone,"},{"line_number":206,"context_line":"                          check_exit_code\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_2a98c677","line":203,"range":{"start_line":203,"start_character":15,"end_line":203,"end_character":48},"updated":"2016-07-30 08:35:19.000000000","message":"In code 198, we already use \"with excutils.save_and_reraise_exception\", why we need to raise it again?","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"908f213f507106ffb01288e4ced90e4b364fc4c1","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"},{"line_number":201,"context_line":"                       {\u0027cmd\u0027: command, \u0027excmsg\u0027: e})"},{"line_number":202,"context_line":"                LOG.error(msg)"},{"line_number":203,"context_line":"                raise exception.GPFSException(e)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def _gpfs_ssh_execute(self, ssh, cmd, ignore_exit_code\u003dNone,"},{"line_number":206,"context_line":"                          check_exit_code\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_6fd90557","line":203,"range":{"start_line":203,"start_character":15,"end_line":203,"end_character":48},"in_reply_to":"bacf61ea_2a98c677","updated":"2016-08-01 14:13:12.000000000","message":"We want to wrap the exception under GPFS exception.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"34b774723b71600d0c0e575433a78244cff9f95c","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        sharename \u003d snapshot[\u0027share_name\u0027]"},{"line_number":413,"context_line":"        snapshotname \u003d snapshot[\u0027name\u0027]"},{"line_number":414,"context_line":"        fsdev \u003d self._get_gpfs_device()"},{"line_number":415,"context_line":"        LOG.debug("},{"line_number":416,"context_line":"            \"sharename \u003d %(share)s, snapshotname \u003d %(snap)s, fsdev \u003d %(dev)s\","},{"line_number":417,"context_line":"            {\u0027share\u0027: sharename, \u0027snap\u0027: snapshotname, \u0027dev\u0027: fsdev}"},{"line_number":418,"context_line":"        )"},{"line_number":419,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_1e707471","line":416,"range":{"start_line":415,"start_character":12,"end_line":416,"end_character":77},"updated":"2016-07-27 10:01:49.000000000","message":"Probably this debug message needs to be more verbose. Like \"Attempting to create a snapshot %(snap)s from share %(share)s on device %(dev)s\"","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"908f213f507106ffb01288e4ced90e4b364fc4c1","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        sharename \u003d snapshot[\u0027share_name\u0027]"},{"line_number":413,"context_line":"        snapshotname \u003d snapshot[\u0027name\u0027]"},{"line_number":414,"context_line":"        fsdev \u003d self._get_gpfs_device()"},{"line_number":415,"context_line":"        LOG.debug("},{"line_number":416,"context_line":"            \"sharename \u003d %(share)s, snapshotname \u003d %(snap)s, fsdev \u003d %(dev)s\","},{"line_number":417,"context_line":"            {\u0027share\u0027: sharename, \u0027snap\u0027: snapshotname, \u0027dev\u0027: fsdev}"},{"line_number":418,"context_line":"        )"},{"line_number":419,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_2fec2df2","line":416,"range":{"start_line":415,"start_character":12,"end_line":416,"end_character":77},"in_reply_to":"dada55a8_1e707471","updated":"2016-08-01 14:13:12.000000000","message":"Done","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"b07714a2a185835270bc61160443e94dc25577f1","unresolved":false,"context_lines":[{"line_number":510,"context_line":"    def ensure_share(self, ctx, share, share_server\u003dNone):"},{"line_number":511,"context_line":"        \"\"\"Ensure that storage are mounted and exported.\"\"\""},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"    def allow_access(self, ctx, share, access, share_server\u003dNone):"},{"line_number":514,"context_line":"        \"\"\"Allow access to the share.\"\"\""},{"line_number":515,"context_line":"        location \u003d self._get_share_path(share)"},{"line_number":516,"context_line":"        self._get_helper(share).allow_access(location, share, access)"},{"line_number":517,"context_line":""},{"line_number":518,"context_line":"    def deny_access(self, ctx, share, access, share_server\u003dNone):"},{"line_number":519,"context_line":"        \"\"\"Deny access to the share.\"\"\""},{"line_number":520,"context_line":"        location \u003d self._get_share_path(share)"},{"line_number":521,"context_line":"        self._get_helper(share).deny_access(location, share, access)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_eacfce26","line":518,"range":{"start_line":513,"start_character":4,"end_line":518,"end_character":65},"updated":"2016-07-30 08:35:19.000000000","message":"Need to implement update_access function.\nSuch as: https://github.com/openstack/manila/blob/master/manila/share/drivers/zfsonlinux/driver.py#L625","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"908f213f507106ffb01288e4ced90e4b364fc4c1","unresolved":false,"context_lines":[{"line_number":510,"context_line":"    def ensure_share(self, ctx, share, share_server\u003dNone):"},{"line_number":511,"context_line":"        \"\"\"Ensure that storage are mounted and exported.\"\"\""},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"    def allow_access(self, ctx, share, access, share_server\u003dNone):"},{"line_number":514,"context_line":"        \"\"\"Allow access to the share.\"\"\""},{"line_number":515,"context_line":"        location \u003d self._get_share_path(share)"},{"line_number":516,"context_line":"        self._get_helper(share).allow_access(location, share, access)"},{"line_number":517,"context_line":""},{"line_number":518,"context_line":"    def deny_access(self, ctx, share, access, share_server\u003dNone):"},{"line_number":519,"context_line":"        \"\"\"Deny access to the share.\"\"\""},{"line_number":520,"context_line":"        location \u003d self._get_share_path(share)"},{"line_number":521,"context_line":"        self._get_helper(share).deny_access(location, share, access)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_e0985f6c","line":518,"range":{"start_line":513,"start_character":4,"end_line":518,"end_character":65},"in_reply_to":"bacf61ea_eacfce26","updated":"2016-08-01 14:13:12.000000000","message":"It will be implemented soon in a separate patch.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"b07714a2a185835270bc61160443e94dc25577f1","unresolved":false,"context_lines":[{"line_number":671,"context_line":""},{"line_number":672,"context_line":"        # rw \u0026 ro options are not allowed in"},{"line_number":673,"context_line":"        # extra_specs because they will be set by access_type."},{"line_number":674,"context_line":"        options_not_allowed \u003d [\u0027ro\u0027, \u0027rw\u0027]"},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        invalid_options \u003d ["},{"line_number":677,"context_line":"            option for option in options if option in options_not_allowed"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_6af11e95","line":674,"range":{"start_line":674,"start_character":30,"end_line":674,"end_character":42},"updated":"2016-07-30 08:35:19.000000000","message":"Could use following code to instead of [\u0027ro\u0027, \u0027rw\u0027],\nfrom manila.common import constants \nconstants.ACCESS_LEVELS","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"908f213f507106ffb01288e4ced90e4b364fc4c1","unresolved":false,"context_lines":[{"line_number":671,"context_line":""},{"line_number":672,"context_line":"        # rw \u0026 ro options are not allowed in"},{"line_number":673,"context_line":"        # extra_specs because they will be set by access_type."},{"line_number":674,"context_line":"        options_not_allowed \u003d [\u0027ro\u0027, \u0027rw\u0027]"},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        invalid_options \u003d ["},{"line_number":677,"context_line":"            option for option in options if option in options_not_allowed"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_6a90d095","line":674,"range":{"start_line":674,"start_character":30,"end_line":674,"end_character":42},"in_reply_to":"bacf61ea_6af11e95","updated":"2016-08-01 14:13:12.000000000","message":"Done","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"34b774723b71600d0c0e575433a78244cff9f95c","unresolved":false,"context_lines":[{"line_number":674,"context_line":"        options_not_allowed \u003d [\u0027ro\u0027, \u0027rw\u0027]"},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        invalid_options \u003d ["},{"line_number":677,"context_line":"            option for option in options if option in options_not_allowed"},{"line_number":678,"context_line":"        ]"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":"        if invalid_options:"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_de5b7c84","line":677,"range":{"start_line":677,"start_character":12,"end_line":677,"end_character":73},"updated":"2016-07-27 10:01:49.000000000","message":"What about \"invalid_options \u003d set(options) \u0026 set(options_not_allowed)\"?\n\nAlthough I somewhat like how this list comprehension reads.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"908f213f507106ffb01288e4ced90e4b364fc4c1","unresolved":false,"context_lines":[{"line_number":674,"context_line":"        options_not_allowed \u003d [\u0027ro\u0027, \u0027rw\u0027]"},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        invalid_options \u003d ["},{"line_number":677,"context_line":"            option for option in options if option in options_not_allowed"},{"line_number":678,"context_line":"        ]"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":"        if invalid_options:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_aad3e85e","line":677,"range":{"start_line":677,"start_character":12,"end_line":677,"end_character":73},"in_reply_to":"dada55a8_de5b7c84","updated":"2016-08-01 14:13:12.000000000","message":"I have kept it as is.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"34b774723b71600d0c0e575433a78244cff9f95c","unresolved":false,"context_lines":[{"line_number":678,"context_line":"        ]"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":"        if invalid_options:"},{"line_number":681,"context_line":"            raise exception.InvalidInput(reason\u003d\u0027Invalid export_options %s\u0027"},{"line_number":682,"context_line":"                                         % invalid_options)"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d constants.ACCESS_LEVEL_RO:"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_993c7e94","line":681,"range":{"start_line":681,"start_character":73,"end_line":681,"end_character":75},"updated":"2016-07-27 10:01:49.000000000","message":"A dot is missing.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"34b774723b71600d0c0e575433a78244cff9f95c","unresolved":false,"context_lines":[{"line_number":678,"context_line":"        ]"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":"        if invalid_options:"},{"line_number":681,"context_line":"            raise exception.InvalidInput(reason\u003d\u0027Invalid export_options %s\u0027"},{"line_number":682,"context_line":"                                         % invalid_options)"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d constants.ACCESS_LEVEL_RO:"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_798f0a75","line":681,"range":{"start_line":681,"start_character":41,"end_line":681,"end_character":47},"updated":"2016-07-27 10:01:49.000000000","message":"This would have looked extremely confusing to me: \u0027ro\u0027 and \u0027rw\u0027 are not invalid options per se, they just have been misplaced, right? I believe that comments on lines 672 and 673 do better job explaining why \u0027ro\u0027 and \u0027rw\u0027 are invalid. Maybe the message should be amended in the style of those comments?","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"b07714a2a185835270bc61160443e94dc25577f1","unresolved":false,"context_lines":[{"line_number":678,"context_line":"        ]"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":"        if invalid_options:"},{"line_number":681,"context_line":"            raise exception.InvalidInput(reason\u003d\u0027Invalid export_options %s\u0027"},{"line_number":682,"context_line":"                                         % invalid_options)"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d constants.ACCESS_LEVEL_RO:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_8a32925d","line":681,"range":{"start_line":681,"start_character":41,"end_line":681,"end_character":47},"in_reply_to":"dada55a8_798f0a75","updated":"2016-07-30 08:35:19.000000000","message":"+1","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"908f213f507106ffb01288e4ced90e4b364fc4c1","unresolved":false,"context_lines":[{"line_number":678,"context_line":"        ]"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":"        if invalid_options:"},{"line_number":681,"context_line":"            raise exception.InvalidInput(reason\u003d\u0027Invalid export_options %s\u0027"},{"line_number":682,"context_line":"                                         % invalid_options)"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d constants.ACCESS_LEVEL_RO:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_8aef041d","line":681,"range":{"start_line":681,"start_character":41,"end_line":681,"end_character":47},"in_reply_to":"dada55a8_798f0a75","updated":"2016-08-01 14:13:12.000000000","message":"Done","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"908f213f507106ffb01288e4ced90e4b364fc4c1","unresolved":false,"context_lines":[{"line_number":678,"context_line":"        ]"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":"        if invalid_options:"},{"line_number":681,"context_line":"            raise exception.InvalidInput(reason\u003d\u0027Invalid export_options %s\u0027"},{"line_number":682,"context_line":"                                         % invalid_options)"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d constants.ACCESS_LEVEL_RO:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_eac960ad","line":681,"range":{"start_line":681,"start_character":73,"end_line":681,"end_character":75},"in_reply_to":"dada55a8_993c7e94","updated":"2016-08-01 14:13:12.000000000","message":"Done","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"b07714a2a185835270bc61160443e94dc25577f1","unresolved":false,"context_lines":[{"line_number":695,"context_line":"        \"\"\"Allow access to one or more vm instances.\"\"\""},{"line_number":696,"context_line":""},{"line_number":697,"context_line":"        if access[\u0027access_type\u0027] !\u003d \u0027ip\u0027:"},{"line_number":698,"context_line":"            raise exception.InvalidShareAccess(\u0027Only ip access type \u0027"},{"line_number":699,"context_line":"                                               \u0027supported.\u0027)"},{"line_number":700,"context_line":""},{"line_number":701,"context_line":"        # check if present in export"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_8a19f2d9","line":698,"range":{"start_line":698,"start_character":28,"end_line":698,"end_character":47},"updated":"2016-07-30 08:35:19.000000000","message":"InvalidShareAccess(reason\u003d...)","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"908f213f507106ffb01288e4ced90e4b364fc4c1","unresolved":false,"context_lines":[{"line_number":695,"context_line":"        \"\"\"Allow access to one or more vm instances.\"\"\""},{"line_number":696,"context_line":""},{"line_number":697,"context_line":"        if access[\u0027access_type\u0027] !\u003d \u0027ip\u0027:"},{"line_number":698,"context_line":"            raise exception.InvalidShareAccess(\u0027Only ip access type \u0027"},{"line_number":699,"context_line":"                                               \u0027supported.\u0027)"},{"line_number":700,"context_line":""},{"line_number":701,"context_line":"        # check if present in export"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_ea404009","line":698,"range":{"start_line":698,"start_character":28,"end_line":698,"end_character":47},"in_reply_to":"bacf61ea_8a19f2d9","updated":"2016-08-01 14:13:12.000000000","message":"Done","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"34b774723b71600d0c0e575433a78244cff9f95c","unresolved":false,"context_lines":[{"line_number":766,"context_line":"        options_not_allowed \u003d [\u0027access_type\u003dro\u0027, \u0027access_type\u003drw\u0027]"},{"line_number":767,"context_line":""},{"line_number":768,"context_line":"        invalid_options \u003d ["},{"line_number":769,"context_line":"            option for option in options if option in options_not_allowed"},{"line_number":770,"context_line":"        ]"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":"        if invalid_options:"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_39c75297","line":769,"range":{"start_line":769,"start_character":12,"end_line":769,"end_character":73},"updated":"2016-07-27 10:01:49.000000000","message":"Same question as for line 677.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"908f213f507106ffb01288e4ced90e4b364fc4c1","unresolved":false,"context_lines":[{"line_number":766,"context_line":"        options_not_allowed \u003d [\u0027access_type\u003dro\u0027, \u0027access_type\u003drw\u0027]"},{"line_number":767,"context_line":""},{"line_number":768,"context_line":"        invalid_options \u003d ["},{"line_number":769,"context_line":"            option for option in options if option in options_not_allowed"},{"line_number":770,"context_line":"        ]"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":"        if invalid_options:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_2a4ff837","line":769,"range":{"start_line":769,"start_character":12,"end_line":769,"end_character":73},"in_reply_to":"dada55a8_39c75297","updated":"2016-08-01 14:13:12.000000000","message":"Kept the line as is.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"34b774723b71600d0c0e575433a78244cff9f95c","unresolved":false,"context_lines":[{"line_number":770,"context_line":"        ]"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":"        if invalid_options:"},{"line_number":773,"context_line":"            raise exception.InvalidInput(reason\u003d\u0027Invalid export_options %s\u0027"},{"line_number":774,"context_line":"                                         % invalid_options)"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d constants.ACCESS_LEVEL_RO:"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_19f7eed3","line":773,"range":{"start_line":773,"start_character":12,"end_line":773,"end_character":75},"updated":"2016-07-27 10:01:49.000000000","message":"Same question as for line 681. Also a dot is missing.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"908f213f507106ffb01288e4ced90e4b364fc4c1","unresolved":false,"context_lines":[{"line_number":770,"context_line":"        ]"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":"        if invalid_options:"},{"line_number":773,"context_line":"            raise exception.InvalidInput(reason\u003d\u0027Invalid export_options %s\u0027"},{"line_number":774,"context_line":"                                         % invalid_options)"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d constants.ACCESS_LEVEL_RO:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_4a67ccb6","line":773,"range":{"start_line":773,"start_character":12,"end_line":773,"end_character":75},"in_reply_to":"dada55a8_19f7eed3","updated":"2016-08-01 14:13:12.000000000","message":"Done","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"b07714a2a185835270bc61160443e94dc25577f1","unresolved":false,"context_lines":[{"line_number":810,"context_line":"        \"\"\"Allow access to the host.\"\"\""},{"line_number":811,"context_line":""},{"line_number":812,"context_line":"        if access[\u0027access_type\u0027] !\u003d \u0027ip\u0027:"},{"line_number":813,"context_line":"            raise exception.InvalidShareAccess(\u0027Only ip access type \u0027"},{"line_number":814,"context_line":"                                               \u0027supported.\u0027)"},{"line_number":815,"context_line":"        try:"},{"line_number":816,"context_line":"            out, __ \u003d self._execute(\u0027mmnfs\u0027, \u0027export\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_6a1f5eb7","line":813,"range":{"start_line":813,"start_character":28,"end_line":813,"end_character":47},"updated":"2016-07-30 08:35:19.000000000","message":"InvalidShareAccess(reason\u003d...)","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"908f213f507106ffb01288e4ced90e4b364fc4c1","unresolved":false,"context_lines":[{"line_number":810,"context_line":"        \"\"\"Allow access to the host.\"\"\""},{"line_number":811,"context_line":""},{"line_number":812,"context_line":"        if access[\u0027access_type\u0027] !\u003d \u0027ip\u0027:"},{"line_number":813,"context_line":"            raise exception.InvalidShareAccess(\u0027Only ip access type \u0027"},{"line_number":814,"context_line":"                                               \u0027supported.\u0027)"},{"line_number":815,"context_line":"        try:"},{"line_number":816,"context_line":"            out, __ \u003d self._execute(\u0027mmnfs\u0027, \u0027export\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_4a150ce3","line":813,"range":{"start_line":813,"start_character":28,"end_line":813,"end_character":47},"in_reply_to":"bacf61ea_6a1f5eb7","updated":"2016-08-01 14:13:12.000000000","message":"Done","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"34b774723b71600d0c0e575433a78244cff9f95c","unresolved":false,"context_lines":[{"line_number":826,"context_line":"        out \u003d re.search(re.escape(local_path), out)"},{"line_number":827,"context_line":""},{"line_number":828,"context_line":"        if out is None:"},{"line_number":829,"context_line":"            try:"},{"line_number":830,"context_line":"                self._execute(\u0027mmnfs\u0027, \u0027export\u0027, \u0027add\u0027, local_path, \u0027-c\u0027,"},{"line_number":831,"context_line":"                              access[\u0027access_to\u0027] + \u0027(\u0027 + export_opts + \u0027)\u0027)"},{"line_number":832,"context_line":"            except exception.ProcessExecutionError as e:"},{"line_number":833,"context_line":"                msg \u003d (_(\u0027Failed to allow access for share %(sharename)s. \u0027"},{"line_number":834,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_14c21585","line":831,"range":{"start_line":829,"start_character":11,"end_line":831,"end_character":47},"updated":"2016-07-27 10:01:49.000000000","message":"Normally I am for splitting try blocks, but in this particular case it is probably OK to put \"if out ... else ...\" inside try block since you are catching the same exception and it is still one line that can fail.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"908f213f507106ffb01288e4ced90e4b364fc4c1","unresolved":false,"context_lines":[{"line_number":826,"context_line":"        out \u003d re.search(re.escape(local_path), out)"},{"line_number":827,"context_line":""},{"line_number":828,"context_line":"        if out is None:"},{"line_number":829,"context_line":"            try:"},{"line_number":830,"context_line":"                self._execute(\u0027mmnfs\u0027, \u0027export\u0027, \u0027add\u0027, local_path, \u0027-c\u0027,"},{"line_number":831,"context_line":"                              access[\u0027access_to\u0027] + \u0027(\u0027 + export_opts + \u0027)\u0027)"},{"line_number":832,"context_line":"            except exception.ProcessExecutionError as e:"},{"line_number":833,"context_line":"                msg \u003d (_(\u0027Failed to allow access for share %(sharename)s. \u0027"},{"line_number":834,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_2a2a58db","line":831,"range":{"start_line":829,"start_character":11,"end_line":831,"end_character":47},"in_reply_to":"dada55a8_14c21585","updated":"2016-08-01 14:13:12.000000000","message":"I\u0027ve put a separate entry for better understanding and code separation.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"34b774723b71600d0c0e575433a78244cff9f95c","unresolved":false,"context_lines":[{"line_number":863,"context_line":""},{"line_number":864,"context_line":"        out \u003d re.search(re.escape(local_path), out)"},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"        if out is not None:"},{"line_number":867,"context_line":"            try:"},{"line_number":868,"context_line":"                self._execute(\u0027mmnfs\u0027, \u0027export\u0027, \u0027change\u0027, local_path,"},{"line_number":869,"context_line":"                              \u0027--nfsremove\u0027, access[\u0027access_to\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_14497531","line":866,"range":{"start_line":866,"start_character":7,"end_line":866,"end_character":26},"updated":"2016-07-27 10:01:49.000000000","message":"What if out is None? I believe it deserves at least a log entry.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"34b774723b71600d0c0e575433a78244cff9f95c","unresolved":false,"context_lines":[{"line_number":867,"context_line":"            try:"},{"line_number":868,"context_line":"                self._execute(\u0027mmnfs\u0027, \u0027export\u0027, \u0027change\u0027, local_path,"},{"line_number":869,"context_line":"                              \u0027--nfsremove\u0027, access[\u0027access_to\u0027])"},{"line_number":870,"context_line":"            except exception.ProcessExecutionError as e:"},{"line_number":871,"context_line":"                msg \u003d (_(\u0027Failed to remove access for share %(sharename)s. \u0027"},{"line_number":872,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"},{"line_number":873,"context_line":"                       {\u0027sharename\u0027: share[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"dada55a8_b4bce9dc","line":870,"range":{"start_line":870,"start_character":13,"end_line":870,"end_character":56},"updated":"2016-07-27 10:01:49.000000000","message":"This entire try...except block is repeated several times with minimal differences and probably could be separated as a method.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"7b54e67066424d6e92565b14e4577e8d74a2dc96","unresolved":false,"context_lines":[{"line_number":867,"context_line":"            try:"},{"line_number":868,"context_line":"                self._execute(\u0027mmnfs\u0027, \u0027export\u0027, \u0027change\u0027, local_path,"},{"line_number":869,"context_line":"                              \u0027--nfsremove\u0027, access[\u0027access_to\u0027])"},{"line_number":870,"context_line":"            except exception.ProcessExecutionError as e:"},{"line_number":871,"context_line":"                msg \u003d (_(\u0027Failed to remove access for share %(sharename)s. \u0027"},{"line_number":872,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"},{"line_number":873,"context_line":"                       {\u0027sharename\u0027: share[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_7fb85a2a","line":870,"range":{"start_line":870,"start_character":13,"end_line":870,"end_character":56},"in_reply_to":"bacf61ea_8a0a6488","updated":"2016-08-02 11:31:59.000000000","message":"You can easily treat both mmnfs command and exception message as arguments for the new method. Or create several wrappers for a base command and use them. Or deduce the message  from arguments.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"908f213f507106ffb01288e4ced90e4b364fc4c1","unresolved":false,"context_lines":[{"line_number":867,"context_line":"            try:"},{"line_number":868,"context_line":"                self._execute(\u0027mmnfs\u0027, \u0027export\u0027, \u0027change\u0027, local_path,"},{"line_number":869,"context_line":"                              \u0027--nfsremove\u0027, access[\u0027access_to\u0027])"},{"line_number":870,"context_line":"            except exception.ProcessExecutionError as e:"},{"line_number":871,"context_line":"                msg \u003d (_(\u0027Failed to remove access for share %(sharename)s. \u0027"},{"line_number":872,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"},{"line_number":873,"context_line":"                       {\u0027sharename\u0027: share[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"bacf61ea_8a0a6488","line":870,"range":{"start_line":870,"start_character":13,"end_line":870,"end_character":56},"in_reply_to":"dada55a8_b4bce9dc","updated":"2016-08-01 14:13:12.000000000","message":"The mmnfs command is different for different blocks. So we cannot make it a separate method.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"8102c426f814a015dfa321928fad59fd0233ec2c","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    def do_setup(self, context):"},{"line_number":143,"context_line":"        \"\"\"Any initialization the share driver does while starting.\"\"\""},{"line_number":144,"context_line":"        super(GPFSShareDriver, self).do_setup(context)"},{"line_number":145,"context_line":"        if self.configuration.is_gpfs_node:"},{"line_number":146,"context_line":"            self._gpfs_execute \u003d self._gpfs_local_execute"},{"line_number":147,"context_line":"        else:"},{"line_number":148,"context_line":"            self._gpfs_execute \u003d self._gpfs_remote_execute"},{"line_number":149,"context_line":"        self._setup_helpers()"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_a3f11198","line":146,"range":{"start_line":145,"start_character":8,"end_line":146,"end_character":57},"updated":"2016-08-02 14:59:35.000000000","message":"please add the unit test, thanks.","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"563fb2bbe3d211fa62367d05c2bb113705ee1ad2","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    def do_setup(self, context):"},{"line_number":143,"context_line":"        \"\"\"Any initialization the share driver does while starting.\"\"\""},{"line_number":144,"context_line":"        super(GPFSShareDriver, self).do_setup(context)"},{"line_number":145,"context_line":"        if self.configuration.is_gpfs_node:"},{"line_number":146,"context_line":"            self._gpfs_execute \u003d self._gpfs_local_execute"},{"line_number":147,"context_line":"        else:"},{"line_number":148,"context_line":"            self._gpfs_execute \u003d self._gpfs_remote_execute"},{"line_number":149,"context_line":"        self._setup_helpers()"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_8c5e8e74","line":146,"range":{"start_line":145,"start_character":8,"end_line":146,"end_character":57},"in_reply_to":"bacf61ea_a3f11198","updated":"2016-08-08 09:46:46.000000000","message":"Done","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"c1f1657e1590dd03e59b56cb8371fa6d1453ba08","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    def _gpfs_local_execute(self, *cmd, **kwargs):"},{"line_number":152,"context_line":"        if \u0027run_as_root\u0027 not in kwargs:"},{"line_number":153,"context_line":"            kwargs.update({\u0027run_as_root\u0027: True})"},{"line_number":154,"context_line":"        if \u0027ignore_exit_code\u0027 in kwargs:"},{"line_number":155,"context_line":"            check_exit_code \u003d kwargs.pop(\u0027ignore_exit_code\u0027)"},{"line_number":156,"context_line":"            check_exit_code.append(0)"},{"line_number":157,"context_line":"            kwargs.update({\u0027check_exit_code\u0027: check_exit_code})"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        return utils.execute(*cmd, **kwargs)"},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_83a96d7e","line":157,"range":{"start_line":154,"start_character":8,"end_line":157,"end_character":63},"updated":"2016-08-02 14:58:32.000000000","message":"please add the unit test, thanks.","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"563fb2bbe3d211fa62367d05c2bb113705ee1ad2","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    def _gpfs_local_execute(self, *cmd, **kwargs):"},{"line_number":152,"context_line":"        if \u0027run_as_root\u0027 not in kwargs:"},{"line_number":153,"context_line":"            kwargs.update({\u0027run_as_root\u0027: True})"},{"line_number":154,"context_line":"        if \u0027ignore_exit_code\u0027 in kwargs:"},{"line_number":155,"context_line":"            check_exit_code \u003d kwargs.pop(\u0027ignore_exit_code\u0027)"},{"line_number":156,"context_line":"            check_exit_code.append(0)"},{"line_number":157,"context_line":"            kwargs.update({\u0027check_exit_code\u0027: check_exit_code})"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        return utils.execute(*cmd, **kwargs)"},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_ca8231c8","line":157,"range":{"start_line":154,"start_character":8,"end_line":157,"end_character":63},"in_reply_to":"bacf61ea_83a96d7e","updated":"2016-08-08 09:46:46.000000000","message":"Done","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"a9f037d5dae273bc28020773110445ce4db89906","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"},{"line_number":201,"context_line":"                       {\u0027cmd\u0027: command, \u0027excmsg\u0027: e})"},{"line_number":202,"context_line":"                LOG.error(msg)"},{"line_number":203,"context_line":"                raise exception.GPFSException(e)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def _gpfs_ssh_execute(self, ssh, cmd, ignore_exit_code\u003dNone,"},{"line_number":206,"context_line":"                          check_exit_code\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_27e14d9b","line":203,"updated":"2016-08-04 06:16:12.000000000","message":"Is this a duplicated exception raise? Cause save_and_reraise_exception will re-raise the exception automatically.","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"4c7a694874bacf84b2e7ce82dc781332b3ed7ae9","unresolved":false,"context_lines":[{"line_number":414,"context_line":"        fsdev \u003d self._get_gpfs_device()"},{"line_number":415,"context_line":"        LOG.debug("},{"line_number":416,"context_line":"            \u0027Attempting to create a snapshot %(snap)s from share %(share)s \u0027"},{"line_number":417,"context_line":"            \u0027on device %(dev)s\u0027,"},{"line_number":418,"context_line":"            {\u0027share\u0027: sharename, \u0027snap\u0027: snapshotname, \u0027dev\u0027: fsdev}"},{"line_number":419,"context_line":"        )"},{"line_number":420,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_1fcf9e56","line":417,"range":{"start_line":417,"start_character":29,"end_line":417,"end_character":31},"updated":"2016-08-02 11:57:38.000000000","message":"A dot is missing.","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"563fb2bbe3d211fa62367d05c2bb113705ee1ad2","unresolved":false,"context_lines":[{"line_number":414,"context_line":"        fsdev \u003d self._get_gpfs_device()"},{"line_number":415,"context_line":"        LOG.debug("},{"line_number":416,"context_line":"            \u0027Attempting to create a snapshot %(snap)s from share %(share)s \u0027"},{"line_number":417,"context_line":"            \u0027on device %(dev)s\u0027,"},{"line_number":418,"context_line":"            {\u0027share\u0027: sharename, \u0027snap\u0027: snapshotname, \u0027dev\u0027: fsdev}"},{"line_number":419,"context_line":"        )"},{"line_number":420,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_b63f6ad5","line":417,"range":{"start_line":417,"start_character":29,"end_line":417,"end_character":31},"in_reply_to":"bacf61ea_1fcf9e56","updated":"2016-08-08 09:46:46.000000000","message":"Done","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"d8f8f5da150c45fc5f470904a3759f7e5658817b","unresolved":false,"context_lines":[{"line_number":671,"context_line":"            options \u003d []"},{"line_number":672,"context_line":""},{"line_number":673,"context_line":"        # rw \u0026 ro options are not allowed in"},{"line_number":674,"context_line":"        # extra_specs because they will be set by access_type."},{"line_number":675,"context_line":"        options_not_allowed \u003d [constants.ACCESS_LEVEL_RO,"},{"line_number":676,"context_line":"                               constants.ACCESS_LEVEL_RW]"},{"line_number":677,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_ccfdf83c","line":674,"range":{"start_line":674,"start_character":50,"end_line":674,"end_character":61},"updated":"2016-08-04 06:00:42.000000000","message":"access_level","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"563fb2bbe3d211fa62367d05c2bb113705ee1ad2","unresolved":false,"context_lines":[{"line_number":671,"context_line":"            options \u003d []"},{"line_number":672,"context_line":""},{"line_number":673,"context_line":"        # rw \u0026 ro options are not allowed in"},{"line_number":674,"context_line":"        # extra_specs because they will be set by access_type."},{"line_number":675,"context_line":"        options_not_allowed \u003d [constants.ACCESS_LEVEL_RO,"},{"line_number":676,"context_line":"                               constants.ACCESS_LEVEL_RW]"},{"line_number":677,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_03a0f240","line":674,"range":{"start_line":674,"start_character":50,"end_line":674,"end_character":61},"in_reply_to":"bacf61ea_ccfdf83c","updated":"2016-08-08 09:46:46.000000000","message":"Done","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"c1f1657e1590dd03e59b56cb8371fa6d1453ba08","unresolved":false,"context_lines":[{"line_number":672,"context_line":""},{"line_number":673,"context_line":"        # rw \u0026 ro options are not allowed in"},{"line_number":674,"context_line":"        # extra_specs because they will be set by access_type."},{"line_number":675,"context_line":"        options_not_allowed \u003d [constants.ACCESS_LEVEL_RO,"},{"line_number":676,"context_line":"                               constants.ACCESS_LEVEL_RW]"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"        invalid_options \u003d ["},{"line_number":679,"context_line":"            option for option in options if option in options_not_allowed"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_484af428","line":676,"range":{"start_line":675,"start_character":8,"end_line":676,"end_character":57},"updated":"2016-08-02 14:58:32.000000000","message":"You could just use ACCESS_LEVELS.\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\noptions_not_allowed \u003d constants.ACCESS_LEVELS\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"563fb2bbe3d211fa62367d05c2bb113705ee1ad2","unresolved":false,"context_lines":[{"line_number":672,"context_line":""},{"line_number":673,"context_line":"        # rw \u0026 ro options are not allowed in"},{"line_number":674,"context_line":"        # extra_specs because they will be set by access_type."},{"line_number":675,"context_line":"        options_not_allowed \u003d [constants.ACCESS_LEVEL_RO,"},{"line_number":676,"context_line":"                               constants.ACCESS_LEVEL_RW]"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"        invalid_options \u003d ["},{"line_number":679,"context_line":"            option for option in options if option in options_not_allowed"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_d63adee6","line":676,"range":{"start_line":675,"start_character":8,"end_line":676,"end_character":57},"in_reply_to":"bacf61ea_484af428","updated":"2016-08-08 09:46:46.000000000","message":"Done","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"4c7a694874bacf84b2e7ce82dc781332b3ed7ae9","unresolved":false,"context_lines":[{"line_number":680,"context_line":"        ]"},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"        if invalid_options:"},{"line_number":683,"context_line":"            raise exception.InvalidInput(reason\u003d\u0027Invalid export_option %s as \u0027"},{"line_number":684,"context_line":"                                                \u0027it is set by access_type.\u0027"},{"line_number":685,"context_line":"                                                % invalid_options)"},{"line_number":686,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_5f48f6b2","line":683,"range":{"start_line":683,"start_character":49,"end_line":683,"end_character":56},"updated":"2016-08-02 11:57:38.000000000","message":"It is not invalid, it is duplicated. Also, why do you raise an exception instead of just creating warning and removing a duplicate?","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"d8f8f5da150c45fc5f470904a3759f7e5658817b","unresolved":false,"context_lines":[{"line_number":684,"context_line":"                                                \u0027it is set by access_type.\u0027"},{"line_number":685,"context_line":"                                                % invalid_options)"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d constants.ACCESS_LEVEL_RO:"},{"line_number":688,"context_line":"            options.append(constants.ACCESS_LEVEL_RO)"},{"line_number":689,"context_line":"        else:"},{"line_number":690,"context_line":"            options.append(constants.ACCESS_LEVEL_RW)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_27baed0a","line":687,"updated":"2016-08-04 06:00:42.000000000","message":"suggest checking if access[\u0027access_level\u0027] in constants.ACCESS_LEVELS.","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"c1f1657e1590dd03e59b56cb8371fa6d1453ba08","unresolved":false,"context_lines":[{"line_number":685,"context_line":"                                                % invalid_options)"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d constants.ACCESS_LEVEL_RO:"},{"line_number":688,"context_line":"            options.append(constants.ACCESS_LEVEL_RO)"},{"line_number":689,"context_line":"        else:"},{"line_number":690,"context_line":"            options.append(constants.ACCESS_LEVEL_RW)"},{"line_number":691,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_a3c75163","line":688,"range":{"start_line":688,"start_character":12,"end_line":688,"end_character":53},"updated":"2016-08-02 14:58:32.000000000","message":"please add unit test, thanks.","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"563fb2bbe3d211fa62367d05c2bb113705ee1ad2","unresolved":false,"context_lines":[{"line_number":685,"context_line":"                                                % invalid_options)"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d constants.ACCESS_LEVEL_RO:"},{"line_number":688,"context_line":"            options.append(constants.ACCESS_LEVEL_RO)"},{"line_number":689,"context_line":"        else:"},{"line_number":690,"context_line":"            options.append(constants.ACCESS_LEVEL_RW)"},{"line_number":691,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_8713070d","line":688,"range":{"start_line":688,"start_character":12,"end_line":688,"end_character":53},"in_reply_to":"bacf61ea_a3c75163","updated":"2016-08-08 09:46:46.000000000","message":"Done","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"4c7a694874bacf84b2e7ce82dc781332b3ed7ae9","unresolved":false,"context_lines":[{"line_number":752,"context_line":"        super(CESHelper, self).__init__(execute, config_object)"},{"line_number":753,"context_line":"        self._execute \u003d execute"},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"    def _get_export_options(self, share, access):"},{"line_number":756,"context_line":"        \"\"\"Set various export attributes for share.\"\"\""},{"line_number":757,"context_line":""},{"line_number":758,"context_line":"        extra_specs \u003d share_types.get_extra_specs_from_share(share)"},{"line_number":759,"context_line":"        ces_export_options \u003d extra_specs.get(\u0027ces:export_options\u0027, None)"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"        if ces_export_options:"},{"line_number":762,"context_line":"            ces_export_options \u003d ces_export_options.lower()"},{"line_number":763,"context_line":"            options \u003d ces_export_options.split(\u0027,\u0027)"},{"line_number":764,"context_line":"        else:"},{"line_number":765,"context_line":"            options \u003d []"},{"line_number":766,"context_line":""},{"line_number":767,"context_line":"        # rw \u0026 ro options are not allowed in"},{"line_number":768,"context_line":"        # extra_specs because they will be set by access_type."},{"line_number":769,"context_line":"        options_not_allowed \u003d [\u0027access_type\u003dro\u0027, \u0027access_type\u003drw\u0027]"},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"        invalid_options \u003d ["},{"line_number":772,"context_line":"            option for option in options if option in options_not_allowed"},{"line_number":773,"context_line":"        ]"},{"line_number":774,"context_line":""},{"line_number":775,"context_line":"        if invalid_options:"},{"line_number":776,"context_line":"            raise exception.InvalidInput(reason\u003d\u0027Invalid export_option %s as \u0027"},{"line_number":777,"context_line":"                                                \u0027it is set by access_type.\u0027"},{"line_number":778,"context_line":"                                                % invalid_options)"},{"line_number":779,"context_line":""},{"line_number":780,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d constants.ACCESS_LEVEL_RO:"},{"line_number":781,"context_line":"            options.append(\u0027access_type\u003dro\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_fa1e185d","line":778,"range":{"start_line":755,"start_character":0,"end_line":778,"end_character":66},"updated":"2016-08-02 11:57:38.000000000","message":"This method looks like an almost verbatim copy of KNFSHelper._get_export_options. I strongly suggest to make a generalized method and to move it to superclass.","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"2c19aa7313f42c11458514574d43076aca574d99","unresolved":false,"context_lines":[{"line_number":752,"context_line":"        super(CESHelper, self).__init__(execute, config_object)"},{"line_number":753,"context_line":"        self._execute \u003d execute"},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"    def _get_export_options(self, share, access):"},{"line_number":756,"context_line":"        \"\"\"Set various export attributes for share.\"\"\""},{"line_number":757,"context_line":""},{"line_number":758,"context_line":"        extra_specs \u003d share_types.get_extra_specs_from_share(share)"},{"line_number":759,"context_line":"        ces_export_options \u003d extra_specs.get(\u0027ces:export_options\u0027, None)"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"        if ces_export_options:"},{"line_number":762,"context_line":"            ces_export_options \u003d ces_export_options.lower()"},{"line_number":763,"context_line":"            options \u003d ces_export_options.split(\u0027,\u0027)"},{"line_number":764,"context_line":"        else:"},{"line_number":765,"context_line":"            options \u003d []"},{"line_number":766,"context_line":""},{"line_number":767,"context_line":"        # rw \u0026 ro options are not allowed in"},{"line_number":768,"context_line":"        # extra_specs because they will be set by access_type."},{"line_number":769,"context_line":"        options_not_allowed \u003d [\u0027access_type\u003dro\u0027, \u0027access_type\u003drw\u0027]"},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"        invalid_options \u003d ["},{"line_number":772,"context_line":"            option for option in options if option in options_not_allowed"},{"line_number":773,"context_line":"        ]"},{"line_number":774,"context_line":""},{"line_number":775,"context_line":"        if invalid_options:"},{"line_number":776,"context_line":"            raise exception.InvalidInput(reason\u003d\u0027Invalid export_option %s as \u0027"},{"line_number":777,"context_line":"                                                \u0027it is set by access_type.\u0027"},{"line_number":778,"context_line":"                                                % invalid_options)"},{"line_number":779,"context_line":""},{"line_number":780,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d constants.ACCESS_LEVEL_RO:"},{"line_number":781,"context_line":"            options.append(\u0027access_type\u003dro\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_ea69f526","line":778,"range":{"start_line":755,"start_character":0,"end_line":778,"end_character":66},"in_reply_to":"bacf61ea_8876ac04","updated":"2016-08-03 08:59:59.000000000","message":"This is soooo trueee.","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"563fb2bbe3d211fa62367d05c2bb113705ee1ad2","unresolved":false,"context_lines":[{"line_number":752,"context_line":"        super(CESHelper, self).__init__(execute, config_object)"},{"line_number":753,"context_line":"        self._execute \u003d execute"},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"    def _get_export_options(self, share, access):"},{"line_number":756,"context_line":"        \"\"\"Set various export attributes for share.\"\"\""},{"line_number":757,"context_line":""},{"line_number":758,"context_line":"        extra_specs \u003d share_types.get_extra_specs_from_share(share)"},{"line_number":759,"context_line":"        ces_export_options \u003d extra_specs.get(\u0027ces:export_options\u0027, None)"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"        if ces_export_options:"},{"line_number":762,"context_line":"            ces_export_options \u003d ces_export_options.lower()"},{"line_number":763,"context_line":"            options \u003d ces_export_options.split(\u0027,\u0027)"},{"line_number":764,"context_line":"        else:"},{"line_number":765,"context_line":"            options \u003d []"},{"line_number":766,"context_line":""},{"line_number":767,"context_line":"        # rw \u0026 ro options are not allowed in"},{"line_number":768,"context_line":"        # extra_specs because they will be set by access_type."},{"line_number":769,"context_line":"        options_not_allowed \u003d [\u0027access_type\u003dro\u0027, \u0027access_type\u003drw\u0027]"},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"        invalid_options \u003d ["},{"line_number":772,"context_line":"            option for option in options if option in options_not_allowed"},{"line_number":773,"context_line":"        ]"},{"line_number":774,"context_line":""},{"line_number":775,"context_line":"        if invalid_options:"},{"line_number":776,"context_line":"            raise exception.InvalidInput(reason\u003d\u0027Invalid export_option %s as \u0027"},{"line_number":777,"context_line":"                                                \u0027it is set by access_type.\u0027"},{"line_number":778,"context_line":"                                                % invalid_options)"},{"line_number":779,"context_line":""},{"line_number":780,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d constants.ACCESS_LEVEL_RO:"},{"line_number":781,"context_line":"            options.append(\u0027access_type\u003dro\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9ad45d7e_cd3f1dd5","line":778,"range":{"start_line":755,"start_character":0,"end_line":778,"end_character":66},"in_reply_to":"bacf61ea_ea69f526","updated":"2016-08-08 09:46:46.000000000","message":"Done","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"c1f1657e1590dd03e59b56cb8371fa6d1453ba08","unresolved":false,"context_lines":[{"line_number":752,"context_line":"        super(CESHelper, self).__init__(execute, config_object)"},{"line_number":753,"context_line":"        self._execute \u003d execute"},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"    def _get_export_options(self, share, access):"},{"line_number":756,"context_line":"        \"\"\"Set various export attributes for share.\"\"\""},{"line_number":757,"context_line":""},{"line_number":758,"context_line":"        extra_specs \u003d share_types.get_extra_specs_from_share(share)"},{"line_number":759,"context_line":"        ces_export_options \u003d extra_specs.get(\u0027ces:export_options\u0027, None)"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"        if ces_export_options:"},{"line_number":762,"context_line":"            ces_export_options \u003d ces_export_options.lower()"},{"line_number":763,"context_line":"            options \u003d ces_export_options.split(\u0027,\u0027)"},{"line_number":764,"context_line":"        else:"},{"line_number":765,"context_line":"            options \u003d []"},{"line_number":766,"context_line":""},{"line_number":767,"context_line":"        # rw \u0026 ro options are not allowed in"},{"line_number":768,"context_line":"        # extra_specs because they will be set by access_type."},{"line_number":769,"context_line":"        options_not_allowed \u003d [\u0027access_type\u003dro\u0027, \u0027access_type\u003drw\u0027]"},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"        invalid_options \u003d ["},{"line_number":772,"context_line":"            option for option in options if option in options_not_allowed"},{"line_number":773,"context_line":"        ]"},{"line_number":774,"context_line":""},{"line_number":775,"context_line":"        if invalid_options:"},{"line_number":776,"context_line":"            raise exception.InvalidInput(reason\u003d\u0027Invalid export_option %s as \u0027"},{"line_number":777,"context_line":"                                                \u0027it is set by access_type.\u0027"},{"line_number":778,"context_line":"                                                % invalid_options)"},{"line_number":779,"context_line":""},{"line_number":780,"context_line":"        if access[\u0027access_level\u0027] \u003d\u003d constants.ACCESS_LEVEL_RO:"},{"line_number":781,"context_line":"            options.append(\u0027access_type\u003dro\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_8876ac04","line":778,"range":{"start_line":755,"start_character":0,"end_line":778,"end_character":66},"in_reply_to":"bacf61ea_fa1e185d","updated":"2016-08-02 14:58:32.000000000","message":"+1 It is duplicated.","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"d8f8f5da150c45fc5f470904a3759f7e5658817b","unresolved":false,"context_lines":[{"line_number":792,"context_line":"                                    \u0027list\u0027, \u0027-n\u0027, local_path)"},{"line_number":793,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":794,"context_line":"            msg \u003d (_(\u0027Failed to check exports on the systems. \u0027"},{"line_number":795,"context_line":"                     \u0027 Error: %s.\u0027) % e)"},{"line_number":796,"context_line":"            LOG.error(msg)"},{"line_number":797,"context_line":"            raise exception.GPFSException(msg)"},{"line_number":798,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_cc2058b3","line":795,"range":{"start_line":795,"start_character":22,"end_line":795,"end_character":23},"updated":"2016-08-04 06:00:42.000000000","message":"redundant space","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"563fb2bbe3d211fa62367d05c2bb113705ee1ad2","unresolved":false,"context_lines":[{"line_number":792,"context_line":"                                    \u0027list\u0027, \u0027-n\u0027, local_path)"},{"line_number":793,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":794,"context_line":"            msg \u003d (_(\u0027Failed to check exports on the systems. \u0027"},{"line_number":795,"context_line":"                     \u0027 Error: %s.\u0027) % e)"},{"line_number":796,"context_line":"            LOG.error(msg)"},{"line_number":797,"context_line":"            raise exception.GPFSException(msg)"},{"line_number":798,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_c367fa22","line":795,"range":{"start_line":795,"start_character":22,"end_line":795,"end_character":23},"in_reply_to":"bacf61ea_cc2058b3","updated":"2016-08-08 09:46:46.000000000","message":"Done","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"d8f8f5da150c45fc5f470904a3759f7e5658817b","unresolved":false,"context_lines":[{"line_number":793,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":794,"context_line":"            msg \u003d (_(\u0027Failed to check exports on the systems. \u0027"},{"line_number":795,"context_line":"                     \u0027 Error: %s.\u0027) % e)"},{"line_number":796,"context_line":"            LOG.error(msg)"},{"line_number":797,"context_line":"            raise exception.GPFSException(msg)"},{"line_number":798,"context_line":""},{"line_number":799,"context_line":"        out \u003d re.search(re.escape(local_path), out)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_ec0c3c44","line":796,"range":{"start_line":796,"start_character":22,"end_line":796,"end_character":25},"updated":"2016-08-04 06:00:42.000000000","message":"error log should be wrapped by _LE","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"4c7a694874bacf84b2e7ce82dc781332b3ed7ae9","unresolved":false,"context_lines":[{"line_number":841,"context_line":"                LOG.error(msg)"},{"line_number":842,"context_line":"                raise exception.GPFSException(msg)"},{"line_number":843,"context_line":"        else:"},{"line_number":844,"context_line":"            try:"},{"line_number":845,"context_line":"                self._execute(\u0027mmnfs\u0027, \u0027export\u0027,"},{"line_number":846,"context_line":"                              \u0027change\u0027, local_path,"},{"line_number":847,"context_line":"                              \u0027--nfsadd\u0027,"},{"line_number":848,"context_line":"                              access[\u0027access_to\u0027] + \u0027(\u0027 + export_opts + \u0027)\u0027)"},{"line_number":849,"context_line":"            except exception.ProcessExecutionError as e:"},{"line_number":850,"context_line":"                msg \u003d (_(\u0027Failed to allow access for share %(sharename)s. \u0027"},{"line_number":851,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"},{"line_number":852,"context_line":"                       {\u0027sharename\u0027: share[\u0027name\u0027],"},{"line_number":853,"context_line":"                        \u0027excmsg\u0027: e})"},{"line_number":854,"context_line":"                LOG.error(msg)"},{"line_number":855,"context_line":"                raise exception.GPFSException(msg)"},{"line_number":856,"context_line":""},{"line_number":857,"context_line":"    def deny_access(self, local_path, share, access, force\u003dFalse):"},{"line_number":858,"context_line":"        \"\"\"Deny access to the host.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_daacf4a0","line":855,"range":{"start_line":844,"start_character":12,"end_line":855,"end_character":50},"updated":"2016-08-02 11:57:38.000000000","message":"I am not insisting on this change, but still believe that something like the following method would be awesome:\n\ndef _execute_mmnfs_command(cmd, basicerrormsg):\n   try:\n       self._execute(\u0027mmnfs\u0027, cmd)\n   except exception.ProcessExecutionError as e:\n                msg \u003d (_(basicerrormsg + \u0027 %(sharename)s. \u0027\n                         \u0027Error: %(excmsg)s.\u0027) %\n                       {\u0027sharename\u0027: share[\u0027name\u0027],\n                        \u0027excmsg\u0027: e})\n                LOG.error(msg)\n                raise exception.GPFSException(msg)\n\nIt could have been reused in so many places!","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"9a5f4078f09f15c9de75e8f7438fc66dbd52048b","unresolved":false,"context_lines":[{"line_number":841,"context_line":"                LOG.error(msg)"},{"line_number":842,"context_line":"                raise exception.GPFSException(msg)"},{"line_number":843,"context_line":"        else:"},{"line_number":844,"context_line":"            try:"},{"line_number":845,"context_line":"                self._execute(\u0027mmnfs\u0027, \u0027export\u0027,"},{"line_number":846,"context_line":"                              \u0027change\u0027, local_path,"},{"line_number":847,"context_line":"                              \u0027--nfsadd\u0027,"},{"line_number":848,"context_line":"                              access[\u0027access_to\u0027] + \u0027(\u0027 + export_opts + \u0027)\u0027)"},{"line_number":849,"context_line":"            except exception.ProcessExecutionError as e:"},{"line_number":850,"context_line":"                msg \u003d (_(\u0027Failed to allow access for share %(sharename)s. \u0027"},{"line_number":851,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"},{"line_number":852,"context_line":"                       {\u0027sharename\u0027: share[\u0027name\u0027],"},{"line_number":853,"context_line":"                        \u0027excmsg\u0027: e})"},{"line_number":854,"context_line":"                LOG.error(msg)"},{"line_number":855,"context_line":"                raise exception.GPFSException(msg)"},{"line_number":856,"context_line":""},{"line_number":857,"context_line":"    def deny_access(self, local_path, share, access, force\u003dFalse):"},{"line_number":858,"context_line":"        \"\"\"Deny access to the host.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"9ad45d7e_d08e8d26","line":855,"range":{"start_line":844,"start_character":12,"end_line":855,"end_character":50},"in_reply_to":"9ad45d7e_d6b4cad2","updated":"2016-08-08 11:28:43.000000000","message":"Done","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"89c4c3b336b45b95672e43974693da8e0388045d","unresolved":false,"context_lines":[{"line_number":841,"context_line":"                LOG.error(msg)"},{"line_number":842,"context_line":"                raise exception.GPFSException(msg)"},{"line_number":843,"context_line":"        else:"},{"line_number":844,"context_line":"            try:"},{"line_number":845,"context_line":"                self._execute(\u0027mmnfs\u0027, \u0027export\u0027,"},{"line_number":846,"context_line":"                              \u0027change\u0027, local_path,"},{"line_number":847,"context_line":"                              \u0027--nfsadd\u0027,"},{"line_number":848,"context_line":"                              access[\u0027access_to\u0027] + \u0027(\u0027 + export_opts + \u0027)\u0027)"},{"line_number":849,"context_line":"            except exception.ProcessExecutionError as e:"},{"line_number":850,"context_line":"                msg \u003d (_(\u0027Failed to allow access for share %(sharename)s. \u0027"},{"line_number":851,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"},{"line_number":852,"context_line":"                       {\u0027sharename\u0027: share[\u0027name\u0027],"},{"line_number":853,"context_line":"                        \u0027excmsg\u0027: e})"},{"line_number":854,"context_line":"                LOG.error(msg)"},{"line_number":855,"context_line":"                raise exception.GPFSException(msg)"},{"line_number":856,"context_line":""},{"line_number":857,"context_line":"    def deny_access(self, local_path, share, access, force\u003dFalse):"},{"line_number":858,"context_line":"        \"\"\"Deny access to the host.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"9ad45d7e_d6b4cad2","line":855,"range":{"start_line":844,"start_character":12,"end_line":855,"end_character":50},"in_reply_to":"bacf61ea_7f678525","updated":"2016-08-08 10:25:13.000000000","message":"Proposed variant assumes unique error messages.\nWhat is wrong with \"return the output\"?","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"563fb2bbe3d211fa62367d05c2bb113705ee1ad2","unresolved":false,"context_lines":[{"line_number":841,"context_line":"                LOG.error(msg)"},{"line_number":842,"context_line":"                raise exception.GPFSException(msg)"},{"line_number":843,"context_line":"        else:"},{"line_number":844,"context_line":"            try:"},{"line_number":845,"context_line":"                self._execute(\u0027mmnfs\u0027, \u0027export\u0027,"},{"line_number":846,"context_line":"                              \u0027change\u0027, local_path,"},{"line_number":847,"context_line":"                              \u0027--nfsadd\u0027,"},{"line_number":848,"context_line":"                              access[\u0027access_to\u0027] + \u0027(\u0027 + export_opts + \u0027)\u0027)"},{"line_number":849,"context_line":"            except exception.ProcessExecutionError as e:"},{"line_number":850,"context_line":"                msg \u003d (_(\u0027Failed to allow access for share %(sharename)s. \u0027"},{"line_number":851,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"},{"line_number":852,"context_line":"                       {\u0027sharename\u0027: share[\u0027name\u0027],"},{"line_number":853,"context_line":"                        \u0027excmsg\u0027: e})"},{"line_number":854,"context_line":"                LOG.error(msg)"},{"line_number":855,"context_line":"                raise exception.GPFSException(msg)"},{"line_number":856,"context_line":""},{"line_number":857,"context_line":"    def deny_access(self, local_path, share, access, force\u003dFalse):"},{"line_number":858,"context_line":"        \"\"\"Deny access to the host.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_7f678525","line":855,"range":{"start_line":844,"start_character":12,"end_line":855,"end_character":50},"in_reply_to":"bacf61ea_daacf4a0","updated":"2016-08-08 09:46:46.000000000","message":"One point here - we need to parse the output of list command and then move forward. So, it has to be in the same method or we\u0027ll have to return the output.\nError messages for each command would be different and hence I have kept them as it is.","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"d8f8f5da150c45fc5f470904a3759f7e5658817b","unresolved":false,"context_lines":[{"line_number":861,"context_line":"                                    \u0027list\u0027, \u0027-n\u0027, local_path)"},{"line_number":862,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":863,"context_line":"            msg \u003d (_(\u0027Failed to check exports on the systems. \u0027"},{"line_number":864,"context_line":"                     \u0027 Error: %s.\u0027) % e)"},{"line_number":865,"context_line":"            LOG.error(msg)"},{"line_number":866,"context_line":"            raise exception.GPFSException(msg)"},{"line_number":867,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_a75b7df5","line":864,"range":{"start_line":864,"start_character":22,"end_line":864,"end_character":23},"updated":"2016-08-04 06:00:42.000000000","message":"redundant space","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"563fb2bbe3d211fa62367d05c2bb113705ee1ad2","unresolved":false,"context_lines":[{"line_number":861,"context_line":"                                    \u0027list\u0027, \u0027-n\u0027, local_path)"},{"line_number":862,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":863,"context_line":"            msg \u003d (_(\u0027Failed to check exports on the systems. \u0027"},{"line_number":864,"context_line":"                     \u0027 Error: %s.\u0027) % e)"},{"line_number":865,"context_line":"            LOG.error(msg)"},{"line_number":866,"context_line":"            raise exception.GPFSException(msg)"},{"line_number":867,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_837a22b8","line":864,"range":{"start_line":864,"start_character":22,"end_line":864,"end_character":23},"in_reply_to":"bacf61ea_a75b7df5","updated":"2016-08-08 09:46:46.000000000","message":"Done","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"4c7a694874bacf84b2e7ce82dc781332b3ed7ae9","unresolved":false,"context_lines":[{"line_number":867,"context_line":""},{"line_number":868,"context_line":"        out \u003d re.search(re.escape(local_path), out)"},{"line_number":869,"context_line":""},{"line_number":870,"context_line":"        if out is not None:"},{"line_number":871,"context_line":"            try:"},{"line_number":872,"context_line":"                self._execute(\u0027mmnfs\u0027, \u0027export\u0027, \u0027change\u0027, local_path,"},{"line_number":873,"context_line":"                              \u0027--nfsremove\u0027, access[\u0027access_to\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_1aadece8","line":870,"range":{"start_line":870,"start_character":8,"end_line":870,"end_character":27},"updated":"2016-08-02 11:57:38.000000000","message":"What happens if out is None?","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"563fb2bbe3d211fa62367d05c2bb113705ee1ad2","unresolved":false,"context_lines":[{"line_number":867,"context_line":""},{"line_number":868,"context_line":"        out \u003d re.search(re.escape(local_path), out)"},{"line_number":869,"context_line":""},{"line_number":870,"context_line":"        if out is not None:"},{"line_number":871,"context_line":"            try:"},{"line_number":872,"context_line":"                self._execute(\u0027mmnfs\u0027, \u0027export\u0027, \u0027change\u0027, local_path,"},{"line_number":873,"context_line":"                              \u0027--nfsremove\u0027, access[\u0027access_to\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_df3af1e6","line":870,"range":{"start_line":870,"start_character":8,"end_line":870,"end_character":27},"in_reply_to":"bacf61ea_1aadece8","updated":"2016-08-08 09:46:46.000000000","message":"If somehow export creation (allow_access) has failed and it is not created then access rule goes in error state. We would have to deny the access to that rule to remove it and then we can add new rules.\nThis condition checks if export exists or not and if it doesn\u0027t exist, deny access method doesn\u0027t do anything.","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"74b7414eda8db760b0a069a7518504b65739d5f9","unresolved":false,"context_lines":[{"line_number":803,"context_line":"        export_opts \u003d self.get_export_options(share, access, \u0027CES\u0027,"},{"line_number":804,"context_line":"                                              options_not_allowed)"},{"line_number":805,"context_line":""},{"line_number":806,"context_line":"        out \u003d re.search(re.escape(local_path), out)"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"        if out is None:"},{"line_number":809,"context_line":"            try:"},{"line_number":810,"context_line":"                self._execute(\u0027mmnfs\u0027, \u0027export\u0027, \u0027add\u0027, local_path, \u0027-c\u0027,"},{"line_number":811,"context_line":"                              access[\u0027access_to\u0027] + \u0027(\u0027 + export_opts + \u0027)\u0027)"},{"line_number":812,"context_line":"            except exception.ProcessExecutionError as e:"},{"line_number":813,"context_line":"                msg \u003d (_(\u0027Failed to allow access for share %(sharename)s. \u0027"},{"line_number":814,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"},{"line_number":815,"context_line":"                       {\u0027sharename\u0027: share[\u0027name\u0027],"},{"line_number":816,"context_line":"                        \u0027excmsg\u0027: e})"},{"line_number":817,"context_line":"                LOG.error(msg)"},{"line_number":818,"context_line":"                raise exception.GPFSException(msg)"},{"line_number":819,"context_line":"        else:"},{"line_number":820,"context_line":"            try:"},{"line_number":821,"context_line":"                self._execute(\u0027mmnfs\u0027, \u0027export\u0027,"},{"line_number":822,"context_line":"                              \u0027change\u0027, local_path,"},{"line_number":823,"context_line":"                              \u0027--nfsadd\u0027,"},{"line_number":824,"context_line":"                              access[\u0027access_to\u0027] + \u0027(\u0027 + export_opts + \u0027)\u0027)"},{"line_number":825,"context_line":"            except exception.ProcessExecutionError as e:"},{"line_number":826,"context_line":"                msg \u003d (_(\u0027Failed to allow access for share %(sharename)s. \u0027"},{"line_number":827,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"},{"line_number":828,"context_line":"                       {\u0027sharename\u0027: share[\u0027name\u0027],"},{"line_number":829,"context_line":"                        \u0027excmsg\u0027: e})"},{"line_number":830,"context_line":"                LOG.error(msg)"},{"line_number":831,"context_line":"                raise exception.GPFSException(msg)"},{"line_number":832,"context_line":""},{"line_number":833,"context_line":"    def deny_access(self, local_path, share, access, force\u003dFalse):"},{"line_number":834,"context_line":"        \"\"\"Deny access to the host.\"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"9ad45d7e_56173aed","line":831,"range":{"start_line":806,"start_character":8,"end_line":831,"end_character":50},"updated":"2016-08-08 10:25:06.000000000","message":"Simplification of this single method:\n\n\"\"\"\nif re.search(re.escape(local_path), out):\n    cmd \u003d (\u0027mmnfs\u0027, \u0027export\u0027, \u0027add\u0027, local_path, \u0027-c\u0027,\n           access[\u0027access_to\u0027] + \u0027(\u0027 + export_opts + \u0027)\u0027)\nelse:\n    cmd \u003d (\u0027mmnfs\u0027, \u0027export\u0027, \u0027change\u0027, local_path,\n           \u0027--nfsadd\u0027, access[\u0027access_to\u0027] + \u0027(\u0027 + export_opts + \u0027)\u0027)\n\ntry:\n    self._execute(*cmd)\nexcept exception.ProcessExecutionError as e:\n    msg \u003d (_(\u0027Failed to allow access for share %(sharename)s. \u0027\n             \u0027Error: %(excmsg)s.\u0027) %\n                 {\u0027sharename\u0027: share[\u0027name\u0027], \u0027excmsg\u0027: e})\n    LOG.error(msg)\n    raise exception.GPFSException(msg)\n\"\"\"\n\nBut as was said in previous patch-set [1], it could be simplified for more such places.\n\n[1] https://review.openstack.org/#/c/328829/11..12/manila/share/drivers/ibm/gpfs.py","commit_id":"1eb0d6451cefb5d3d0402be56b276e3e8617928a"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"705fb9039ad06128041a885b7a926b2832537fd9","unresolved":false,"context_lines":[{"line_number":760,"context_line":""},{"line_number":761,"context_line":"    def _execute_mmnfs_command(self, *cmd):"},{"line_number":762,"context_line":"        try:"},{"line_number":763,"context_line":"            cmd \u003d [\u0027mmnfs\u0027, \u0027export\u0027] + list(cmd)"},{"line_number":764,"context_line":"            out, __ \u003d self._execute(*cmd)"},{"line_number":765,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":766,"context_line":"            raise e"},{"line_number":767,"context_line":"        return out"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad45d7e_30ad6932","line":764,"range":{"start_line":763,"start_character":12,"end_line":764,"end_character":41},"updated":"2016-08-08 12:19:21.000000000","message":"out, __ \u003d self._execute(\u0027mmnfs\u0027, \u0027export\u0027, *cmd)","commit_id":"6256461a6baaf46c6dd4ca791c780ee77dbb0680"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"a8cc2745ef7fbaab7e7ec78c1d6a8a99c0ff73ba","unresolved":false,"context_lines":[{"line_number":760,"context_line":""},{"line_number":761,"context_line":"    def _execute_mmnfs_command(self, *cmd):"},{"line_number":762,"context_line":"        try:"},{"line_number":763,"context_line":"            cmd \u003d [\u0027mmnfs\u0027, \u0027export\u0027] + list(cmd)"},{"line_number":764,"context_line":"            out, __ \u003d self._execute(*cmd)"},{"line_number":765,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":766,"context_line":"            raise e"},{"line_number":767,"context_line":"        return out"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad45d7e_1fe82e7c","line":764,"range":{"start_line":763,"start_character":12,"end_line":764,"end_character":41},"in_reply_to":"9ad45d7e_30ad6932","updated":"2016-08-08 12:57:35.000000000","message":"Done","commit_id":"6256461a6baaf46c6dd4ca791c780ee77dbb0680"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"705fb9039ad06128041a885b7a926b2832537fd9","unresolved":false,"context_lines":[{"line_number":762,"context_line":"        try:"},{"line_number":763,"context_line":"            cmd \u003d [\u0027mmnfs\u0027, \u0027export\u0027] + list(cmd)"},{"line_number":764,"context_line":"            out, __ \u003d self._execute(*cmd)"},{"line_number":765,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":766,"context_line":"            raise e"},{"line_number":767,"context_line":"        return out"},{"line_number":768,"context_line":""},{"line_number":769,"context_line":"    def remove_export(self, local_path, share):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad45d7e_709081ed","line":766,"range":{"start_line":765,"start_character":8,"end_line":766,"end_character":19},"updated":"2016-08-08 12:19:21.000000000","message":"Catch and raise without any other actions is completely redundant.","commit_id":"6256461a6baaf46c6dd4ca791c780ee77dbb0680"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"a8cc2745ef7fbaab7e7ec78c1d6a8a99c0ff73ba","unresolved":false,"context_lines":[{"line_number":762,"context_line":"        try:"},{"line_number":763,"context_line":"            cmd \u003d [\u0027mmnfs\u0027, \u0027export\u0027] + list(cmd)"},{"line_number":764,"context_line":"            out, __ \u003d self._execute(*cmd)"},{"line_number":765,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":766,"context_line":"            raise e"},{"line_number":767,"context_line":"        return out"},{"line_number":768,"context_line":""},{"line_number":769,"context_line":"    def remove_export(self, local_path, share):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad45d7e_5f02a63f","line":766,"range":{"start_line":765,"start_character":8,"end_line":766,"end_character":19},"in_reply_to":"9ad45d7e_709081ed","updated":"2016-08-08 12:57:35.000000000","message":"Done","commit_id":"6256461a6baaf46c6dd4ca791c780ee77dbb0680"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"705fb9039ad06128041a885b7a926b2832537fd9","unresolved":false,"context_lines":[{"line_number":770,"context_line":"        \"\"\"Remove export.\"\"\""},{"line_number":771,"context_line":""},{"line_number":772,"context_line":"        try:"},{"line_number":773,"context_line":"            cmd \u003d [\u0027list\u0027, \u0027-n\u0027, local_path]"},{"line_number":774,"context_line":"            out \u003d self._execute_mmnfs_command(*cmd)"},{"line_number":775,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":776,"context_line":"            msg \u003d (_(\u0027Failed to check exports on the systems. \u0027"},{"line_number":777,"context_line":"                     \u0027Error: %s.\u0027) % e)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad45d7e_a9ed7427","line":774,"range":{"start_line":773,"start_character":12,"end_line":774,"end_character":51},"updated":"2016-08-08 12:19:21.000000000","message":"Just provide arguments:\n\nout \u003d self._execute_mmnfs_command(\u0027list\u0027, \u0027-n\u0027, local_path)","commit_id":"6256461a6baaf46c6dd4ca791c780ee77dbb0680"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"a8cc2745ef7fbaab7e7ec78c1d6a8a99c0ff73ba","unresolved":false,"context_lines":[{"line_number":770,"context_line":"        \"\"\"Remove export.\"\"\""},{"line_number":771,"context_line":""},{"line_number":772,"context_line":"        try:"},{"line_number":773,"context_line":"            cmd \u003d [\u0027list\u0027, \u0027-n\u0027, local_path]"},{"line_number":774,"context_line":"            out \u003d self._execute_mmnfs_command(*cmd)"},{"line_number":775,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":776,"context_line":"            msg \u003d (_(\u0027Failed to check exports on the systems. \u0027"},{"line_number":777,"context_line":"                     \u0027Error: %s.\u0027) % e)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad45d7e_bf992222","line":774,"range":{"start_line":773,"start_character":12,"end_line":774,"end_character":51},"in_reply_to":"9ad45d7e_a9ed7427","updated":"2016-08-08 12:57:35.000000000","message":"Done","commit_id":"6256461a6baaf46c6dd4ca791c780ee77dbb0680"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"705fb9039ad06128041a885b7a926b2832537fd9","unresolved":false,"context_lines":[{"line_number":782,"context_line":""},{"line_number":783,"context_line":"        if out is not None:"},{"line_number":784,"context_line":"            try:"},{"line_number":785,"context_line":"                cmd \u003d [\u0027remove\u0027, local_path]"},{"line_number":786,"context_line":"                self._execute_mmnfs_command(*cmd)"},{"line_number":787,"context_line":"            except exception.ProcessExecutionError as e:"},{"line_number":788,"context_line":"                msg \u003d (_(\u0027Failed to remove share %(sharename)s. \u0027"},{"line_number":789,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad45d7e_29da2479","line":786,"range":{"start_line":785,"start_character":16,"end_line":786,"end_character":49},"updated":"2016-08-08 12:19:21.000000000","message":"ditto","commit_id":"6256461a6baaf46c6dd4ca791c780ee77dbb0680"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"a8cc2745ef7fbaab7e7ec78c1d6a8a99c0ff73ba","unresolved":false,"context_lines":[{"line_number":782,"context_line":""},{"line_number":783,"context_line":"        if out is not None:"},{"line_number":784,"context_line":"            try:"},{"line_number":785,"context_line":"                cmd \u003d [\u0027remove\u0027, local_path]"},{"line_number":786,"context_line":"                self._execute_mmnfs_command(*cmd)"},{"line_number":787,"context_line":"            except exception.ProcessExecutionError as e:"},{"line_number":788,"context_line":"                msg \u003d (_(\u0027Failed to remove share %(sharename)s. \u0027"},{"line_number":789,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad45d7e_ffa39a4d","line":786,"range":{"start_line":785,"start_character":16,"end_line":786,"end_character":49},"in_reply_to":"9ad45d7e_29da2479","updated":"2016-08-08 12:57:35.000000000","message":"Done","commit_id":"6256461a6baaf46c6dd4ca791c780ee77dbb0680"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"705fb9039ad06128041a885b7a926b2832537fd9","unresolved":false,"context_lines":[{"line_number":799,"context_line":"            raise exception.InvalidShareAccess(reason\u003d\u0027Only ip access type \u0027"},{"line_number":800,"context_line":"                                                      \u0027supported.\u0027)"},{"line_number":801,"context_line":"        try:"},{"line_number":802,"context_line":"            cmd \u003d [\u0027list\u0027, \u0027-n\u0027, local_path]"},{"line_number":803,"context_line":"            out \u003d self._execute_mmnfs_command(*cmd)"},{"line_number":804,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":805,"context_line":"            msg \u003d (_(\u0027Failed to check exports on the systems. \u0027"},{"line_number":806,"context_line":"                     \u0027Error: %s.\u0027) % e)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad45d7e_a9d45447","line":803,"range":{"start_line":802,"start_character":12,"end_line":803,"end_character":51},"updated":"2016-08-08 12:19:21.000000000","message":"ditto","commit_id":"6256461a6baaf46c6dd4ca791c780ee77dbb0680"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"a8cc2745ef7fbaab7e7ec78c1d6a8a99c0ff73ba","unresolved":false,"context_lines":[{"line_number":799,"context_line":"            raise exception.InvalidShareAccess(reason\u003d\u0027Only ip access type \u0027"},{"line_number":800,"context_line":"                                                      \u0027supported.\u0027)"},{"line_number":801,"context_line":"        try:"},{"line_number":802,"context_line":"            cmd \u003d [\u0027list\u0027, \u0027-n\u0027, local_path]"},{"line_number":803,"context_line":"            out \u003d self._execute_mmnfs_command(*cmd)"},{"line_number":804,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":805,"context_line":"            msg \u003d (_(\u0027Failed to check exports on the systems. \u0027"},{"line_number":806,"context_line":"                     \u0027Error: %s.\u0027) % e)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad45d7e_7f904aed","line":803,"range":{"start_line":802,"start_character":12,"end_line":803,"end_character":51},"in_reply_to":"9ad45d7e_a9d45447","updated":"2016-08-08 12:57:35.000000000","message":"Done","commit_id":"6256461a6baaf46c6dd4ca791c780ee77dbb0680"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"705fb9039ad06128041a885b7a926b2832537fd9","unresolved":false,"context_lines":[{"line_number":834,"context_line":"    def deny_access(self, local_path, share, access, force\u003dFalse):"},{"line_number":835,"context_line":"        \"\"\"Deny access to the host.\"\"\""},{"line_number":836,"context_line":"        try:"},{"line_number":837,"context_line":"            cmd \u003d [\u0027list\u0027, \u0027-n\u0027, local_path]"},{"line_number":838,"context_line":"            out \u003d self._execute_mmnfs_command(*cmd)"},{"line_number":839,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":840,"context_line":"            msg \u003d (_(\u0027Failed to check exports on the systems. \u0027"},{"line_number":841,"context_line":"                     \u0027Error: %s.\u0027) % e)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad45d7e_494b182c","line":838,"range":{"start_line":837,"start_character":12,"end_line":838,"end_character":51},"updated":"2016-08-08 12:19:21.000000000","message":"ditto","commit_id":"6256461a6baaf46c6dd4ca791c780ee77dbb0680"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"a8cc2745ef7fbaab7e7ec78c1d6a8a99c0ff73ba","unresolved":false,"context_lines":[{"line_number":834,"context_line":"    def deny_access(self, local_path, share, access, force\u003dFalse):"},{"line_number":835,"context_line":"        \"\"\"Deny access to the host.\"\"\""},{"line_number":836,"context_line":"        try:"},{"line_number":837,"context_line":"            cmd \u003d [\u0027list\u0027, \u0027-n\u0027, local_path]"},{"line_number":838,"context_line":"            out \u003d self._execute_mmnfs_command(*cmd)"},{"line_number":839,"context_line":"        except exception.ProcessExecutionError as e:"},{"line_number":840,"context_line":"            msg \u003d (_(\u0027Failed to check exports on the systems. \u0027"},{"line_number":841,"context_line":"                     \u0027Error: %s.\u0027) % e)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad45d7e_dfbb3674","line":838,"range":{"start_line":837,"start_character":12,"end_line":838,"end_character":51},"in_reply_to":"9ad45d7e_494b182c","updated":"2016-08-08 12:57:35.000000000","message":"Done","commit_id":"6256461a6baaf46c6dd4ca791c780ee77dbb0680"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"705fb9039ad06128041a885b7a926b2832537fd9","unresolved":false,"context_lines":[{"line_number":845,"context_line":"        out \u003d re.search(re.escape(access[\u0027access_to\u0027]), out)"},{"line_number":846,"context_line":""},{"line_number":847,"context_line":"        if out is not None:"},{"line_number":848,"context_line":"            cmd \u003d [\u0027change\u0027, local_path, \u0027--nfsremove\u0027,"},{"line_number":849,"context_line":"                   access[\u0027access_to\u0027]]"},{"line_number":850,"context_line":"            try:"},{"line_number":851,"context_line":"                self._execute_mmnfs_command(*cmd)"},{"line_number":852,"context_line":"            except exception.ProcessExecutionError as e:"},{"line_number":853,"context_line":"                msg \u003d (_(\u0027Failed to remove access for share %(sharename)s. \u0027"},{"line_number":854,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad45d7e_2948642d","line":851,"range":{"start_line":848,"start_character":12,"end_line":851,"end_character":49},"updated":"2016-08-08 12:19:21.000000000","message":"ditto","commit_id":"6256461a6baaf46c6dd4ca791c780ee77dbb0680"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"a8cc2745ef7fbaab7e7ec78c1d6a8a99c0ff73ba","unresolved":false,"context_lines":[{"line_number":845,"context_line":"        out \u003d re.search(re.escape(access[\u0027access_to\u0027]), out)"},{"line_number":846,"context_line":""},{"line_number":847,"context_line":"        if out is not None:"},{"line_number":848,"context_line":"            cmd \u003d [\u0027change\u0027, local_path, \u0027--nfsremove\u0027,"},{"line_number":849,"context_line":"                   access[\u0027access_to\u0027]]"},{"line_number":850,"context_line":"            try:"},{"line_number":851,"context_line":"                self._execute_mmnfs_command(*cmd)"},{"line_number":852,"context_line":"            except exception.ProcessExecutionError as e:"},{"line_number":853,"context_line":"                msg \u003d (_(\u0027Failed to remove access for share %(sharename)s. \u0027"},{"line_number":854,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ad45d7e_bfc002e2","line":851,"range":{"start_line":848,"start_character":12,"end_line":851,"end_character":49},"in_reply_to":"9ad45d7e_2948642d","updated":"2016-08-08 12:57:35.000000000","message":"Done","commit_id":"6256461a6baaf46c6dd4ca791c780ee77dbb0680"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"8b93e3ea791ab13bfd8058d32a612f9c01d3aab2","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"},{"line_number":201,"context_line":"                       {\u0027cmd\u0027: command, \u0027excmsg\u0027: e})"},{"line_number":202,"context_line":"                LOG.error(msg)"},{"line_number":203,"context_line":"                raise exception.GPFSException(e)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def _gpfs_ssh_execute(self, ssh, cmd, ignore_exit_code\u003dNone,"},{"line_number":206,"context_line":"                          check_exit_code\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_40ba66c1","line":203,"range":{"start_line":203,"start_character":46,"end_line":203,"end_character":47},"updated":"2016-08-10 03:48:19.000000000","message":"Why not use msg instead of e? The msg include more details than e.","commit_id":"55be0cb9ba2ad156b67e252b91645d970d8be005"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"78d7644d83ce02240accd94d18a8bd712fbbb782","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                         \u0027Error: %(excmsg)s.\u0027) %"},{"line_number":201,"context_line":"                       {\u0027cmd\u0027: command, \u0027excmsg\u0027: e})"},{"line_number":202,"context_line":"                LOG.error(msg)"},{"line_number":203,"context_line":"                raise exception.GPFSException(e)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def _gpfs_ssh_execute(self, ssh, cmd, ignore_exit_code\u003dNone,"},{"line_number":206,"context_line":"                          check_exit_code\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_291c7676","line":203,"range":{"start_line":203,"start_character":46,"end_line":203,"end_character":47},"in_reply_to":"9ad45d7e_40ba66c1","updated":"2016-08-10 08:55:32.000000000","message":"Done","commit_id":"55be0cb9ba2ad156b67e252b91645d970d8be005"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"8b93e3ea791ab13bfd8058d32a612f9c01d3aab2","unresolved":false,"context_lines":[{"line_number":618,"context_line":"        \"\"\"Get the export options.\"\"\""},{"line_number":619,"context_line":"        extra_specs \u003d share_types.get_extra_specs_from_share(share)"},{"line_number":620,"context_line":"        if helper \u003d\u003d \u0027KNFS\u0027:"},{"line_number":621,"context_line":"            export_options \u003d extra_specs.get(\u0027knfs:export_options\u0027, None)"},{"line_number":622,"context_line":"        elif helper \u003d\u003d \u0027CES\u0027:"},{"line_number":623,"context_line":"            export_options \u003d extra_specs.get(\u0027ces:export_options\u0027, None)"},{"line_number":624,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_e0555a50","line":621,"range":{"start_line":621,"start_character":41,"end_line":621,"end_character":73},"updated":"2016-08-10 03:48:19.000000000","message":"Can just use extra_specs.get(\u0027knfs:export_options\u0027), \u0027None\u0027 would be the default return value.","commit_id":"55be0cb9ba2ad156b67e252b91645d970d8be005"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"78d7644d83ce02240accd94d18a8bd712fbbb782","unresolved":false,"context_lines":[{"line_number":618,"context_line":"        \"\"\"Get the export options.\"\"\""},{"line_number":619,"context_line":"        extra_specs \u003d share_types.get_extra_specs_from_share(share)"},{"line_number":620,"context_line":"        if helper \u003d\u003d \u0027KNFS\u0027:"},{"line_number":621,"context_line":"            export_options \u003d extra_specs.get(\u0027knfs:export_options\u0027, None)"},{"line_number":622,"context_line":"        elif helper \u003d\u003d \u0027CES\u0027:"},{"line_number":623,"context_line":"            export_options \u003d extra_specs.get(\u0027ces:export_options\u0027, None)"},{"line_number":624,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_e9025e0a","line":621,"range":{"start_line":621,"start_character":41,"end_line":621,"end_character":73},"in_reply_to":"9ad45d7e_e0555a50","updated":"2016-08-10 08:55:32.000000000","message":"Done","commit_id":"55be0cb9ba2ad156b67e252b91645d970d8be005"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"8b93e3ea791ab13bfd8058d32a612f9c01d3aab2","unresolved":false,"context_lines":[{"line_number":620,"context_line":"        if helper \u003d\u003d \u0027KNFS\u0027:"},{"line_number":621,"context_line":"            export_options \u003d extra_specs.get(\u0027knfs:export_options\u0027, None)"},{"line_number":622,"context_line":"        elif helper \u003d\u003d \u0027CES\u0027:"},{"line_number":623,"context_line":"            export_options \u003d extra_specs.get(\u0027ces:export_options\u0027, None)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"        if export_options:"},{"line_number":626,"context_line":"            export_options \u003d export_options.lower()"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_80d57eba","line":623,"range":{"start_line":623,"start_character":41,"end_line":623,"end_character":72},"updated":"2016-08-10 03:48:19.000000000","message":"Can just use extra_specs.get(\u0027knfs:export_options\u0027), \u0027None\u0027 would be the default return value.","commit_id":"55be0cb9ba2ad156b67e252b91645d970d8be005"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"78d7644d83ce02240accd94d18a8bd712fbbb782","unresolved":false,"context_lines":[{"line_number":620,"context_line":"        if helper \u003d\u003d \u0027KNFS\u0027:"},{"line_number":621,"context_line":"            export_options \u003d extra_specs.get(\u0027knfs:export_options\u0027, None)"},{"line_number":622,"context_line":"        elif helper \u003d\u003d \u0027CES\u0027:"},{"line_number":623,"context_line":"            export_options \u003d extra_specs.get(\u0027ces:export_options\u0027, None)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"        if export_options:"},{"line_number":626,"context_line":"            export_options \u003d export_options.lower()"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_3c003201","line":623,"range":{"start_line":623,"start_character":41,"end_line":623,"end_character":72},"in_reply_to":"9ad45d7e_80d57eba","updated":"2016-08-10 08:55:32.000000000","message":"Done","commit_id":"55be0cb9ba2ad156b67e252b91645d970d8be005"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"8b93e3ea791ab13bfd8058d32a612f9c01d3aab2","unresolved":false,"context_lines":[{"line_number":622,"context_line":"        elif helper \u003d\u003d \u0027CES\u0027:"},{"line_number":623,"context_line":"            export_options \u003d extra_specs.get(\u0027ces:export_options\u0027, None)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"        if export_options:"},{"line_number":626,"context_line":"            export_options \u003d export_options.lower()"},{"line_number":627,"context_line":"            options \u003d export_options.split(\u0027,\u0027)"},{"line_number":628,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_e34c4444","line":625,"range":{"start_line":625,"start_character":8,"end_line":625,"end_character":26},"updated":"2016-08-10 03:48:19.000000000","message":"If helper is not equal to \u0027KNFS\u0027 and \u0027CES\u0027, the export_options will not be set. The code will return : \u0027NameError: name \u0027export_options\u0027 is not defined\u0027. so please add else in code line 624.","commit_id":"55be0cb9ba2ad156b67e252b91645d970d8be005"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"78d7644d83ce02240accd94d18a8bd712fbbb782","unresolved":false,"context_lines":[{"line_number":622,"context_line":"        elif helper \u003d\u003d \u0027CES\u0027:"},{"line_number":623,"context_line":"            export_options \u003d extra_specs.get(\u0027ces:export_options\u0027, None)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"        if export_options:"},{"line_number":626,"context_line":"            export_options \u003d export_options.lower()"},{"line_number":627,"context_line":"            options \u003d export_options.split(\u0027,\u0027)"},{"line_number":628,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_1c03ae0e","line":625,"range":{"start_line":625,"start_character":8,"end_line":625,"end_character":26},"in_reply_to":"9ad45d7e_e34c4444","updated":"2016-08-10 08:55:32.000000000","message":"Done","commit_id":"55be0cb9ba2ad156b67e252b91645d970d8be005"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"8b93e3ea791ab13bfd8058d32a612f9c01d3aab2","unresolved":false,"context_lines":[{"line_number":623,"context_line":"            export_options \u003d extra_specs.get(\u0027ces:export_options\u0027, None)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"        if export_options:"},{"line_number":626,"context_line":"            export_options \u003d export_options.lower()"},{"line_number":627,"context_line":"            options \u003d export_options.split(\u0027,\u0027)"},{"line_number":628,"context_line":"        else:"},{"line_number":629,"context_line":"            options \u003d []"},{"line_number":630,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_a3ac0ca1","line":627,"range":{"start_line":626,"start_character":12,"end_line":627,"end_character":47},"updated":"2016-08-10 03:48:19.000000000","message":"options \u003d export_options.lower().split(\u0027,\u0027)","commit_id":"55be0cb9ba2ad156b67e252b91645d970d8be005"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"78d7644d83ce02240accd94d18a8bd712fbbb782","unresolved":false,"context_lines":[{"line_number":623,"context_line":"            export_options \u003d extra_specs.get(\u0027ces:export_options\u0027, None)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"        if export_options:"},{"line_number":626,"context_line":"            export_options \u003d export_options.lower()"},{"line_number":627,"context_line":"            options \u003d export_options.split(\u0027,\u0027)"},{"line_number":628,"context_line":"        else:"},{"line_number":629,"context_line":"            options \u003d []"},{"line_number":630,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9ad45d7e_3c2792b7","line":627,"range":{"start_line":626,"start_character":12,"end_line":627,"end_character":47},"in_reply_to":"9ad45d7e_a3ac0ca1","updated":"2016-08-10 08:55:32.000000000","message":"Done","commit_id":"55be0cb9ba2ad156b67e252b91645d970d8be005"}],"manila/tests/share/drivers/ibm/test_gpfs.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"2c19aa7313f42c11458514574d43076aca574d99","unresolved":false,"context_lines":[{"line_number":396,"context_line":"        self._driver._get_gpfs_device \u003d mock.Mock(return_value\u003dself.fakedev)"},{"line_number":397,"context_line":"        self._driver._gpfs_execute \u003d mock.Mock(return_value\u003dTrue)"},{"line_number":398,"context_line":"        self._driver._extend_share(self.share, 10)"},{"line_number":399,"context_line":"        self._driver._gpfs_execute.assert_called_once_with(\u0027mmsetquota\u0027,"},{"line_number":400,"context_line":"                                                           self.fakedev +"},{"line_number":401,"context_line":"                                                           \u0027:\u0027 +"},{"line_number":402,"context_line":"                                                           self.share[\u0027name\u0027],"},{"line_number":403,"context_line":"                                                           \u0027--block\u0027,"},{"line_number":404,"context_line":"                                                           \u00270:10G\u0027)"},{"line_number":405,"context_line":"        self._driver._get_gpfs_device.assert_called_once_with()"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"    def test__extend_share_exception(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_8525caaf","line":404,"range":{"start_line":399,"start_character":8,"end_line":404,"end_character":67},"updated":"2016-08-03 08:59:59.000000000","message":"Please, use \"new line\":\n\n\"\"\"\nself._driver._gpfs_execute.assert_called_once_with(\n    \u0027mmsetquota\u0027,\n    self.fakedev + \u0027:\u0027 + self.share[\u0027name\u0027],\n    \u0027--block\u0027,\n    \u00270:10G\u0027)\n\"\"\"","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"563fb2bbe3d211fa62367d05c2bb113705ee1ad2","unresolved":false,"context_lines":[{"line_number":396,"context_line":"        self._driver._get_gpfs_device \u003d mock.Mock(return_value\u003dself.fakedev)"},{"line_number":397,"context_line":"        self._driver._gpfs_execute \u003d mock.Mock(return_value\u003dTrue)"},{"line_number":398,"context_line":"        self._driver._extend_share(self.share, 10)"},{"line_number":399,"context_line":"        self._driver._gpfs_execute.assert_called_once_with(\u0027mmsetquota\u0027,"},{"line_number":400,"context_line":"                                                           self.fakedev +"},{"line_number":401,"context_line":"                                                           \u0027:\u0027 +"},{"line_number":402,"context_line":"                                                           self.share[\u0027name\u0027],"},{"line_number":403,"context_line":"                                                           \u0027--block\u0027,"},{"line_number":404,"context_line":"                                                           \u00270:10G\u0027)"},{"line_number":405,"context_line":"        self._driver._get_gpfs_device.assert_called_once_with()"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"    def test__extend_share_exception(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_9501b5b1","line":404,"range":{"start_line":399,"start_character":8,"end_line":404,"end_character":67},"in_reply_to":"bacf61ea_8525caaf","updated":"2016-08-08 09:46:46.000000000","message":"Done","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"2c19aa7313f42c11458514574d43076aca574d99","unresolved":false,"context_lines":[{"line_number":854,"context_line":""},{"line_number":855,"context_line":"        access \u003d self.access"},{"line_number":856,"context_line":"        local_path \u003d self.fakesharepath"},{"line_number":857,"context_line":"        self._ces_helper.allow_access(local_path, self.share, access)"},{"line_number":858,"context_line":"        self._ces_helper._execute.assert_any_call(\u0027mmnfs\u0027, \u0027export\u0027, \u0027list\u0027,"},{"line_number":859,"context_line":"                                                  \u0027-n\u0027, local_path)"},{"line_number":860,"context_line":"        self._ces_helper._execute.assert_any_call(\u0027mmnfs\u0027, \u0027export\u0027, \u0027add\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_05af1ae4","line":857,"range":{"start_line":857,"start_character":8,"end_line":857,"end_character":69},"updated":"2016-08-03 08:59:59.000000000","message":"It is preferred to separate tested command call with empty line below and above.","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"},{"author":{"_account_id":9207,"name":"Gaurang Tapase","email":"gtapase@ddn.com","username":"gaurang.tapase"},"change_message_id":"563fb2bbe3d211fa62367d05c2bb113705ee1ad2","unresolved":false,"context_lines":[{"line_number":854,"context_line":""},{"line_number":855,"context_line":"        access \u003d self.access"},{"line_number":856,"context_line":"        local_path \u003d self.fakesharepath"},{"line_number":857,"context_line":"        self._ces_helper.allow_access(local_path, self.share, access)"},{"line_number":858,"context_line":"        self._ces_helper._execute.assert_any_call(\u0027mmnfs\u0027, \u0027export\u0027, \u0027list\u0027,"},{"line_number":859,"context_line":"                                                  \u0027-n\u0027, local_path)"},{"line_number":860,"context_line":"        self._ces_helper._execute.assert_any_call(\u0027mmnfs\u0027, \u0027export\u0027, \u0027add\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_55d0dd1e","line":857,"range":{"start_line":857,"start_character":8,"end_line":857,"end_character":69},"in_reply_to":"bacf61ea_05af1ae4","updated":"2016-08-08 09:46:46.000000000","message":"Done","commit_id":"7b06c58390d24800c092fe2c58e8ef54ace3ffa2"}],"releasenotes/notes/ibm-gpfs-ces-support-3498e35d9fea1b55.yaml":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"77d2aeb051e9df96df46cdd5e5ee1024c34efdc5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude:"},{"line_number":3,"context_line":"  - Refactored GPFS driver to support NFS Ganesha"},{"line_number":4,"context_line":"    through Spectrum Scale CES framework."},{"line_number":5,"context_line":"upgrade:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"dada55a8_23043813","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":8},"updated":"2016-07-27 12:02:26.000000000","message":"\"releasenotes\" job fails because this line violates syntax.\n\nIt should be as of following:\n\n\"\"\"\nprelude: \u003e\n\"\"\"\n\nI suspect, you either manually wrote this line of mistakenly changed autogenerated variant.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"179e47b21d7c11b5f77fec5e79bab3c3ee36ce70","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude:"},{"line_number":3,"context_line":"  - Refactored GPFS driver to support NFS Ganesha"},{"line_number":4,"context_line":"    through Spectrum Scale CES framework."},{"line_number":5,"context_line":"upgrade:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"dada55a8_b837b7e1","line":2,"range":{"start_line":2,"start_character":7,"end_line":2,"end_character":8},"updated":"2016-07-27 12:03:16.000000000","message":": \u003e","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"179e47b21d7c11b5f77fec5e79bab3c3ee36ce70","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude:"},{"line_number":3,"context_line":"  - Refactored GPFS driver to support NFS Ganesha"},{"line_number":4,"context_line":"    through Spectrum Scale CES framework."},{"line_number":5,"context_line":"upgrade:"},{"line_number":6,"context_line":"  - Added a new config option is_gpfs_node which will"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"dada55a8_d8b1cb48","line":3,"range":{"start_line":3,"start_character":2,"end_line":3,"end_character":4},"updated":"2016-07-27 12:03:16.000000000","message":"Remove","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"179e47b21d7c11b5f77fec5e79bab3c3ee36ce70","unresolved":false,"context_lines":[{"line_number":6,"context_line":"  - Added a new config option is_gpfs_node which will"},{"line_number":7,"context_line":"    determine if manila share service is running on"},{"line_number":8,"context_line":"    GPFS node or not."},{"line_number":9,"context_line":"    Deprecated knfs_export_options configuration"},{"line_number":10,"context_line":"    parameter as export options are now configured"},{"line_number":11,"context_line":"    in extra specs of share types."},{"line_number":12,"context_line":"    Added mmnfs commands in the root wrap share.filters."},{"line_number":13,"context_line":"    Removed scp and ssh commands from root wrap share.filters."},{"line_number":14,"context_line":"deprecations:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"dada55a8_985633cc","line":11,"range":{"start_line":9,"start_character":4,"end_line":11,"end_character":34},"updated":"2016-07-27 12:03:16.000000000","message":"This is repeated below.","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"179e47b21d7c11b5f77fec5e79bab3c3ee36ce70","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    Deprecated knfs_export_options configuration"},{"line_number":10,"context_line":"    parameter as export options are now configured"},{"line_number":11,"context_line":"    in extra specs of share types."},{"line_number":12,"context_line":"    Added mmnfs commands in the root wrap share.filters."},{"line_number":13,"context_line":"    Removed scp and ssh commands from root wrap share.filters."},{"line_number":14,"context_line":"deprecations:"},{"line_number":15,"context_line":"  - Deprecated knfs_export_options configuration"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"dada55a8_d898abc2","line":12,"range":{"start_line":12,"start_character":10,"end_line":12,"end_character":15},"updated":"2016-07-27 12:03:16.000000000","message":"``mmnfs``","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"179e47b21d7c11b5f77fec5e79bab3c3ee36ce70","unresolved":false,"context_lines":[{"line_number":12,"context_line":"    Added mmnfs commands in the root wrap share.filters."},{"line_number":13,"context_line":"    Removed scp and ssh commands from root wrap share.filters."},{"line_number":14,"context_line":"deprecations:"},{"line_number":15,"context_line":"  - Deprecated knfs_export_options configuration"},{"line_number":16,"context_line":"    parameter as export options are now configured"},{"line_number":17,"context_line":"    in extra specs of share types."}],"source_content_type":"text/x-yaml","patch_set":10,"id":"dada55a8_98f11304","line":15,"range":{"start_line":15,"start_character":15,"end_line":15,"end_character":34},"updated":"2016-07-27 12:03:16.000000000","message":"``knfs_export_options``","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"f9b9802b695a977bdcf8df5c29f2a418e32e7709","unresolved":false,"context_lines":[{"line_number":14,"context_line":"deprecations:"},{"line_number":15,"context_line":"  - Deprecated knfs_export_options configuration"},{"line_number":16,"context_line":"    parameter as export options are now configured"},{"line_number":17,"context_line":"    in extra specs of share types."}],"source_content_type":"text/x-yaml","patch_set":10,"id":"dada55a8_63363052","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":34},"updated":"2016-07-27 12:13:55.000000000","message":"---\nprelude: \u003e\n    Refactored GPFS driver to support NFS Ganesha\n    through Spectrum Scale CES framework.\nupgrade:\n  - Added a new config option is_gpfs_node which will\n    determine if manila share service is running on\n    GPFS node or not.\n    Deprecated knfs_export_options configuration\n    parameter as export options are now configured\n    in extra specs of share types.\n    Added mmnfs commands in the root wrap share.filters.\n    Removed scp and ssh commands from root wrap share.filters.\ndeprecations:\n  - Deprecated ``knfs_export_options`` configuration parameter as export\n    options are now configured in extra specs of share types.\n\n\n\n^^ Built fine with this","commit_id":"4cec5588050cf9a4d5cc4f43ba0f8bb0f98633e9"}]}
