)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"a4da738401f6b907bd556bccb006413076cd7c77","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Hitachi HNAS driver refactoring in order to improve modularization."},{"line_number":10,"context_line":"With this patch, the code used for communicating with HNAS is"},{"line_number":11,"context_line":"separated from the driver, so it is easier to change the"},{"line_number":12,"context_line":"communication protocol. This patch also fixes seom minor bugs from"},{"line_number":13,"context_line":"previous versions of the driver."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: Iffdd6ea863dea5ad73c3cb1cdd9cdc0b75d695f1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"fa69d971_e43fdab1","line":12,"range":{"start_line":12,"start_character":46,"end_line":12,"end_character":50},"updated":"2016-01-06 19:27:51.000000000","message":"s/seom/some","commit_id":"ce39b9be062c17f27968bbeaea047e1c415a5384"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"552c1aff64e7948f095c34b9d7fe34e499eb8510","unresolved":false,"context_lines":[{"line_number":11,"context_line":"separated from the driver, so it is easier to change the"},{"line_number":12,"context_line":"communication protocol. This patch also fixes some minor bugs from"},{"line_number":13,"context_line":"previous versions of the driver."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: Iffdd6ea863dea5ad73c3cb1cdd9cdc0b75d695f1"},{"line_number":16,"context_line":"Implements: blueprint hitachi-hnas-driver-refactoring"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"da6ed579_495d8147","line":14,"updated":"2016-01-18 19:49:18.000000000","message":"DocImpact flag should be used as you adding a new parameter","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"3d4f782f85787e72b20e79a572249db121e5e38f","unresolved":false,"context_lines":[{"line_number":11,"context_line":"separated from the driver, so it is easier to change the"},{"line_number":12,"context_line":"communication protocol. This patch also fixes some minor bugs from"},{"line_number":13,"context_line":"previous versions of the driver."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: Iffdd6ea863dea5ad73c3cb1cdd9cdc0b75d695f1"},{"line_number":16,"context_line":"Implements: blueprint hitachi-hnas-driver-refactoring"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"ba63e191_30eaa510","line":14,"in_reply_to":"da6ed579_495d8147","updated":"2016-01-19 19:09:26.000000000","message":"Done","commit_id":"ba817962f59379e9d98cd935961d734b97822558"}],"manila/exception.py":[{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"0d21a5c8f905aaa0325ff5e55d2228c939c81e43","unresolved":false,"context_lines":[{"line_number":663,"context_line":"    message \u003d _(\"HNAS Connection Exception: %(msg)s\")"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"class HNASItemNotFoundException(ManilaException):"},{"line_number":667,"context_line":"    message \u003d _(\"HNAS Item Not Found Exception: %(msg)s\")"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_94d709bf","line":666,"range":{"start_line":666,"start_character":32,"end_line":666,"end_character":47},"updated":"2016-01-07 14:17:35.000000000","message":"This should derive from NotFound.","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"876bf74838358baada365775cafd1eae93197e11","unresolved":false,"context_lines":[{"line_number":663,"context_line":"    message \u003d _(\"HNAS Connection Exception: %(msg)s\")"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"class HNASItemNotFoundException(ManilaException):"},{"line_number":667,"context_line":"    message \u003d _(\"HNAS Item Not Found Exception: %(msg)s\")"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_b8ab1bd6","line":666,"range":{"start_line":666,"start_character":32,"end_line":666,"end_character":47},"in_reply_to":"fa69d971_80a25f99","updated":"2016-01-07 16:33:33.000000000","message":"+1  StorageResourceNotFound was designed for this.","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"9f442fd380ea63de663aca39093adbacdc9d06dd","unresolved":false,"context_lines":[{"line_number":663,"context_line":"    message \u003d _(\"HNAS Connection Exception: %(msg)s\")"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"class HNASItemNotFoundException(ManilaException):"},{"line_number":667,"context_line":"    message \u003d _(\"HNAS Item Not Found Exception: %(msg)s\")"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_80a25f99","line":666,"range":{"start_line":666,"start_character":32,"end_line":666,"end_character":47},"in_reply_to":"fa69d971_94d709bf","updated":"2016-01-07 15:00:24.000000000","message":"Or more specifically from StorageResourceNotFound.\n\nRefer to https://review.openstack.org/#/c/261440/","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"f1eeeb3b5c9a399c364f801c83133d219b22458b","unresolved":false,"context_lines":[{"line_number":668,"context_line":""},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"class HNASNothingToCloneException(Exception):"},{"line_number":671,"context_line":"    def __init__(self, result\u003d0):"},{"line_number":672,"context_line":"        self.result \u003d result"},{"line_number":673,"context_line":""},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"# ConsistencyGroup"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_df359fa8","line":672,"range":{"start_line":671,"start_character":3,"end_line":672,"end_character":28},"updated":"2016-01-07 12:46:01.000000000","message":"This is not being used. I recommend removing this.","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"cb5a183a57d53412a28200fcf40a33151be376d8","unresolved":false,"context_lines":[{"line_number":667,"context_line":"    message \u003d _(\"HNAS Item Not Found Exception: %(msg)s\")"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"class HNASNothingToCloneException(Exception):"},{"line_number":671,"context_line":"    message \u003d _(\"HNAS Nothing To Clone Exception: %(msg)s\")"},{"line_number":672,"context_line":""},{"line_number":673,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_e3b09b8d","line":670,"range":{"start_line":670,"start_character":34,"end_line":670,"end_character":43},"updated":"2016-01-08 21:15:06.000000000","message":"Please derive from ManilaException .. you can use a different code if you don\u0027t want the 500.","commit_id":"74a7c5376c2bb416e150f94e280e28d22d1b7146"}],"manila/share/drivers/hitachi/hds_hnas.py":[{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"f1eeeb3b5c9a399c364f801c83133d219b22458b","unresolved":false,"context_lines":[{"line_number":54,"context_line":"               default\u003d30,"},{"line_number":55,"context_line":"               help\u003d\"The time (in seconds) to wait for stalled HNAS jobs \""},{"line_number":56,"context_line":"                    \"before aborting.\"),"},{"line_number":57,"context_line":"    # \u003cCREVIEW\u003e alyson: We can let the user configure this opt only with"},{"line_number":58,"context_line":"    # \u0027ssc/histor\u0027 and the driver switch between the paths?"},{"line_number":59,"context_line":"    cfg.StrOpt(\u0027hds_hnas_driver_helper\u0027,"},{"line_number":60,"context_line":"               # \u003cCREVIEW\u003e alyson: Improve the help description. Or change"},{"line_number":61,"context_line":"               # the name to something like hds_hnas_driver_backend"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_a4dbfe4e","line":58,"range":{"start_line":57,"start_character":4,"end_line":58,"end_character":59},"updated":"2016-01-07 12:46:01.000000000","message":"These CREVIEW tags should not be here","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"f1eeeb3b5c9a399c364f801c83133d219b22458b","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    # \u003cCREVIEW\u003e alyson: We can let the user configure this opt only with"},{"line_number":58,"context_line":"    # \u0027ssc/histor\u0027 and the driver switch between the paths?"},{"line_number":59,"context_line":"    cfg.StrOpt(\u0027hds_hnas_driver_helper\u0027,"},{"line_number":60,"context_line":"               # \u003cCREVIEW\u003e alyson: Improve the help description. Or change"},{"line_number":61,"context_line":"               # the name to something like hds_hnas_driver_backend"},{"line_number":62,"context_line":"               help\u003d\"Python class to be used for driver helper.\"),"},{"line_number":63,"context_line":"]"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_64e66618","line":61,"range":{"start_line":60,"start_character":15,"end_line":61,"end_character":67},"updated":"2016-01-07 12:46:01.000000000","message":"same as above","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"876bf74838358baada365775cafd1eae93197e11","unresolved":false,"context_lines":[{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        LOG.debug(\"Share created successfully on path: %(ip)s:%(path)s.\","},{"line_number":286,"context_line":"                  {\u0027ip\u0027: self.hnas_evs_ip, \u0027path\u0027: path})"},{"line_number":287,"context_line":"        return self.hnas_evs_ip + \":\" + path"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"    def ensure_share(self, context, share, share_server\u003dNone):"},{"line_number":290,"context_line":"        \"\"\"Ensure that share is exported."}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_d8560fce","line":287,"range":{"start_line":287,"start_character":20,"end_line":287,"end_character":31},"updated":"2016-01-07 16:33:33.000000000","message":"You build this path here as well as in the debug message.  It seems you could do it only once.","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"876bf74838358baada365775cafd1eae93197e11","unresolved":false,"context_lines":[{"line_number":412,"context_line":"                    \"not configured.\") % {\u0027shr\u0027: share[\u0027host\u0027]}"},{"line_number":413,"context_line":"            raise exception.ShareBackendException(msg\u003dmsg)"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"        output \u003d self._manage_existing(share_id)"},{"line_number":416,"context_line":"        self.private_storage.update("},{"line_number":417,"context_line":"            share[\u0027id\u0027], {\u0027hnas_id\u0027: share_id})"},{"line_number":418,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_582e9fa6","line":415,"range":{"start_line":415,"start_character":8,"end_line":415,"end_character":14},"updated":"2016-01-07 16:33:33.000000000","message":"Lines 415 - 419 don\u0027t appear to be covered by unit tests.","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"f1eeeb3b5c9a399c364f801c83133d219b22458b","unresolved":false,"context_lines":[{"line_number":449,"context_line":"        \"\"\""},{"line_number":450,"context_line":"        path \u003d \u0027/shares/\u0027 + share_id"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"        if not self.hnas.check_fs_mounted():"},{"line_number":453,"context_line":"            LOG.debug(\"Filesystem %(fs)s is unmounted. Mounting...\","},{"line_number":454,"context_line":"                      {\u0027fs\u0027: self.fs_name})"},{"line_number":455,"context_line":"            self.hnas.mount()"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"        self.hnas.vvol_create(share_id)"},{"line_number":458,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_84f4ba87","line":455,"range":{"start_line":452,"start_character":8,"end_line":455,"end_character":29},"updated":"2016-01-07 12:46:01.000000000","message":"This code is repeated across several sections, it can be modularized.","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"f1eeeb3b5c9a399c364f801c83133d219b22458b","unresolved":false,"context_lines":[{"line_number":546,"context_line":"        \"\"\""},{"line_number":547,"context_line":"        path \u003d \u0027/shares/\u0027 + share_id"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        if not self.hnas.check_fs_mounted():"},{"line_number":550,"context_line":"            LOG.debug(\"Filesystem %(fs)s is unmounted. Mounting...\","},{"line_number":551,"context_line":"                      {\u0027fs\u0027: self.fs_name})"},{"line_number":552,"context_line":"            self.hnas.mount()"},{"line_number":553,"context_line":""},{"line_number":554,"context_line":"        self.hnas.check_vvol(share_id)"},{"line_number":555,"context_line":"        self.hnas.check_quota(share_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_a433fe61","line":552,"range":{"start_line":549,"start_character":8,"end_line":552,"end_character":29},"updated":"2016-01-07 12:46:01.000000000","message":"same as above","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"876bf74838358baada365775cafd1eae93197e11","unresolved":false,"context_lines":[{"line_number":573,"context_line":"        if (new_size - old_size) \u003c available_space:"},{"line_number":574,"context_line":"            self.hnas.extend_quota(share_id, new_size)"},{"line_number":575,"context_line":"        else:"},{"line_number":576,"context_line":"            msg \u003d (_(\"Failed to extend share %s.\") % share_id)"},{"line_number":577,"context_line":"            raise exception.HNASBackendException(msg\u003dmsg)"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    def _delete_share(self, share_id):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_18b587cf","line":576,"range":{"start_line":576,"start_character":22,"end_line":576,"end_character":28},"updated":"2016-01-07 16:33:33.000000000","message":"This message implies you tried and failed to extend the share, when you actually didn\u0027t try at all because there isn\u0027t enough space.  I suggest a more accurate message would be more helpful.","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"f1eeeb3b5c9a399c364f801c83133d219b22458b","unresolved":false,"context_lines":[{"line_number":583,"context_line":"        Quota is deleted with virtual-volume."},{"line_number":584,"context_line":"        :param share_id: ID of share that will be deleted."},{"line_number":585,"context_line":"        \"\"\""},{"line_number":586,"context_line":"        if not self.hnas.check_fs_mounted():"},{"line_number":587,"context_line":"            LOG.debug(\"Filesystem %(fs)s is unmounted. Mounting...\","},{"line_number":588,"context_line":"                      {\u0027fs\u0027: self.fs_name})"},{"line_number":589,"context_line":"            self.hnas.mount()"},{"line_number":590,"context_line":""},{"line_number":591,"context_line":"        self.hnas.nfs_export_del(share_id)"},{"line_number":592,"context_line":"        self.hnas.vvol_delete(share_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_643e662b","line":589,"range":{"start_line":586,"start_character":0,"end_line":589,"end_character":29},"updated":"2016-01-07 12:46:01.000000000","message":"same as above","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"876bf74838358baada365775cafd1eae93197e11","unresolved":false,"context_lines":[{"line_number":594,"context_line":"        LOG.debug(\"Export and share successfully deleted: %(shr)s on Manila.\","},{"line_number":595,"context_line":"                  {\u0027shr\u0027: share_id})"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    def _manage_existing(self, share_id):"},{"line_number":598,"context_line":"        \"\"\"Manages a share that exists on backend."},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        :param share_id: ID of share that will be managed."}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_5b1c596a","line":597,"range":{"start_line":597,"start_character":8,"end_line":597,"end_character":24},"updated":"2016-01-07 16:33:33.000000000","message":"This method isn\u0027t covered by unit tests.","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"876bf74838358baada365775cafd1eae93197e11","unresolved":false,"context_lines":[{"line_number":607,"context_line":"        if share_size is None:"},{"line_number":608,"context_line":"            msg \u003d (_(\"The share %s trying to be managed does not have a \""},{"line_number":609,"context_line":"                     \"quota limit, please set it before manage.\") % share_id)"},{"line_number":610,"context_line":"            raise exception.HNASBackendException(msg\u003dmsg)"},{"line_number":611,"context_line":""},{"line_number":612,"context_line":"        path \u003d six.text_type(self.hnas_evs_ip) + \u0027:/shares/\u0027 + share_id"},{"line_number":613,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_98f7378c","line":610,"range":{"start_line":610,"start_character":28,"end_line":610,"end_character":48},"updated":"2016-01-07 16:33:33.000000000","message":"ManageInvalidShare might be more appropriate here.","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"f1eeeb3b5c9a399c364f801c83133d219b22458b","unresolved":false,"context_lines":[{"line_number":667,"context_line":"        # Before copying everything to new vvol, we need to create it,"},{"line_number":668,"context_line":"        # because we only can transform an empty directory into a vvol."},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"        if not self.hnas.check_fs_mounted():"},{"line_number":671,"context_line":"            LOG.debug(\"Filesystem %(fs)s is unmounted. Mounting...\","},{"line_number":672,"context_line":"                      {\u0027fs\u0027: self.fs_name})"},{"line_number":673,"context_line":"            self.hnas.mount()"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"        self.hnas.vvol_create(share[\u0027id\u0027])"},{"line_number":676,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_843b5a38","line":673,"range":{"start_line":670,"start_character":0,"end_line":673,"end_character":29},"updated":"2016-01-07 12:46:01.000000000","message":"same as above","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"552c1aff64e7948f095c34b9d7fe34e499eb8510","unresolved":false,"context_lines":[{"line_number":55,"context_line":"               help\u003d\"The time (in seconds) to wait for stalled HNAS jobs \""},{"line_number":56,"context_line":"                    \"before aborting.\"),"},{"line_number":57,"context_line":"    cfg.StrOpt(\u0027hds_hnas_driver_helper\u0027,"},{"line_number":58,"context_line":"               help\u003d\"Python class to be used for driver helper.\"),"},{"line_number":59,"context_line":"]"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":6,"id":"da6ed579_0c4a3756","line":58,"range":{"start_line":58,"start_character":15,"end_line":58,"end_character":19},"updated":"2016-01-18 19:49:18.000000000","message":"It would be good if this defaults to \u0027ssh\u0027 which is the only option available in tree.","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"3d4f782f85787e72b20e79a572249db121e5e38f","unresolved":false,"context_lines":[{"line_number":55,"context_line":"               help\u003d\"The time (in seconds) to wait for stalled HNAS jobs \""},{"line_number":56,"context_line":"                    \"before aborting.\"),"},{"line_number":57,"context_line":"    cfg.StrOpt(\u0027hds_hnas_driver_helper\u0027,"},{"line_number":58,"context_line":"               help\u003d\"Python class to be used for driver helper.\"),"},{"line_number":59,"context_line":"]"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_0d166e55","line":58,"range":{"start_line":58,"start_character":15,"end_line":58,"end_character":19},"in_reply_to":"da6ed579_0c4a3756","updated":"2016-01-19 19:09:26.000000000","message":"Done","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"552c1aff64e7948f095c34b9d7fe34e499eb8510","unresolved":false,"context_lines":[{"line_number":65,"context_line":"class HDSHNASDriver(driver.ShareDriver):"},{"line_number":66,"context_line":"    \"\"\"Manila HNAS Driver implementation."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    1.0 - Initial Version"},{"line_number":69,"context_line":"    \"\"\""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"da6ed579_490b412c","line":68,"range":{"start_line":68,"start_character":4,"end_line":68,"end_character":7},"updated":"2016-01-18 19:49:18.000000000","message":"Version number should change?","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"3d4f782f85787e72b20e79a572249db121e5e38f","unresolved":false,"context_lines":[{"line_number":65,"context_line":"class HDSHNASDriver(driver.ShareDriver):"},{"line_number":66,"context_line":"    \"\"\"Manila HNAS Driver implementation."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    1.0 - Initial Version"},{"line_number":69,"context_line":"    \"\"\""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_304e2570","line":68,"range":{"start_line":68,"start_character":4,"end_line":68,"end_character":7},"in_reply_to":"da6ed579_490b412c","updated":"2016-01-19 19:09:26.000000000","message":"Done","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"552c1aff64e7948f095c34b9d7fe34e499eb8510","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            \u0027hds_hnas_stalled_job_timeout\u0027)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        if hnas_helper is None:"},{"line_number":98,"context_line":"            msg \u003d _(\"The config parameter hds_hnas_driver_helper is not set.\")"},{"line_number":99,"context_line":"            raise exception.InvalidParameterValue(err\u003dmsg)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        if hnas_evs_id is None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_3d4643c0","line":98,"range":{"start_line":98,"start_character":64,"end_line":98,"end_character":75},"updated":"2016-01-18 19:49:18.000000000","message":"May be set a default value?","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"3d4f782f85787e72b20e79a572249db121e5e38f","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            \u0027hds_hnas_stalled_job_timeout\u0027)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        if hnas_helper is None:"},{"line_number":98,"context_line":"            msg \u003d _(\"The config parameter hds_hnas_driver_helper is not set.\")"},{"line_number":99,"context_line":"            raise exception.InvalidParameterValue(err\u003dmsg)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        if hnas_evs_id is None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_ad0de23f","line":98,"range":{"start_line":98,"start_character":64,"end_line":98,"end_character":75},"in_reply_to":"ba63e191_3d4643c0","updated":"2016-01-19 19:09:26.000000000","message":"Done","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"204d1b579a7ad99d64081754e6b45e038cc02e7b","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        LOG.debug(\"Ensuring share in HNAS: %(shr)s.\","},{"line_number":298,"context_line":"                  {\u0027shr\u0027: six.text_type(share[\u0027id\u0027])})"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"        if share[\u0027share_proto\u0027].lower() !\u003d \u0027nfs\u0027:"},{"line_number":301,"context_line":"            msg \u003d _(\"Only NFS protocol is currently supported.\")"},{"line_number":302,"context_line":"            raise exception.ShareBackendException(msg\u003dmsg)"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"        share_id \u003d self._get_hnas_share_id(share[\u0027id\u0027])"},{"line_number":305,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_b616d653","line":302,"range":{"start_line":300,"start_character":8,"end_line":302,"end_character":58},"updated":"2016-01-20 13:39:06.000000000","message":"Following Erlon\u0027s comment from Shrink patch, this should be removed.","commit_id":"9561a2a64bb58abbc3c26fb890678009f564c42b"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"cd6beff730ab43480b7fb5a8ab71ac13ea862093","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        LOG.debug(\"Ensuring share in HNAS: %(shr)s.\","},{"line_number":298,"context_line":"                  {\u0027shr\u0027: six.text_type(share[\u0027id\u0027])})"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"        if share[\u0027share_proto\u0027].lower() !\u003d \u0027nfs\u0027:"},{"line_number":301,"context_line":"            msg \u003d _(\"Only NFS protocol is currently supported.\")"},{"line_number":302,"context_line":"            raise exception.ShareBackendException(msg\u003dmsg)"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"        share_id \u003d self._get_hnas_share_id(share[\u0027id\u0027])"},{"line_number":305,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_537e87af","line":302,"range":{"start_line":300,"start_character":8,"end_line":302,"end_character":58},"in_reply_to":"9a68dd71_b616d653","updated":"2016-01-20 14:53:16.000000000","message":"Done","commit_id":"9561a2a64bb58abbc3c26fb890678009f564c42b"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"204d1b579a7ad99d64081754e6b45e038cc02e7b","unresolved":false,"context_lines":[{"line_number":325,"context_line":"        LOG.debug(\"Expanding share in HNAS: %(shr_id)s.\","},{"line_number":326,"context_line":"                  {\u0027shr_id\u0027: six.text_type(share[\u0027id\u0027])})"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        if share[\u0027share_proto\u0027].lower() !\u003d \u0027nfs\u0027:"},{"line_number":329,"context_line":"            msg \u003d _(\"Only NFS protocol is currently supported.\")"},{"line_number":330,"context_line":"            raise exception.ShareBackendException(msg\u003dmsg)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        self._extend_share(share_id, share[\u0027size\u0027], new_size)"},{"line_number":333,"context_line":"        LOG.info(_LI(\"Share %(shr_id)s successfully extended to \""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_a108d229","line":330,"range":{"start_line":328,"start_character":8,"end_line":330,"end_character":58},"updated":"2016-01-20 13:39:06.000000000","message":"Following Erlon\u0027s comment from Shrink patch, this should be removed.","commit_id":"9561a2a64bb58abbc3c26fb890678009f564c42b"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"cd6beff730ab43480b7fb5a8ab71ac13ea862093","unresolved":false,"context_lines":[{"line_number":325,"context_line":"        LOG.debug(\"Expanding share in HNAS: %(shr_id)s.\","},{"line_number":326,"context_line":"                  {\u0027shr_id\u0027: six.text_type(share[\u0027id\u0027])})"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        if share[\u0027share_proto\u0027].lower() !\u003d \u0027nfs\u0027:"},{"line_number":329,"context_line":"            msg \u003d _(\"Only NFS protocol is currently supported.\")"},{"line_number":330,"context_line":"            raise exception.ShareBackendException(msg\u003dmsg)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        self._extend_share(share_id, share[\u0027size\u0027], new_size)"},{"line_number":333,"context_line":"        LOG.info(_LI(\"Share %(shr_id)s successfully extended to \""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_f349bb8f","line":330,"range":{"start_line":328,"start_character":8,"end_line":330,"end_character":58},"in_reply_to":"9a68dd71_a108d229","updated":"2016-01-20 14:53:16.000000000","message":"Done","commit_id":"9561a2a64bb58abbc3c26fb890678009f564c42b"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"8c9ea89836722230bf85ca9819cb11bd05425439","unresolved":false,"context_lines":[{"line_number":462,"context_line":"            self.hnas.vvol_delete(share_id)"},{"line_number":463,"context_line":"            msg \u003d six.text_type(e)"},{"line_number":464,"context_line":"            LOG.exception(msg)"},{"line_number":465,"context_line":"            raise e"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"    def _check_fs_mounted(self):"},{"line_number":468,"context_line":"        if not self.hnas.check_fs_mounted():"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a68dd71_c9864813","line":465,"range":{"start_line":465,"start_character":12,"end_line":465,"end_character":17},"updated":"2016-01-20 15:01:08.000000000","message":"I think you\u0027ll want to use with excutils.save_and_reraise_exception(): in this block.","commit_id":"35d1043c27e1301fc4bfa4745903b85edb225efe"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"d426922afc575344a712835d75ccdf6ed2f00f2e","unresolved":false,"context_lines":[{"line_number":355,"context_line":"            \u0027total_capacity_gb\u0027: total_space,"},{"line_number":356,"context_line":"            \u0027free_capacity_gb\u0027: free_space,"},{"line_number":357,"context_line":"            \u0027reserved_percentage\u0027: reserved,"},{"line_number":358,"context_line":"            \u0027QoS_support\u0027: False,"},{"line_number":359,"context_line":"        }"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        LOG.info(_LI(\"HNAS Capabilities: %(data)s.\"),"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_cea4010a","line":358,"range":{"start_line":358,"start_character":12,"end_line":358,"end_character":33},"updated":"2016-01-20 17:50:17.000000000","message":"This should be renamed to \u0027qos\u0027","commit_id":"d8c8686b533b2196201a40f0096d690424b03015"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ab63561fd4393e747bbe191f18b6e16c4dde663b","unresolved":false,"context_lines":[{"line_number":355,"context_line":"            \u0027total_capacity_gb\u0027: total_space,"},{"line_number":356,"context_line":"            \u0027free_capacity_gb\u0027: free_space,"},{"line_number":357,"context_line":"            \u0027reserved_percentage\u0027: reserved,"},{"line_number":358,"context_line":"            \u0027QoS_support\u0027: False,"},{"line_number":359,"context_line":"        }"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        LOG.info(_LI(\"HNAS Capabilities: %(data)s.\"),"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_6e52b5df","line":358,"range":{"start_line":358,"start_character":12,"end_line":358,"end_character":33},"in_reply_to":"9a68dd71_cea4010a","updated":"2016-01-20 17:52:32.000000000","message":"+1  Good catch, Rodrigo.","commit_id":"d8c8686b533b2196201a40f0096d690424b03015"}],"manila/share/drivers/hitachi/ssh.py":[{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"f1eeeb3b5c9a399c364f801c83133d219b22458b","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        except processutils.ProcessExecutionError as e:"},{"line_number":113,"context_line":"            if (\u0027Cannot find any clonable files in the source directory\u0027 in"},{"line_number":114,"context_line":"                    e.stderr):"},{"line_number":115,"context_line":"                raise exception.HNASNothingToCloneException(\u0027\u0027)"},{"line_number":116,"context_line":"            else:"},{"line_number":117,"context_line":"                msg \u003d six.text_type(e)"},{"line_number":118,"context_line":"                LOG.exception(msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_1fe6d744","line":115,"range":{"start_line":115,"start_character":15,"end_line":115,"end_character":63},"updated":"2016-01-07 12:46:01.000000000","message":"You are not saving the result here. I suggest removing the field from the exception type.","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"876bf74838358baada365775cafd1eae93197e11","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        except processutils.ProcessExecutionError as e:"},{"line_number":113,"context_line":"            if (\u0027Cannot find any clonable files in the source directory\u0027 in"},{"line_number":114,"context_line":"                    e.stderr):"},{"line_number":115,"context_line":"                raise exception.HNASNothingToCloneException(\u0027\u0027)"},{"line_number":116,"context_line":"            else:"},{"line_number":117,"context_line":"                msg \u003d six.text_type(e)"},{"line_number":118,"context_line":"                LOG.exception(msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_f80f5386","line":115,"range":{"start_line":115,"start_character":15,"end_line":115,"end_character":63},"in_reply_to":"fa69d971_1fe6d744","updated":"2016-01-07 16:33:33.000000000","message":"+1","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"af11036292f993a3729869180520a36fc4ebdecc","unresolved":false,"context_lines":[{"line_number":245,"context_line":"                   \u0027yes\u0027, self.fs_name, vvol_name]"},{"line_number":246,"context_line":"        self._execute(command)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def extend_quota(self, vvol_name, new_size):"},{"line_number":249,"context_line":"        str_quota \u003d six.text_type(new_size) + \u0027G\u0027"},{"line_number":250,"context_line":"        command \u003d [\u0027quota\u0027, \u0027mod\u0027, \u0027--usage-limit\u0027, str_quota,"},{"line_number":251,"context_line":"                   self.fs_name, vvol_name]"},{"line_number":252,"context_line":"        self._execute(command)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def check_vvol(self, vvol_name):"},{"line_number":255,"context_line":"        command \u003d [\u0027virtual-volume\u0027, \u0027list\u0027, \u0027--verbose\u0027, self.fs_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_c50bf0d3","line":252,"range":{"start_line":248,"start_character":0,"end_line":252,"end_character":30},"updated":"2016-01-11 12:11:43.000000000","message":"After reading your shrink patch, I believe the change of \"modify_share_quota\" makes more sense here. This will be a common public method for extend and shrink, called from the upper layer.","commit_id":"af23bae89f671765d845ab10e8b8f33d5259b651"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"51f4040944258563d38e0e91eb5942cc608561b1","unresolved":false,"context_lines":[{"line_number":245,"context_line":"                   \u0027yes\u0027, self.fs_name, vvol_name]"},{"line_number":246,"context_line":"        self._execute(command)"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def extend_quota(self, vvol_name, new_size):"},{"line_number":249,"context_line":"        str_quota \u003d six.text_type(new_size) + \u0027G\u0027"},{"line_number":250,"context_line":"        command \u003d [\u0027quota\u0027, \u0027mod\u0027, \u0027--usage-limit\u0027, str_quota,"},{"line_number":251,"context_line":"                   self.fs_name, vvol_name]"},{"line_number":252,"context_line":"        self._execute(command)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def check_vvol(self, vvol_name):"},{"line_number":255,"context_line":"        command \u003d [\u0027virtual-volume\u0027, \u0027list\u0027, \u0027--verbose\u0027, self.fs_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_19a7250c","line":252,"range":{"start_line":248,"start_character":0,"end_line":252,"end_character":30},"in_reply_to":"fa69d971_c50bf0d3","updated":"2016-01-11 16:51:22.000000000","message":"Done","commit_id":"af23bae89f671765d845ab10e8b8f33d5259b651"},{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"af11036292f993a3729869180520a36fc4ebdecc","unresolved":false,"context_lines":[{"line_number":279,"context_line":"            msg \u003d _(\"Export %s does not exist.\") % export[0].export_name"},{"line_number":280,"context_line":"            raise exception.HNASItemNotFoundException(msg\u003dmsg)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def get_share_quota(self, share_id):"},{"line_number":283,"context_line":"        command \u003d [\u0027quota\u0027, \u0027list\u0027, self.fs_name, six.text_type(share_id)]"},{"line_number":284,"context_line":"        output, err \u003d self._execute(command)"},{"line_number":285,"context_line":"        items \u003d output.split(\u0027\\n\u0027)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        for i in range(0, len(items) - 1):"},{"line_number":288,"context_line":"            if (\u0027Unset\u0027 not in items[i] and"},{"line_number":289,"context_line":"                    \u0027No quotas matching\u0027 not in items[i]):"},{"line_number":290,"context_line":"                if \u0027Limit\u0027 in items[i] and \u0027Hard\u0027 in items[i]:"},{"line_number":291,"context_line":"                    quota \u003d float(items[i].split(\u0027 \u0027)[12])"},{"line_number":292,"context_line":"                    size_unit \u003d items[i].split(\u0027 \u0027)[13]"},{"line_number":293,"context_line":"                    if size_unit in (\u0027TB\u0027, \u0027GB\u0027):"},{"line_number":294,"context_line":"                        # If the quota is 1 or more TB, converts to GB"},{"line_number":295,"context_line":"                        if size_unit \u003d\u003d \u0027TB\u0027:"},{"line_number":296,"context_line":"                            return quota * units.Ki"},{"line_number":297,"context_line":"                        return quota"},{"line_number":298,"context_line":"                    else:"},{"line_number":299,"context_line":"                        msg \u003d (_(\"Share %s does not support quota values \""},{"line_number":300,"context_line":"                                 \"below 1G.\") % share_id)"},{"line_number":301,"context_line":"                        raise exception.HNASBackendException(msg\u003dmsg)"},{"line_number":302,"context_line":"            else:"},{"line_number":303,"context_line":"                # Returns None if the quota is unset"},{"line_number":304,"context_line":"                return None"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    def _nfs_export_list(self, share_id):"},{"line_number":307,"context_line":"        if share_id is not None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_055fc8e5","line":304,"range":{"start_line":282,"start_character":4,"end_line":304,"end_character":27},"updated":"2016-01-11 12:11:43.000000000","message":"Since this is a refactor, this is a good opportunity to create a proper parser for this function.","commit_id":"af23bae89f671765d845ab10e8b8f33d5259b651"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"51f4040944258563d38e0e91eb5942cc608561b1","unresolved":false,"context_lines":[{"line_number":279,"context_line":"            msg \u003d _(\"Export %s does not exist.\") % export[0].export_name"},{"line_number":280,"context_line":"            raise exception.HNASItemNotFoundException(msg\u003dmsg)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def get_share_quota(self, share_id):"},{"line_number":283,"context_line":"        command \u003d [\u0027quota\u0027, \u0027list\u0027, self.fs_name, six.text_type(share_id)]"},{"line_number":284,"context_line":"        output, err \u003d self._execute(command)"},{"line_number":285,"context_line":"        items \u003d output.split(\u0027\\n\u0027)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        for i in range(0, len(items) - 1):"},{"line_number":288,"context_line":"            if (\u0027Unset\u0027 not in items[i] and"},{"line_number":289,"context_line":"                    \u0027No quotas matching\u0027 not in items[i]):"},{"line_number":290,"context_line":"                if \u0027Limit\u0027 in items[i] and \u0027Hard\u0027 in items[i]:"},{"line_number":291,"context_line":"                    quota \u003d float(items[i].split(\u0027 \u0027)[12])"},{"line_number":292,"context_line":"                    size_unit \u003d items[i].split(\u0027 \u0027)[13]"},{"line_number":293,"context_line":"                    if size_unit in (\u0027TB\u0027, \u0027GB\u0027):"},{"line_number":294,"context_line":"                        # If the quota is 1 or more TB, converts to GB"},{"line_number":295,"context_line":"                        if size_unit \u003d\u003d \u0027TB\u0027:"},{"line_number":296,"context_line":"                            return quota * units.Ki"},{"line_number":297,"context_line":"                        return quota"},{"line_number":298,"context_line":"                    else:"},{"line_number":299,"context_line":"                        msg \u003d (_(\"Share %s does not support quota values \""},{"line_number":300,"context_line":"                                 \"below 1G.\") % share_id)"},{"line_number":301,"context_line":"                        raise exception.HNASBackendException(msg\u003dmsg)"},{"line_number":302,"context_line":"            else:"},{"line_number":303,"context_line":"                # Returns None if the quota is unset"},{"line_number":304,"context_line":"                return None"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    def _nfs_export_list(self, share_id):"},{"line_number":307,"context_line":"        if share_id is not None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_d9ad0dea","line":304,"range":{"start_line":282,"start_character":4,"end_line":304,"end_character":27},"in_reply_to":"fa69d971_055fc8e5","updated":"2016-01-11 16:51:22.000000000","message":"Done","commit_id":"af23bae89f671765d845ab10e8b8f33d5259b651"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"552c1aff64e7948f095c34b9d7fe34e499eb8510","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.evs_ip \u003d evs_ip"},{"line_number":45,"context_line":"        self.sshpool \u003d None"},{"line_number":46,"context_line":"        self.job_timeout \u003d job_timeout"},{"line_number":47,"context_line":"        LOG.debug(\"HDS HNAS Driver using SSC backend.\")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def get_stats(self):"},{"line_number":50,"context_line":"        \"\"\"Get the stats from file-system."}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_ddbb6774","line":47,"range":{"start_line":47,"start_character":19,"end_line":47,"end_character":22},"updated":"2016-01-18 19:49:18.000000000","message":"Hitachi","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"3d4f782f85787e72b20e79a572249db121e5e38f","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.evs_ip \u003d evs_ip"},{"line_number":45,"context_line":"        self.sshpool \u003d None"},{"line_number":46,"context_line":"        self.job_timeout \u003d job_timeout"},{"line_number":47,"context_line":"        LOG.debug(\"HDS HNAS Driver using SSC backend.\")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def get_stats(self):"},{"line_number":50,"context_line":"        \"\"\"Get the stats from file-system."}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_7a823e96","line":47,"range":{"start_line":47,"start_character":19,"end_line":47,"end_character":22},"in_reply_to":"ba63e191_ddbb6774","updated":"2016-01-19 19:09:26.000000000","message":"Done","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"13d90f778d4eef7b6428b504be4f860d1eece40b","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            job_rechecks \u003d 0"},{"line_number":129,"context_line":"            starttime \u003d time.time()"},{"line_number":130,"context_line":"            deadline \u003d starttime + self.job_timeout"},{"line_number":131,"context_line":"            while not job_status or \\"},{"line_number":132,"context_line":"                    job_status.job_state !\u003d \"Job was completed\":"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"                command \u003d [\u0027tree-clone-job-status\u0027, job_id]"}],"source_content_type":"text/x-python","patch_set":6,"id":"da6ed579_d965c41d","line":131,"range":{"start_line":131,"start_character":36,"end_line":131,"end_character":37},"updated":"2016-01-15 19:31:37.000000000","message":"Please use parentheses instead of backslash for line continuation.","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"3d4f782f85787e72b20e79a572249db121e5e38f","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            job_rechecks \u003d 0"},{"line_number":129,"context_line":"            starttime \u003d time.time()"},{"line_number":130,"context_line":"            deadline \u003d starttime + self.job_timeout"},{"line_number":131,"context_line":"            while not job_status or \\"},{"line_number":132,"context_line":"                    job_status.job_state !\u003d \"Job was completed\":"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"                command \u003d [\u0027tree-clone-job-status\u0027, job_id]"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_1a71c2e0","line":131,"range":{"start_line":131,"start_character":36,"end_line":131,"end_character":37},"in_reply_to":"da6ed579_d965c41d","updated":"2016-01-19 19:09:26.000000000","message":"Done","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"552c1aff64e7948f095c34b9d7fe34e499eb8510","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                     \"below 1G.\") % share_id)"},{"line_number":298,"context_line":"            raise exception.HNASBackendException(msg\u003dmsg)"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def _nfs_export_list(self, share_id):"},{"line_number":301,"context_line":"        if share_id is not None:"},{"line_number":302,"context_line":"            share_id \u003d \u0027/shares/\u0027 + share_id"},{"line_number":303,"context_line":"        command \u003d [\u0027nfs-export\u0027, \u0027list \u0027, six.text_type(share_id)]"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_ef78f2fa","line":300,"range":{"start_line":300,"start_character":8,"end_line":300,"end_character":24},"updated":"2016-01-18 19:49:18.000000000","message":"This function is named nfs_export_list, but it does not get the export list, only the export info of the export with share_id","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"3d4f782f85787e72b20e79a572249db121e5e38f","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                     \"below 1G.\") % share_id)"},{"line_number":298,"context_line":"            raise exception.HNASBackendException(msg\u003dmsg)"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def _nfs_export_list(self, share_id):"},{"line_number":301,"context_line":"        if share_id is not None:"},{"line_number":302,"context_line":"            share_id \u003d \u0027/shares/\u0027 + share_id"},{"line_number":303,"context_line":"        command \u003d [\u0027nfs-export\u0027, \u0027list \u0027, six.text_type(share_id)]"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_0d72eead","line":300,"range":{"start_line":300,"start_character":8,"end_line":300,"end_character":24},"in_reply_to":"ba63e191_ef78f2fa","updated":"2016-01-19 19:09:26.000000000","message":"Done","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"552c1aff64e7948f095c34b9d7fe34e499eb8510","unresolved":false,"context_lines":[{"line_number":298,"context_line":"            raise exception.HNASBackendException(msg\u003dmsg)"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def _nfs_export_list(self, share_id):"},{"line_number":301,"context_line":"        if share_id is not None:"},{"line_number":302,"context_line":"            share_id \u003d \u0027/shares/\u0027 + share_id"},{"line_number":303,"context_line":"        command \u003d [\u0027nfs-export\u0027, \u0027list \u0027, six.text_type(share_id)]"},{"line_number":304,"context_line":"        output, err \u003d self._execute(command)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_0f3c6692","line":301,"range":{"start_line":301,"start_character":7,"end_line":301,"end_character":31},"updated":"2016-01-18 19:49:18.000000000","message":"This check is not needed. You are always getting this from the upper layer that that get it from share[\u0027id\u0027]. Furthermore, you are not doing anything if it is None.","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"3d4f782f85787e72b20e79a572249db121e5e38f","unresolved":false,"context_lines":[{"line_number":298,"context_line":"            raise exception.HNASBackendException(msg\u003dmsg)"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def _nfs_export_list(self, share_id):"},{"line_number":301,"context_line":"        if share_id is not None:"},{"line_number":302,"context_line":"            share_id \u003d \u0027/shares/\u0027 + share_id"},{"line_number":303,"context_line":"        command \u003d [\u0027nfs-export\u0027, \u0027list \u0027, six.text_type(share_id)]"},{"line_number":304,"context_line":"        output, err \u003d self._execute(command)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_ad6962c0","line":301,"range":{"start_line":301,"start_character":7,"end_line":301,"end_character":31},"in_reply_to":"ba63e191_0f3c6692","updated":"2016-01-19 19:09:26.000000000","message":"Done","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"13d90f778d4eef7b6428b504be4f860d1eece40b","unresolved":false,"context_lines":[{"line_number":534,"context_line":"class Quota(object):"},{"line_number":535,"context_line":"    def __init__(self, data):"},{"line_number":536,"context_line":"        if data:"},{"line_number":537,"context_line":"            if \u0027No quotas matching\u0027 in data:"},{"line_number":538,"context_line":"                self.type \u003d None"},{"line_number":539,"context_line":"                self.target \u003d None"},{"line_number":540,"context_line":"                self.usage \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"da6ed579_792378bd","line":537,"range":{"start_line":537,"start_character":19,"end_line":537,"end_character":25},"updated":"2016-01-15 19:31:37.000000000","message":"This block wasn\u0027t covered by a unit test.  Should it be?","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"3d4f782f85787e72b20e79a572249db121e5e38f","unresolved":false,"context_lines":[{"line_number":534,"context_line":"class Quota(object):"},{"line_number":535,"context_line":"    def __init__(self, data):"},{"line_number":536,"context_line":"        if data:"},{"line_number":537,"context_line":"            if \u0027No quotas matching\u0027 in data:"},{"line_number":538,"context_line":"                self.type \u003d None"},{"line_number":539,"context_line":"                self.target \u003d None"},{"line_number":540,"context_line":"                self.usage \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_ad4c0243","line":537,"range":{"start_line":537,"start_character":19,"end_line":537,"end_character":25},"in_reply_to":"da6ed579_792378bd","updated":"2016-01-19 19:09:26.000000000","message":"Done","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":2417,"name":"Ben Swartzlander","email":"ben@swartzlander.org","username":"bswartz"},"change_message_id":"89f35b9979c9bc38e46f607f497f162e68afe6b7","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.evs_ip \u003d evs_ip"},{"line_number":45,"context_line":"        self.sshpool \u003d None"},{"line_number":46,"context_line":"        self.job_timeout \u003d job_timeout"},{"line_number":47,"context_line":"        LOG.debug(\"Hitachi HNAS Driver using SSC backend.\")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def get_stats(self):"},{"line_number":50,"context_line":"        \"\"\"Get the stats from file-system."}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_6ea042a0","line":47,"updated":"2016-01-21 14:25:36.000000000","message":"s/SSC/SSH/","commit_id":"46b54a289774754d8535e19ddd6e03b70f0e56f8"}],"manila/tests/share/drivers/hitachi/test_hds_hnas.py":[{"author":{"_account_id":14567,"name":"Rodrigo Barbieri","email":"rodrigo.barbieri2010@gmail.com","username":"ganso"},"change_message_id":"f1eeeb3b5c9a399c364f801c83133d219b22458b","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        }"},{"line_number":298,"context_line":"        self._driver.deny_access(\u0027context\u0027, share, old_access)"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def test_create_share(self):"},{"line_number":301,"context_line":"        export \u003d CONF.hds_hnas_evs_ip + \u0027:/shares/\u0027 + share[\u0027id\u0027]"},{"line_number":302,"context_line":"        out \u003d self._driver.create_share(\u0027context\u0027, share)"},{"line_number":303,"context_line":"        self.assertEqual(export, out)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def test_create_share_in_an_umount_fs(self):"},{"line_number":306,"context_line":"        export \u003d CONF.hds_hnas_evs_ip + \u0027:/shares/\u0027 + share[\u0027id\u0027]"},{"line_number":307,"context_line":"        # When check_fs_mounted returns False, the fs is unmounted, then the"},{"line_number":308,"context_line":"        # create_share should mount the file system."},{"line_number":309,"context_line":"        self.mock_object(UsedBackend, \u0027check_fs_mounted\u0027,"},{"line_number":310,"context_line":"                         mock.Mock(return_value\u003dFalse))"},{"line_number":311,"context_line":"        out \u003d self._driver.create_share(\u0027context\u0027, share)"},{"line_number":312,"context_line":"        self.assertEqual(export, out)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def test_delete_share(self):"},{"line_number":315,"context_line":"        self._driver.delete_share(\u0027context\u0027, share)"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    def test_delete_share_from_unmounted_fs(self):"},{"line_number":318,"context_line":"        self.mock_object(UsedBackend, \u0027check_fs_mounted\u0027,"},{"line_number":319,"context_line":"                         mock.Mock(return_value\u003dFalse))"},{"line_number":320,"context_line":"        self._driver.delete_share(\u0027context\u0027, share)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def test_create_snapshot(self):"},{"line_number":323,"context_line":"        self._driver.create_snapshot(\u0027context\u0027, snapshot)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def test_create_an_empty_snapshot(self):"},{"line_number":326,"context_line":"        self.mock_object(UsedBackend, \u0027tree_clone\u0027, mock.Mock("},{"line_number":327,"context_line":"            side_effect\u003dexception.HNASNothingToCloneException(\u0027Fake\u0027)))"},{"line_number":328,"context_line":"        self._driver.create_snapshot(\u0027context\u0027, snapshot)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    def test_delete_snapshot(self):"},{"line_number":331,"context_line":"        self._driver.delete_snapshot(\u0027context\u0027, snapshot)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"    def test_create_share_from_snapshot(self):"},{"line_number":334,"context_line":"        export \u003d CONF.hds_hnas_evs_ip + \u0027:/shares/\u0027 + share[\u0027id\u0027]"},{"line_number":335,"context_line":"        out \u003d self._driver.create_share_from_snapshot(\u0027context\u0027, share,"},{"line_number":336,"context_line":"                                                      snapshot)"},{"line_number":337,"context_line":"        self.assertEqual(export, out)"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def test_create_share_from_snapshot_in_an_umounted_fs(self):"},{"line_number":340,"context_line":"        export \u003d CONF.hds_hnas_evs_ip + \u0027:/shares/\u0027 + share[\u0027id\u0027]"},{"line_number":341,"context_line":"        # When check_fs_mounted returns False, the fs is unmounted, then the"},{"line_number":342,"context_line":"        # create_share_from_snap should mount the file system."},{"line_number":343,"context_line":"        self.mock_object(UsedBackend, \u0027check_fs_mounted\u0027,"},{"line_number":344,"context_line":"                         mock.Mock(return_value\u003dFalse))"},{"line_number":345,"context_line":"        out \u003d self._driver.create_share_from_snapshot(\u0027context\u0027, share,"},{"line_number":346,"context_line":"                                                      snapshot)"},{"line_number":347,"context_line":"        self.assertEqual(export, out)"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    def test_create_empty_share_from_empty_snap(self):"},{"line_number":350,"context_line":"        self.mock_object(UsedBackend, \u0027tree_clone\u0027, mock.Mock("},{"line_number":351,"context_line":"            side_effect\u003dexception.HNASNothingToCloneException(\u0027Fake\u0027)))"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        export \u003d CONF.hds_hnas_evs_ip + \u0027:/shares/\u0027 + share[\u0027id\u0027]"},{"line_number":354,"context_line":"        out \u003d self._driver.create_share_from_snapshot(\u0027context\u0027, share,"},{"line_number":355,"context_line":"                                                      snapshot)"},{"line_number":356,"context_line":"        self.assertEqual(export, out)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    def test_ensure_share(self):"},{"line_number":359,"context_line":"        export_list \u003d [CONF.hds_hnas_evs_ip + \u0027:/shares/\u0027 + share[\u0027id\u0027]]"},{"line_number":360,"context_line":"        out \u003d self._driver.ensure_share(\u0027context\u0027, share)"},{"line_number":361,"context_line":"        self.assertEqual(export_list, out)"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def test_ensure_share_from_unmounted_fs(self):"},{"line_number":364,"context_line":"        export_list \u003d [CONF.hds_hnas_evs_ip + \u0027:/shares/\u0027 + share[\u0027id\u0027]]"},{"line_number":365,"context_line":"        # When check_fs_mounted returns False, the fs is unmounted, then the"},{"line_number":366,"context_line":"        # ensure_share should mount the file system."},{"line_number":367,"context_line":"        self.mock_object(UsedBackend, \u0027check_fs_mounted\u0027,"},{"line_number":368,"context_line":"                         mock.Mock(return_value\u003dFalse))"},{"line_number":369,"context_line":"        out \u003d self._driver.ensure_share(\u0027context\u0027, share)"},{"line_number":370,"context_line":"        self.assertEqual(export_list, out)"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def test_extend_share(self):"},{"line_number":373,"context_line":"        self._driver.extend_share(share, 80)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"    def test_unmanage(self):"},{"line_number":376,"context_line":"        self._driver.unmanage(share)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_24570e28","line":373,"range":{"start_line":300,"start_character":4,"end_line":373,"end_character":44},"updated":"2016-01-07 12:46:01.000000000","message":"I believe it is a good idea to use \"assert called once with\" for all hnas calls. Please also check for the test cases below if applicable, I know some errors are thrown before calling hnas, so the ones that return on hnas error can be verified.","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"876bf74838358baada365775cafd1eae93197e11","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        }"},{"line_number":298,"context_line":"        self._driver.deny_access(\u0027context\u0027, share, old_access)"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def test_create_share(self):"},{"line_number":301,"context_line":"        export \u003d CONF.hds_hnas_evs_ip + \u0027:/shares/\u0027 + share[\u0027id\u0027]"},{"line_number":302,"context_line":"        out \u003d self._driver.create_share(\u0027context\u0027, share)"},{"line_number":303,"context_line":"        self.assertEqual(export, out)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def test_create_share_in_an_umount_fs(self):"},{"line_number":306,"context_line":"        export \u003d CONF.hds_hnas_evs_ip + \u0027:/shares/\u0027 + share[\u0027id\u0027]"},{"line_number":307,"context_line":"        # When check_fs_mounted returns False, the fs is unmounted, then the"},{"line_number":308,"context_line":"        # create_share should mount the file system."},{"line_number":309,"context_line":"        self.mock_object(UsedBackend, \u0027check_fs_mounted\u0027,"},{"line_number":310,"context_line":"                         mock.Mock(return_value\u003dFalse))"},{"line_number":311,"context_line":"        out \u003d self._driver.create_share(\u0027context\u0027, share)"},{"line_number":312,"context_line":"        self.assertEqual(export, out)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def test_delete_share(self):"},{"line_number":315,"context_line":"        self._driver.delete_share(\u0027context\u0027, share)"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    def test_delete_share_from_unmounted_fs(self):"},{"line_number":318,"context_line":"        self.mock_object(UsedBackend, \u0027check_fs_mounted\u0027,"},{"line_number":319,"context_line":"                         mock.Mock(return_value\u003dFalse))"},{"line_number":320,"context_line":"        self._driver.delete_share(\u0027context\u0027, share)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def test_create_snapshot(self):"},{"line_number":323,"context_line":"        self._driver.create_snapshot(\u0027context\u0027, snapshot)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def test_create_an_empty_snapshot(self):"},{"line_number":326,"context_line":"        self.mock_object(UsedBackend, \u0027tree_clone\u0027, mock.Mock("},{"line_number":327,"context_line":"            side_effect\u003dexception.HNASNothingToCloneException(\u0027Fake\u0027)))"},{"line_number":328,"context_line":"        self._driver.create_snapshot(\u0027context\u0027, snapshot)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    def test_delete_snapshot(self):"},{"line_number":331,"context_line":"        self._driver.delete_snapshot(\u0027context\u0027, snapshot)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"    def test_create_share_from_snapshot(self):"},{"line_number":334,"context_line":"        export \u003d CONF.hds_hnas_evs_ip + \u0027:/shares/\u0027 + share[\u0027id\u0027]"},{"line_number":335,"context_line":"        out \u003d self._driver.create_share_from_snapshot(\u0027context\u0027, share,"},{"line_number":336,"context_line":"                                                      snapshot)"},{"line_number":337,"context_line":"        self.assertEqual(export, out)"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def test_create_share_from_snapshot_in_an_umounted_fs(self):"},{"line_number":340,"context_line":"        export \u003d CONF.hds_hnas_evs_ip + \u0027:/shares/\u0027 + share[\u0027id\u0027]"},{"line_number":341,"context_line":"        # When check_fs_mounted returns False, the fs is unmounted, then the"},{"line_number":342,"context_line":"        # create_share_from_snap should mount the file system."},{"line_number":343,"context_line":"        self.mock_object(UsedBackend, \u0027check_fs_mounted\u0027,"},{"line_number":344,"context_line":"                         mock.Mock(return_value\u003dFalse))"},{"line_number":345,"context_line":"        out \u003d self._driver.create_share_from_snapshot(\u0027context\u0027, share,"},{"line_number":346,"context_line":"                                                      snapshot)"},{"line_number":347,"context_line":"        self.assertEqual(export, out)"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    def test_create_empty_share_from_empty_snap(self):"},{"line_number":350,"context_line":"        self.mock_object(UsedBackend, \u0027tree_clone\u0027, mock.Mock("},{"line_number":351,"context_line":"            side_effect\u003dexception.HNASNothingToCloneException(\u0027Fake\u0027)))"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        export \u003d CONF.hds_hnas_evs_ip + \u0027:/shares/\u0027 + share[\u0027id\u0027]"},{"line_number":354,"context_line":"        out \u003d self._driver.create_share_from_snapshot(\u0027context\u0027, share,"},{"line_number":355,"context_line":"                                                      snapshot)"},{"line_number":356,"context_line":"        self.assertEqual(export, out)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    def test_ensure_share(self):"},{"line_number":359,"context_line":"        export_list \u003d [CONF.hds_hnas_evs_ip + \u0027:/shares/\u0027 + share[\u0027id\u0027]]"},{"line_number":360,"context_line":"        out \u003d self._driver.ensure_share(\u0027context\u0027, share)"},{"line_number":361,"context_line":"        self.assertEqual(export_list, out)"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def test_ensure_share_from_unmounted_fs(self):"},{"line_number":364,"context_line":"        export_list \u003d [CONF.hds_hnas_evs_ip + \u0027:/shares/\u0027 + share[\u0027id\u0027]]"},{"line_number":365,"context_line":"        # When check_fs_mounted returns False, the fs is unmounted, then the"},{"line_number":366,"context_line":"        # ensure_share should mount the file system."},{"line_number":367,"context_line":"        self.mock_object(UsedBackend, \u0027check_fs_mounted\u0027,"},{"line_number":368,"context_line":"                         mock.Mock(return_value\u003dFalse))"},{"line_number":369,"context_line":"        out \u003d self._driver.ensure_share(\u0027context\u0027, share)"},{"line_number":370,"context_line":"        self.assertEqual(export_list, out)"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def test_extend_share(self):"},{"line_number":373,"context_line":"        self._driver.extend_share(share, 80)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"    def test_unmanage(self):"},{"line_number":376,"context_line":"        self._driver.unmanage(share)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_38f2cb70","line":373,"range":{"start_line":300,"start_character":4,"end_line":373,"end_character":44},"in_reply_to":"fa69d971_24570e28","updated":"2016-01-07 16:33:33.000000000","message":"+1\n\nAlso, for enhanced readability, please use whitespace to separate unit tests into three sections (mocks, method call, asserts).","commit_id":"1f63988b18433871c4e29d345e233778f4971ee2"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"13d90f778d4eef7b6428b504be4f860d1eece40b","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        self.mock_object(ssh.HNASSSHBackend, \"quota_add\", mock.Mock())"},{"line_number":259,"context_line":"        self.mock_object(ssh.HNASSSHBackend, \"nfs_export_add\", mock.Mock())"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        self.assertEqual(self._driver.hnas_evs_ip + \":/shares/\" + share[\u0027id\u0027],"},{"line_number":262,"context_line":"                         self._driver.create_share(\u0027context\u0027, share))"},{"line_number":263,"context_line":"        self.assertTrue(self.mock_log.debug.called)"},{"line_number":264,"context_line":"        ssh.HNASSSHBackend.vvol_create.assert_called_once_with(share[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"da6ed579_09e6a944","line":261,"range":{"start_line":261,"start_character":13,"end_line":261,"end_character":24},"updated":"2016-01-15 19:31:37.000000000","message":"Up to this point, you\u0027ve done a good job of separating tests into mocks, call, asserts.  But this test embeds the method call in an assert, which IMO impairs readability.  I\u0027d rather see something like:\n\n    (mocks)\n    \n    result \u003d self._driver.create_share(\u0027context\u0027, share)\n    \n    self.assertEqual(self._driver.hnas_evs_ip + \":/shares/\" + share[\u0027id\u0027], result)\n    (other asserts)\n\nSame elsewhere.","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"3d4f782f85787e72b20e79a572249db121e5e38f","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        self.mock_object(ssh.HNASSSHBackend, \"quota_add\", mock.Mock())"},{"line_number":259,"context_line":"        self.mock_object(ssh.HNASSSHBackend, \"nfs_export_add\", mock.Mock())"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        self.assertEqual(self._driver.hnas_evs_ip + \":/shares/\" + share[\u0027id\u0027],"},{"line_number":262,"context_line":"                         self._driver.create_share(\u0027context\u0027, share))"},{"line_number":263,"context_line":"        self.assertTrue(self.mock_log.debug.called)"},{"line_number":264,"context_line":"        ssh.HNASSSHBackend.vvol_create.assert_called_once_with(share[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_da500a61","line":261,"range":{"start_line":261,"start_character":13,"end_line":261,"end_character":24},"in_reply_to":"da6ed579_09e6a944","updated":"2016-01-19 19:09:26.000000000","message":"Done","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"41f86f801c44051bd5d34e640513d4b3849dc86d","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        CONF.hds_hnas_ssh_private_key \u003d \u0027private_key\u0027"},{"line_number":106,"context_line":"        CONF.hds_hnas_cluster_admin_ip0 \u003d None"},{"line_number":107,"context_line":"        CONF.hds_hnas_stalled_job_timeout \u003d 10"},{"line_number":108,"context_line":"        CONF.hds_hnas_driver_helper \u003d \\"},{"line_number":109,"context_line":"            \u0027manila.share.drivers.hitachi.ssh.HNASSSHBackend\u0027"},{"line_number":110,"context_line":"        self.fake_conf \u003d manila.share.configuration.Configuration(None)"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba63e191_2591029a","line":108,"range":{"start_line":108,"start_character":38,"end_line":108,"end_character":39},"updated":"2016-01-19 21:17:19.000000000","message":"Please use () instead of \\","commit_id":"ffd6546f6a293d36266c2a7f769b5bcb3dcb41c0"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"b8e267c48bd36a1b4344b924cd344b1f93cf0d83","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        CONF.hds_hnas_ssh_private_key \u003d \u0027private_key\u0027"},{"line_number":106,"context_line":"        CONF.hds_hnas_cluster_admin_ip0 \u003d None"},{"line_number":107,"context_line":"        CONF.hds_hnas_stalled_job_timeout \u003d 10"},{"line_number":108,"context_line":"        CONF.hds_hnas_driver_helper \u003d \\"},{"line_number":109,"context_line":"            \u0027manila.share.drivers.hitachi.ssh.HNASSSHBackend\u0027"},{"line_number":110,"context_line":"        self.fake_conf \u003d manila.share.configuration.Configuration(None)"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a68dd71_8d562505","line":108,"range":{"start_line":108,"start_character":38,"end_line":108,"end_character":39},"in_reply_to":"ba63e191_2591029a","updated":"2016-01-20 12:27:37.000000000","message":"Done","commit_id":"ffd6546f6a293d36266c2a7f769b5bcb3dcb41c0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"41f86f801c44051bd5d34e640513d4b3849dc86d","unresolved":false,"context_lines":[{"line_number":562,"context_line":"        self._driver._update_share_stats()"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"        self.assertTrue(self._driver.hnas.get_stats.called)"},{"line_number":565,"context_line":"        manila.share.driver.ShareDriver._update_share_stats.\\"},{"line_number":566,"context_line":"            assert_called_once_with(fake_data)"},{"line_number":567,"context_line":"        self.assertTrue(self.mock_log.info.called)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba63e191_65de1a6f","line":565,"range":{"start_line":565,"start_character":40,"end_line":565,"end_character":59},"updated":"2016-01-19 21:17:19.000000000","message":"Please use () instead of \\","commit_id":"ffd6546f6a293d36266c2a7f769b5bcb3dcb41c0"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"b8e267c48bd36a1b4344b924cd344b1f93cf0d83","unresolved":false,"context_lines":[{"line_number":562,"context_line":"        self._driver._update_share_stats()"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"        self.assertTrue(self._driver.hnas.get_stats.called)"},{"line_number":565,"context_line":"        manila.share.driver.ShareDriver._update_share_stats.\\"},{"line_number":566,"context_line":"            assert_called_once_with(fake_data)"},{"line_number":567,"context_line":"        self.assertTrue(self.mock_log.info.called)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a68dd71_6d3e51ba","line":565,"range":{"start_line":565,"start_character":40,"end_line":565,"end_character":59},"in_reply_to":"ba63e191_65de1a6f","updated":"2016-01-20 12:27:37.000000000","message":"Done","commit_id":"ffd6546f6a293d36266c2a7f769b5bcb3dcb41c0"}],"manila/tests/share/drivers/hitachi/test_ssh.py":[{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"13d90f778d4eef7b6428b504be4f860d1eece40b","unresolved":false,"context_lines":[{"line_number":696,"context_line":"        fake_modify_quota_command \u003d [\u0027quota\u0027, \u0027mod\u0027, \u0027--usage-limit\u0027, \u00271G\u0027,"},{"line_number":697,"context_line":"                                     self.fs_name, \u0027vvol\u0027]"},{"line_number":698,"context_line":"        self.mock_object(ssh.HNASSSHBackend, \"_execute\", mock.Mock())"},{"line_number":699,"context_line":"        self._driver_ssh.modify_quota(\u0027vvol\u0027, 1)"},{"line_number":700,"context_line":"        self._driver_ssh._execute.assert_called_with(fake_modify_quota_command)"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"    def test_check_vvol(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"da6ed579_299b6d74","line":699,"range":{"start_line":699,"start_character":25,"end_line":699,"end_character":37},"updated":"2016-01-15 19:31:37.000000000","message":"I\u0027d like to see whitespace between the mock/call/assert sections, please.","commit_id":"ba817962f59379e9d98cd935961d734b97822558"},{"author":{"_account_id":17097,"name":"Tiago Pasqualini da Silva","email":"t.pasqualini@luizalabs.com","username":"tiago.pasqualini"},"change_message_id":"3d4f782f85787e72b20e79a572249db121e5e38f","unresolved":false,"context_lines":[{"line_number":696,"context_line":"        fake_modify_quota_command \u003d [\u0027quota\u0027, \u0027mod\u0027, \u0027--usage-limit\u0027, \u00271G\u0027,"},{"line_number":697,"context_line":"                                     self.fs_name, \u0027vvol\u0027]"},{"line_number":698,"context_line":"        self.mock_object(ssh.HNASSSHBackend, \"_execute\", mock.Mock())"},{"line_number":699,"context_line":"        self._driver_ssh.modify_quota(\u0027vvol\u0027, 1)"},{"line_number":700,"context_line":"        self._driver_ssh._execute.assert_called_with(fake_modify_quota_command)"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"    def test_check_vvol(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba63e191_fa5aae82","line":699,"range":{"start_line":699,"start_character":25,"end_line":699,"end_character":37},"in_reply_to":"da6ed579_299b6d74","updated":"2016-01-19 19:09:26.000000000","message":"Done","commit_id":"ba817962f59379e9d98cd935961d734b97822558"}]}
