)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"adac46dc63bc5e5338d98486271c0f23ead02a4e","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Implement nfs manage/unmanage of a volume"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This bp is aim to implement nfs manage/unmanage of a volume."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Id043999e2b3de5d3505c74274fd663fad0b44953"},{"line_number":12,"context_line":"Implements: blueprint nfs-manage-unmanage-volume"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"fa7ab95a_ba70b3dd","line":10,"updated":"2016-08-29 15:30:13.000000000","message":"We need more detail here.  At first I thought this was just going to be a spec.  So, don\u0027t want to call this a bp.  This is a patch that is trying to implement the manage/unmanage BP.  Also, we are we not doing anything for unmanage.  I think we should at least explain that.  Thanks!","commit_id":"c73adba63adbee9ae752b1a41d4b300bb96da293"}],"cinder/tests/unit/volume/drivers/test_nfs.py":[{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"dd92bd0bfa143bb330c7e1a72295a7df8537fffa","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"    @staticmethod"},{"line_number":1028,"context_line":"    def _get_manage_existing_vols(name):"},{"line_number":1029,"context_line":"        \"\"\"Helper method used by the manage_existing tests below.\"\"\""},{"line_number":1030,"context_line":"        lvs \u003d [{\u0027name\u0027: \u0027fake_manage_lv\u0027, \u0027size\u0027: \u00271.25\u0027},"},{"line_number":1031,"context_line":"               {\u0027name\u0027: \u0027fake_lv_bad_size\u0027, \u0027size\u0027: \u0027Not a float\u0027}]"},{"line_number":1032,"context_line":"        for lv in lvs:"},{"line_number":1033,"context_line":"            if lv[\u0027name\u0027] \u003d\u003d name:"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa7ab95a_8fe23602","line":1030,"range":{"start_line":1030,"start_character":51,"end_line":1030,"end_character":55},"updated":"2016-08-26 13:24:29.000000000","message":"As per the code, size is in bytes.","commit_id":"e464f4c20aa89910ac904db2f8095d23a3c38282"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"adac46dc63bc5e5338d98486271c0f23ead02a4e","unresolved":false,"context_lines":[{"line_number":1115,"context_line":"                              drv.manage_existing_get_size,"},{"line_number":1116,"context_line":"                              vol, ref)"},{"line_number":1117,"context_line":""},{"line_number":1118,"context_line":""},{"line_number":1119,"context_line":"class NfsDriverDoSetupTestCase(test.TestCase):"},{"line_number":1120,"context_line":""},{"line_number":1121,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_5af08767","line":1118,"updated":"2016-08-29 15:30:13.000000000","message":"I don\u0027t see any test cases for _rename_volume.  Think we should get good and bad path on that as well.","commit_id":"c73adba63adbee9ae752b1a41d4b300bb96da293"}],"cinder/volume/drivers/nfs.py":[{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"03635203bfde17b50fde0ecd990e2b2a0fcc3686","unresolved":false,"context_lines":[{"line_number":461,"context_line":"        try:"},{"line_number":462,"context_line":"            self._rename_volume(vol_name, volume[\u0027name\u0027])"},{"line_number":463,"context_line":"        except putils.ProcessExecutionError as exc:"},{"line_number":464,"context_line":"            exception_message \u003d (_(\"Failed to rename volume %(name)s, \""},{"line_number":465,"context_line":"                                   \"error message was: %(err_msg)s\")"},{"line_number":466,"context_line":"                                 % {\u0027name\u0027: vol_name,"},{"line_number":467,"context_line":"                                    \u0027err_msg\u0027: exc.stderr})"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ad45d7e_ab3acc96","line":464,"updated":"2016-08-11 12:43:47.000000000","message":"Since you are raising a new exception, log a message using LOG.exception.","commit_id":"f7827d860f852df8b1581984583a44d6287b35e0"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"03635203bfde17b50fde0ecd990e2b2a0fcc3686","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        # Raise an exception if we didn\u0027t find a suitable volume."},{"line_number":487,"context_line":"        if not vol:"},{"line_number":488,"context_line":"            kwargs \u003d {\u0027existing_ref\u0027: vol_name,"},{"line_number":489,"context_line":"                      \u0027reason\u0027: \u0027Specified logical volume does not exist.\u0027}"},{"line_number":490,"context_line":"            raise exception.ManageExistingInvalidReference(**kwargs)"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ad45d7e_ab2f6c3d","line":489,"range":{"start_line":489,"start_character":32,"end_line":489,"end_character":74},"updated":"2016-08-11 12:43:47.000000000","message":"Since this is an exception message it must be translated.","commit_id":"f7827d860f852df8b1581984583a44d6287b35e0"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"3d0562d48900bccad70a7df2a55cda31e26526d8","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            raise exception.VolumeBackendAPIException("},{"line_number":470,"context_line":"                data\u003dexception_message)"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"    def manage_existing_get_size(self, existing_object, existing_ref):"},{"line_number":473,"context_line":"        \"\"\"Return size of an existing volume for manage existing volume."},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"        existing_ref is a dictionary of the form:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ac06dbe_0e687cb8","line":472,"range":{"start_line":472,"start_character":39,"end_line":472,"end_character":54},"updated":"2016-08-23 03:44:17.000000000","message":"how about use volume instead of  existing_object","commit_id":"fd39b0c0bfbf49061dae32fcd77f2b0f995f0cb6"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"3d0562d48900bccad70a7df2a55cda31e26526d8","unresolved":false,"context_lines":[{"line_number":476,"context_line":"        {\u0027source-name\u0027: \u003cname of volume\u003e}"},{"line_number":477,"context_line":"        \"\"\""},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        # Check that the reference is valid"},{"line_number":480,"context_line":"        if \u0027source-name\u0027 not in existing_ref:"},{"line_number":481,"context_line":"            reason \u003d _(\u0027Reference must contain source-name element.\u0027)"},{"line_number":482,"context_line":"            raise exception.ManageExistingInvalidReference("}],"source_content_type":"text/x-python","patch_set":4,"id":"1ac06dbe_5a322f60","line":479,"range":{"start_line":479,"start_character":6,"end_line":479,"end_character":43},"updated":"2016-08-23 03:44:17.000000000","message":"Check whether the reference is valid :)","commit_id":"fd39b0c0bfbf49061dae32fcd77f2b0f995f0cb6"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"dd92bd0bfa143bb330c7e1a72295a7df8537fffa","unresolved":false,"context_lines":[{"line_number":454,"context_line":"        \"\"\""},{"line_number":455,"context_line":"        vol_name \u003d existing_ref[\u0027source-name\u0027]"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"        if volutils.check_already_managed_volume(vol_name):"},{"line_number":458,"context_line":"            raise exception.ManageExistingAlreadyManaged(volume_ref\u003dvol_name)"},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"        # Attempt to rename the volume to match the OpenStack internal name."}],"source_content_type":"text/x-python","patch_set":5,"id":"fa7ab95a_3418a184","line":457,"range":{"start_line":457,"start_character":49,"end_line":457,"end_character":57},"updated":"2016-08-26 13:24:29.000000000","message":"The argument to check_already_managed_volume is voume ID. I don\u0027t understand why we need this check.","commit_id":"e464f4c20aa89910ac904db2f8095d23a3c38282"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"dd92bd0bfa143bb330c7e1a72295a7df8537fffa","unresolved":false,"context_lines":[{"line_number":495,"context_line":"        except ValueError:"},{"line_number":496,"context_line":"            exception_message \u003d (_(\"Failed to manage existing \""},{"line_number":497,"context_line":"                                   \"%(name)s, because reported size %(size)s \""},{"line_number":498,"context_line":"                                   \"was not a floating-point number.\")"},{"line_number":499,"context_line":"                                 % {\u0027name\u0027: vol_name,"},{"line_number":500,"context_line":"                                    \u0027size\u0027: vol[\u0027size\u0027]})"},{"line_number":501,"context_line":"            raise exception.VolumeBackendAPIException("}],"source_content_type":"text/x-python","patch_set":5,"id":"fa7ab95a_747ce972","line":498,"range":{"start_line":498,"start_character":36,"end_line":498,"end_character":43},"updated":"2016-08-26 13:24:29.000000000","message":"nit: is not","commit_id":"e464f4c20aa89910ac904db2f8095d23a3c38282"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"dc448c60aa2d7cbab31468eb7b90feb22f174b2d","unresolved":false,"context_lines":[{"line_number":488,"context_line":"        # Raise an exception if we didn\u0027t find a suitable volume."},{"line_number":489,"context_line":"        if not vol:"},{"line_number":490,"context_line":"            kwargs \u003d {\u0027existing_ref\u0027: vol_name,"},{"line_number":491,"context_line":"                      \u0027reason\u0027: _(\u0027Specified logical volume does not exist.\u0027)}"},{"line_number":492,"context_line":"            raise exception.ManageExistingInvalidReference(**kwargs)"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_aa805ec1","line":491,"updated":"2016-08-29 16:05:58.000000000","message":"This is an LVM-specific error message.","commit_id":"c73adba63adbee9ae752b1a41d4b300bb96da293"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"dc448c60aa2d7cbab31468eb7b90feb22f174b2d","unresolved":false,"context_lines":[{"line_number":515,"context_line":"            raise exception.NfsNoSharesMounted()"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"        mount_point \u003d self._get_mount_point_for_share(self._mounted_shares[0])"},{"line_number":518,"context_line":"        du, _ \u003d self._execute(\u0027du\u0027, r\"-ab\", mount_point,"},{"line_number":519,"context_line":"                              run_as_root\u003drun_as_root)"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"        if du is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_cab20206","line":518,"updated":"2016-08-29 16:05:58.000000000","message":"Should not need r\" here.","commit_id":"c73adba63adbee9ae752b1a41d4b300bb96da293"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"dc448c60aa2d7cbab31468eb7b90feb22f174b2d","unresolved":false,"context_lines":[{"line_number":516,"context_line":""},{"line_number":517,"context_line":"        mount_point \u003d self._get_mount_point_for_share(self._mounted_shares[0])"},{"line_number":518,"context_line":"        du, _ \u003d self._execute(\u0027du\u0027, r\"-ab\", mount_point,"},{"line_number":519,"context_line":"                              run_as_root\u003drun_as_root)"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"        if du is not None:"},{"line_number":522,"context_line":"            volumes \u003d du.split()"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_ca8042fa","line":519,"updated":"2016-08-29 16:05:58.000000000","message":"I believe du will return the wrong size for sparse raw files and qcow2 files.","commit_id":"c73adba63adbee9ae752b1a41d4b300bb96da293"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"adac46dc63bc5e5338d98486271c0f23ead02a4e","unresolved":false,"context_lines":[{"line_number":554,"context_line":"                          run_as_root\u003dTrue)"},{"line_number":555,"context_line":"        except putils.ProcessExecutionError:"},{"line_number":556,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":557,"context_line":"                LOG.exception(_LE(\u0027Error renaming volume\u0027))"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"    def unmanage(self, volume):"},{"line_number":560,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_fa395bd8","line":557,"updated":"2016-08-29 15:30:13.000000000","message":"Recommend add \u0027.\u0027 at end here for consistency.","commit_id":"c73adba63adbee9ae752b1a41d4b300bb96da293"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"adac46dc63bc5e5338d98486271c0f23ead02a4e","unresolved":false,"context_lines":[{"line_number":556,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":557,"context_line":"                LOG.exception(_LE(\u0027Error renaming volume\u0027))"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"    def unmanage(self, volume):"},{"line_number":560,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa7ab95a_1a619fd3","line":559,"range":{"start_line":559,"start_character":8,"end_line":559,"end_character":16},"updated":"2016-08-29 15:30:13.000000000","message":"Why do we just pass on unmanage here?  At a minimum we should explain why.","commit_id":"c73adba63adbee9ae752b1a41d4b300bb96da293"}]}
