)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"b5b232659a174fe1731bac5a6cc8c9bed512ad35","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Mudassir Latif \u003cmudassir.latif@purestorage.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-01-05 15:44:32 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"add replication and PG setup methods on PureISCSIDriver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Purity implements asynch replication using arrays"},{"line_number":10,"context_line":"The smallest unit of replication is a Protection Group(PG)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a961159_4a1d9872","line":7,"updated":"2015-01-06 20:47:53.000000000","message":"Please, start commit message with upper-case letter","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"}],"cinder/tests/test_pure.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4d7c152c7bafe6108c070d20e885b76ac1c30465","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        self.config.pure_replication_retention_short_term \u003d None"},{"line_number":168,"context_line":"        self.config.pure_replication_retention_long_term \u003d None"},{"line_number":169,"context_line":"        self.config.pure_replication_retention_long_term_per_day \u003d None"},{"line_number":170,"context_line":"        #mocking choose_target_iscsi_port and saving original method"},{"line_number":171,"context_line":"        #  some tests need the original, most use the mock"},{"line_number":172,"context_line":"        self._choose_target_iscsi_port_orig \u003d cinder.volume.drivers.pure.\\"},{"line_number":173,"context_line":"            PureISCSIDriver._choose_target_iscsi_port"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_1fc1d02e","line":170,"updated":"2015-01-08 16:52:33.000000000","message":"According to a Hacking rules, please add space between comment and # here and below","commit_id":"63de9684b1fe43ab897626fbd7e5c5595659301f"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"28395d2eada2e30fc19d14e4a99782bfb77a6a16","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        self.config.pure_replication_retention_short_term \u003d None"},{"line_number":168,"context_line":"        self.config.pure_replication_retention_long_term \u003d None"},{"line_number":169,"context_line":"        self.config.pure_replication_retention_long_term_per_day \u003d None"},{"line_number":170,"context_line":"        #mocking choose_target_iscsi_port and saving original method"},{"line_number":171,"context_line":"        #  some tests need the original, most use the mock"},{"line_number":172,"context_line":"        self._choose_target_iscsi_port_orig \u003d cinder.volume.drivers.pure.\\"},{"line_number":173,"context_line":"            PureISCSIDriver._choose_target_iscsi_port"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_953e7f89","line":170,"in_reply_to":"3a961159_1fc1d02e","updated":"2015-01-08 18:13:35.000000000","message":"Done","commit_id":"63de9684b1fe43ab897626fbd7e5c5595659301f"}],"cinder/volume/drivers/pure.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"1ff5ad6dd495905afd7c3e6c17c70cbaceb4746a","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    cfg.StrOpt(\"pure_api_token\", default\u003dNone,"},{"line_number":45,"context_line":"               help\u003d\"REST API authorization token.\"),"},{"line_number":46,"context_line":"    cfg.StrOpt(\"pure_replication_target_ip\", default\u003dNone,"},{"line_number":47,"context_line":"               help\u003d\"address of replication target array\"),"},{"line_number":48,"context_line":"    cfg.StrOpt(\"pure_replication_target_api_token\", default\u003dNone,"},{"line_number":49,"context_line":"               help\u003d\"REST API token for replication target array\"),"},{"line_number":50,"context_line":"    cfg.StrOpt(\"pure_replication_protection_group\", default\u003d\"pg-repl-cinder\","}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_ca698826","line":47,"updated":"2015-01-06 20:47:05.000000000","message":"Please, start help messages with upper-case letters","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"ad49a6084a3b2d79e39632ac2dcac4482fceb9ae","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    cfg.StrOpt(\"pure_api_token\", default\u003dNone,"},{"line_number":45,"context_line":"               help\u003d\"REST API authorization token.\"),"},{"line_number":46,"context_line":"    cfg.StrOpt(\"pure_replication_target_ip\", default\u003dNone,"},{"line_number":47,"context_line":"               help\u003d\"address of replication target array\"),"},{"line_number":48,"context_line":"    cfg.StrOpt(\"pure_replication_target_api_token\", default\u003dNone,"},{"line_number":49,"context_line":"               help\u003d\"REST API token for replication target array\"),"},{"line_number":50,"context_line":"    cfg.StrOpt(\"pure_replication_protection_group\", default\u003d\"pg-repl-cinder\","}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_f5fffc63","line":47,"in_reply_to":"3a961159_ca698826","updated":"2015-01-07 02:02:40.000000000","message":"Done","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a0c08294be283440e43be176e4a1e714ec0bcd52","unresolved":false,"context_lines":[{"line_number":136,"context_line":"class PureISCSIDriver(san.SanISCSIDriver):"},{"line_number":137,"context_line":"    \"\"\"Performs volume management on Pure Storage FlashArray.\"\"\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    VERSION \u003d \"2.0.2\""},{"line_number":140,"context_line":"    _no_of_retries \u003d 0"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_9aac38ef","line":139,"updated":"2015-01-06 14:21:33.000000000","message":"update to 2.0.3, i think https://review.openstack.org/#/c/143726/ will get 2.0.2","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"ad49a6084a3b2d79e39632ac2dcac4482fceb9ae","unresolved":false,"context_lines":[{"line_number":136,"context_line":"class PureISCSIDriver(san.SanISCSIDriver):"},{"line_number":137,"context_line":"    \"\"\"Performs volume management on Pure Storage FlashArray.\"\"\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    VERSION \u003d \"2.0.2\""},{"line_number":140,"context_line":"    _no_of_retries \u003d 0"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_f5361c50","line":139,"in_reply_to":"3a961159_9aac38ef","updated":"2015-01-07 02:02:40.000000000","message":"Makes sense. Will do","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"1ff5ad6dd495905afd7c3e6c17c70cbaceb4746a","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def _generate_replication_retention(self):"},{"line_number":160,"context_line":"        \"\"\"self._replication_interval \u003d 900 (15 minutes)"},{"line_number":161,"context_line":"        self._replication_retention_short_term \u003d 14400 (i.e. 4 hours)"},{"line_number":162,"context_line":"        self._replication_retention_long_term \u003d 6"},{"line_number":163,"context_line":"        self._replication_retention_long_term_per_day \u003d 4"},{"line_number":164,"context_line":"        The configuration above will replicate a snapshot every 15 minutes"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_4af3d872","line":161,"updated":"2015-01-06 20:47:05.000000000","message":"Please, remove commented code or re-format if more readable docstring","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"ad49a6084a3b2d79e39632ac2dcac4482fceb9ae","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def _generate_replication_retention(self):"},{"line_number":160,"context_line":"        \"\"\"self._replication_interval \u003d 900 (15 minutes)"},{"line_number":161,"context_line":"        self._replication_retention_short_term \u003d 14400 (i.e. 4 hours)"},{"line_number":162,"context_line":"        self._replication_retention_long_term \u003d 6"},{"line_number":163,"context_line":"        self._replication_retention_long_term_per_day \u003d 4"},{"line_number":164,"context_line":"        The configuration above will replicate a snapshot every 15 minutes"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_554a90ad","line":161,"in_reply_to":"3a961159_4af3d872","updated":"2015-01-07 02:02:40.000000000","message":"reformatted into a standard docstring","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a0c08294be283440e43be176e4a1e714ec0bcd52","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        :param max_retries: how many times to retry"},{"line_number":213,"context_line":"        :return: nothing"},{"line_number":214,"context_line":"        \"\"\""},{"line_number":215,"context_line":"        self._no_of_retries +\u003d 1"},{"line_number":216,"context_line":"        if self._no_of_retries \u003e max_retries:"},{"line_number":217,"context_line":"            raise timeout_exception"},{"line_number":218,"context_line":"        result \u003d function()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_5aa7300b","line":215,"updated":"2015-01-06 14:21:33.000000000","message":"not sure if its actually a problem, but this doesn\u0027t appear to be thread safe, if the methods it is used in are synchronous its fine but might warrant a comment to warn anyone who might use this in the future","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"ad49a6084a3b2d79e39632ac2dcac4482fceb9ae","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        :param max_retries: how many times to retry"},{"line_number":213,"context_line":"        :return: nothing"},{"line_number":214,"context_line":"        \"\"\""},{"line_number":215,"context_line":"        self._no_of_retries +\u003d 1"},{"line_number":216,"context_line":"        if self._no_of_retries \u003e max_retries:"},{"line_number":217,"context_line":"            raise timeout_exception"},{"line_number":218,"context_line":"        result \u003d function()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_d5404061","line":215,"in_reply_to":"3a961159_5aa7300b","updated":"2015-01-07 02:02:40.000000000","message":"It probably isn\u0027t, since all these method are called during setup().\nHowever, I\u0027ll make a change just in case","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"1ff5ad6dd495905afd7c3e6c17c70cbaceb4746a","unresolved":false,"context_lines":[{"line_number":382,"context_line":"                volume[\u0027consistencygroup_id\u0027],"},{"line_number":383,"context_line":"                vol_name"},{"line_number":384,"context_line":"            )"},{"line_number":385,"context_line":"        if _is_volume_replicated_type(volume):"},{"line_number":386,"context_line":"            self._array.add_volume_to_pgroup("},{"line_number":387,"context_line":"                self._replication_protection_group, _get_vol_name(volume))"},{"line_number":388,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.create_volume_from_snapshot.\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_ca7348e5","line":385,"updated":"2015-01-06 20:47:05.000000000","message":"I propose to move these 3 lines to a method because it repeated 3 times","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"ad49a6084a3b2d79e39632ac2dcac4482fceb9ae","unresolved":false,"context_lines":[{"line_number":382,"context_line":"                volume[\u0027consistencygroup_id\u0027],"},{"line_number":383,"context_line":"                vol_name"},{"line_number":384,"context_line":"            )"},{"line_number":385,"context_line":"        if _is_volume_replicated_type(volume):"},{"line_number":386,"context_line":"            self._array.add_volume_to_pgroup("},{"line_number":387,"context_line":"                self._replication_protection_group, _get_vol_name(volume))"},{"line_number":388,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.create_volume_from_snapshot.\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_f821b39e","line":385,"in_reply_to":"3a961159_ca7348e5","updated":"2015-01-07 02:02:40.000000000","message":"Done","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a0c08294be283440e43be176e4a1e714ec0bcd52","unresolved":false,"context_lines":[{"line_number":426,"context_line":"                        ERR_MSG_NOT_EXIST in err.msg:"},{"line_number":427,"context_line":"                    # Happens if the volume does not exist."},{"line_number":428,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":429,"context_line":"                    LOG.warn(_LW(\"Volume deletion failed with message: %s\"),"},{"line_number":430,"context_line":"                             err.msg)"},{"line_number":431,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.delete_volume.\")"},{"line_number":432,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_3f6a56ed","line":429,"updated":"2015-01-06 14:21:33.000000000","message":"we should probably split out these log changes into a separate commit","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"ad49a6084a3b2d79e39632ac2dcac4482fceb9ae","unresolved":false,"context_lines":[{"line_number":426,"context_line":"                        ERR_MSG_NOT_EXIST in err.msg:"},{"line_number":427,"context_line":"                    # Happens if the volume does not exist."},{"line_number":428,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":429,"context_line":"                    LOG.warn(_LW(\"Volume deletion failed with message: %s\"),"},{"line_number":430,"context_line":"                             err.msg)"},{"line_number":431,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.delete_volume.\")"},{"line_number":432,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_782dc38e","line":429,"in_reply_to":"3a961159_3f6a56ed","updated":"2015-01-07 02:02:40.000000000","message":"split out into https://bugs.launchpad.net/cinder/+bug/1408160","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a0c08294be283440e43be176e4a1e714ec0bcd52","unresolved":false,"context_lines":[{"line_number":615,"context_line":"            return None  # no update"},{"line_number":616,"context_line":""},{"line_number":617,"context_line":"    def retype(self, context, volume, new_type, diff, host):"},{"line_number":618,"context_line":"        #only changes to replication require any modifications on array"},{"line_number":619,"context_line":"        current_vol_type \u003d volume_types.get_volume_type("},{"line_number":620,"context_line":"            context,"},{"line_number":621,"context_line":"            volume[\"volume_type_id\"])"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_bf548622","line":618,"updated":"2015-01-06 14:21:33.000000000","message":"add a space after # to match the others","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"ad49a6084a3b2d79e39632ac2dcac4482fceb9ae","unresolved":false,"context_lines":[{"line_number":615,"context_line":"            return None  # no update"},{"line_number":616,"context_line":""},{"line_number":617,"context_line":"    def retype(self, context, volume, new_type, diff, host):"},{"line_number":618,"context_line":"        #only changes to replication require any modifications on array"},{"line_number":619,"context_line":"        current_vol_type \u003d volume_types.get_volume_type("},{"line_number":620,"context_line":"            context,"},{"line_number":621,"context_line":"            volume[\"volume_type_id\"])"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_b852cb10","line":618,"in_reply_to":"3a961159_bf548622","updated":"2015-01-07 02:02:40.000000000","message":"Done","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"a0c08294be283440e43be176e4a1e714ec0bcd52","unresolved":false,"context_lines":[{"line_number":788,"context_line":"        \"\"\""},{"line_number":789,"context_line":"        array_name value is needed to identify array for replication"},{"line_number":790,"context_line":"        may be different from management interface (target)"},{"line_number":791,"context_line":"        will have to be retrieved by querying the array"},{"line_number":792,"context_line":"        \"\"\""},{"line_number":793,"context_line":"        array_info \u003d self.get_array()"},{"line_number":794,"context_line":"        self.array_name \u003d array_info[\"array_name\"]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_3a5424fd","line":791,"updated":"2015-01-06 14:21:33.000000000","message":"might want to edit this a tad to clarify, something like \"array_name value is needed to identify this array for replication and may be different from the primary backend array so it must be retrieved by querying the array.\"","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"ad49a6084a3b2d79e39632ac2dcac4482fceb9ae","unresolved":false,"context_lines":[{"line_number":788,"context_line":"        \"\"\""},{"line_number":789,"context_line":"        array_name value is needed to identify array for replication"},{"line_number":790,"context_line":"        may be different from management interface (target)"},{"line_number":791,"context_line":"        will have to be retrieved by querying the array"},{"line_number":792,"context_line":"        \"\"\""},{"line_number":793,"context_line":"        array_info \u003d self.get_array()"},{"line_number":794,"context_line":"        self.array_name \u003d array_info[\"array_name\"]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_78b2234a","line":791,"in_reply_to":"3a961159_3a5424fd","updated":"2015-01-07 02:02:40.000000000","message":"changed the description to be (hopefully) clearer.","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"1ff5ad6dd495905afd7c3e6c17c70cbaceb4746a","unresolved":false,"context_lines":[{"line_number":998,"context_line":"        return self._http_request(\"GET\", \"pgroup/%s\" % pgroup_name)"},{"line_number":999,"context_line":""},{"line_number":1000,"context_line":"    def does_pgroup_exist(self, pgroup_name):"},{"line_number":1001,"context_line":"        \"\"\"return True/False\"\"\""},{"line_number":1002,"context_line":"        try:"},{"line_number":1003,"context_line":"            self.get_pgroup(pgroup_name)"},{"line_number":1004,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_0a28f095","line":1001,"updated":"2015-01-06 20:47:05.000000000","message":"Seems this method could return True, False and None. Is it expected behavior?","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"ad49a6084a3b2d79e39632ac2dcac4482fceb9ae","unresolved":false,"context_lines":[{"line_number":998,"context_line":"        return self._http_request(\"GET\", \"pgroup/%s\" % pgroup_name)"},{"line_number":999,"context_line":""},{"line_number":1000,"context_line":"    def does_pgroup_exist(self, pgroup_name):"},{"line_number":1001,"context_line":"        \"\"\"return True/False\"\"\""},{"line_number":1002,"context_line":"        try:"},{"line_number":1003,"context_line":"            self.get_pgroup(pgroup_name)"},{"line_number":1004,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_7889436e","line":1001,"in_reply_to":"3a961159_0a28f095","updated":"2015-01-07 02:02:40.000000000","message":"Method should never return None. 3 possibilities:\n- pgroup exists, no exception raised, returns True\n- pgroup doesn\u0027t exist, PureAPIException with 400, swallow exception and return False\n- any other exception: re-raised and is caught by the caller (see excutils.save_and_reraise_exception()","commit_id":"869253af6756fe1e96eaba389ef06eae8437f665"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4d7c152c7bafe6108c070d20e885b76ac1c30465","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        if self._add_volume_to_repl_protection_group_if_needed(volume):"},{"line_number":378,"context_line":"            model_update[\"replication_status\"] \u003d \"copying\""},{"line_number":379,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.create_volume.\""},{"line_number":380,"context_line":"                  \"Return value: %s\", str(model_update))"},{"line_number":381,"context_line":"        return model_update"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"    def create_volume_from_snapshot(self, volume, snapshot):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_7fa574b3","line":380,"updated":"2015-01-08 16:52:33.000000000","message":"You should to use six.text_type instead of str here and below","commit_id":"63de9684b1fe43ab897626fbd7e5c5595659301f"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"28395d2eada2e30fc19d14e4a99782bfb77a6a16","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        if self._add_volume_to_repl_protection_group_if_needed(volume):"},{"line_number":378,"context_line":"            model_update[\"replication_status\"] \u003d \"copying\""},{"line_number":379,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.create_volume.\""},{"line_number":380,"context_line":"                  \"Return value: %s\", str(model_update))"},{"line_number":381,"context_line":"        return model_update"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"    def create_volume_from_snapshot(self, volume, snapshot):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_35ea2ba0","line":380,"in_reply_to":"3a961159_7fa574b3","updated":"2015-01-08 18:13:35.000000000","message":"Done","commit_id":"63de9684b1fe43ab897626fbd7e5c5595659301f"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4d7c152c7bafe6108c070d20e885b76ac1c30465","unresolved":false,"context_lines":[{"line_number":662,"context_line":"            LOG.debug(\"Updating volume stats.\")"},{"line_number":663,"context_line":"            self._update_stats()"},{"line_number":664,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.get_volume_stats.\""},{"line_number":665,"context_line":"                  \"Return value: %s\" % str(self._stats))"},{"line_number":666,"context_line":"        return self._stats"},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"    def _update_stats(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_5f90b842","line":665,"updated":"2015-01-08 16:52:33.000000000","message":"% \u003d\u003e ,","commit_id":"63de9684b1fe43ab897626fbd7e5c5595659301f"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"28395d2eada2e30fc19d14e4a99782bfb77a6a16","unresolved":false,"context_lines":[{"line_number":662,"context_line":"            LOG.debug(\"Updating volume stats.\")"},{"line_number":663,"context_line":"            self._update_stats()"},{"line_number":664,"context_line":"        LOG.debug(\"Leave PureISCSIDriver.get_volume_stats.\""},{"line_number":665,"context_line":"                  \"Return value: %s\" % str(self._stats))"},{"line_number":666,"context_line":"        return self._stats"},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"    def _update_stats(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_35d30b02","line":665,"in_reply_to":"3a961159_5f90b842","updated":"2015-01-08 18:13:35.000000000","message":"Done","commit_id":"63de9684b1fe43ab897626fbd7e5c5595659301f"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4d7c152c7bafe6108c070d20e885b76ac1c30465","unresolved":false,"context_lines":[{"line_number":1019,"context_line":"                        \"does not exist\" in err.msg:"},{"line_number":1020,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":1021,"context_line":"                    return False"},{"line_number":1022,"context_line":"            # any unexpected exception to be handled by caller"},{"line_number":1023,"context_line":""},{"line_number":1024,"context_line":"    def allow_target_pgroup(self, source_array_name, pgroup_name):"},{"line_number":1025,"context_line":"        \"\"\"allow target pgroup"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_1faab070","line":1022,"updated":"2015-01-08 16:52:33.000000000","message":"Please, start comments with an upper-case letter","commit_id":"63de9684b1fe43ab897626fbd7e5c5595659301f"},{"author":{"_account_id":13461,"name":"Mudassir Latif","email":"mudassir.latif@purestorage.com","username":"Mudassir.Latif"},"change_message_id":"28395d2eada2e30fc19d14e4a99782bfb77a6a16","unresolved":false,"context_lines":[{"line_number":1019,"context_line":"                        \"does not exist\" in err.msg:"},{"line_number":1020,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":1021,"context_line":"                    return False"},{"line_number":1022,"context_line":"            # any unexpected exception to be handled by caller"},{"line_number":1023,"context_line":""},{"line_number":1024,"context_line":"    def allow_target_pgroup(self, source_array_name, pgroup_name):"},{"line_number":1025,"context_line":"        \"\"\"allow target pgroup"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_f5f3439c","line":1022,"in_reply_to":"3a961159_1faab070","updated":"2015-01-08 18:13:35.000000000","message":"I\u0027ve gone through and changed all comments I could find","commit_id":"63de9684b1fe43ab897626fbd7e5c5595659301f"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":51,"context_line":"               help\u003d\"Address of replication target array\"),"},{"line_number":52,"context_line":"    cfg.StrOpt(\"pure_replication_target_api_token\", default\u003dNone,"},{"line_number":53,"context_line":"               help\u003d\"REST API token for replication target array\"),"},{"line_number":54,"context_line":"    cfg.StrOpt(\"pure_replication_protection_group\", default\u003d\"pg-repl-cinder\","},{"line_number":55,"context_line":"               help\u003d\"Name of protection group that is replicated\"),"},{"line_number":56,"context_line":"    cfg.IntOpt(\"pure_replication_interval\", default\u003d900,"},{"line_number":57,"context_line":"               help\u003d\"Snapshot replication interval in seconds\"),"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_d4e39302","line":54,"updated":"2015-02-13 04:50:00.000000000","message":"replication + CG.  You can only have one group?","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        return True"},{"line_number":84,"context_line":"    except purestorage.PureHTTPError as err:"},{"line_number":85,"context_line":"        with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":86,"context_line":"            if err.code \u003d\u003d 400 and \"does not exist\" in err.text:"},{"line_number":87,"context_line":"                ctxt.reraise \u003d False"},{"line_number":88,"context_line":"                return False"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_17e0cd24","line":86,"updated":"2015-02-13 04:50:00.000000000","message":"Use ERR_MSG_NOT_EXIST.","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"def _get_latest_replicated_vol_snap("},{"line_number":92,"context_line":"        array, source_array_name, pgroup_name, vol_name):"},{"line_number":93,"context_line":"    # Get all protection group snapshots"},{"line_number":94,"context_line":"    snap_name \u003d \"%s:%s\" % (source_array_name, pgroup_name)"},{"line_number":95,"context_line":"    pg_snaps \u003d array.get_pgroup(snap_name, snap\u003dTrue, transfer\u003dTrue)"},{"line_number":96,"context_line":"    # Only use snapshots that are replicated completely"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_14c1ab4d","line":93,"updated":"2015-02-13 04:50:00.000000000","message":"All snapshots for volume \u0027vol_name\u0027 in the cg?","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    # Only use snapshots that are replicated completely"},{"line_number":97,"context_line":"    pg_snaps_filtered \u003d [s for s in pg_snaps if s[\"progress\"] \u003d\u003d 1]"},{"line_number":98,"context_line":"    # Go through the protection group snapshots, latest first ...."},{"line_number":99,"context_line":"    #   stop when we find required volume snapshot"},{"line_number":100,"context_line":"    pg_snaps_filtered.sort(key\u003dlambda x: x[\"created\"], reverse\u003dTrue)"},{"line_number":101,"context_line":"    volume_snap \u003d None"},{"line_number":102,"context_line":"    vol_snap_source_to_find \u003d \"%s:%s\" % (source_array_name, vol_name)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_34a30fb3","line":99,"updated":"2015-02-13 04:50:00.000000000","message":"extra space after #","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                                      % pg_snap[\"name\"])"},{"line_number":110,"context_line":"        for snap in volume_snaps:"},{"line_number":111,"context_line":"            if snap[\"source\"] \u003d\u003d vol_snap_source_to_find:"},{"line_number":112,"context_line":"                volume_snap \u003d snap"},{"line_number":113,"context_line":"        if volume_snap:  # Found the volume snapshot we needed"},{"line_number":114,"context_line":"                break"},{"line_number":115,"context_line":"    return volume_snap"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_b47d3f1e","line":112,"updated":"2015-02-13 04:50:00.000000000","message":"I was wondering why you don\u0027t break here. Please add a comment: Finding the last snapshot.","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        return True"},{"line_number":123,"context_line":"    except purestorage.PureHTTPError as err:"},{"line_number":124,"context_line":"        with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":125,"context_line":"            if err.code \u003d\u003d 400 and \"does not exist\" in err.text:"},{"line_number":126,"context_line":"                ctxt.reraise \u003d False"},{"line_number":127,"context_line":"                return False"},{"line_number":128,"context_line":"        # Any unexpected exception to be handled by caller"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_94d2fbce","line":125,"updated":"2015-02-13 04:50:00.000000000","message":"constant for the text.","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        False otherwise"},{"line_number":223,"context_line":"        \"\"\""},{"line_number":224,"context_line":"        if _is_volume_replicated_type(volume):"},{"line_number":225,"context_line":"            array.set_pgroup(self._replication_protection_group,"},{"line_number":226,"context_line":"                             addvollist\u003d[_get_vol_name(volume)])"},{"line_number":227,"context_line":"            array.create_pgroup_snapshot(self._replication_protection_group,"},{"line_number":228,"context_line":"                                         replicate_now\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_1719add0","line":225,"updated":"2015-02-13 04:50:00.000000000","message":"It seems that replication can only happen at the group level for purity.","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        return secondary"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    def _get_arrays(self, volume):"},{"line_number":266,"context_line":"        \"\"\"Returns the primary and secondary array for a volume or snapshot"},{"line_number":267,"context_line":"        :param volume: dictionary describing the volume or snapshot"},{"line_number":268,"context_line":"        :return: the (primary, secondary) array for the volume"},{"line_number":269,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_3465cf1d","line":266,"updated":"2015-02-13 04:50:00.000000000","message":"See docstring guidelines.","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        # is misconfigured"},{"line_number":273,"context_line":"        primary_array \u003d self._array"},{"line_number":274,"context_line":"        secondary_array \u003d self._replication_target_array"},{"line_number":275,"context_line":"        if primary and self._replication_target_array \\"},{"line_number":276,"context_line":"                and self._replication_target_array._target \u003d\u003d primary:"},{"line_number":277,"context_line":"            primary_array \u003d self._replication_target_array"},{"line_number":278,"context_line":"            secondary_array \u003d self._array"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_946e7bfe","line":275,"updated":"2015-02-13 04:50:00.000000000","message":"()","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                    # We assume GP has already setup with correct"},{"line_number":294,"context_line":"                    # replication settings"},{"line_number":295,"context_line":"                    return"},{"line_number":296,"context_line":"                if err.code \u003d\u003d 400 \\"},{"line_number":297,"context_line":"                        and ERR_MSG_PENDING_ERADICATION in err.text:"},{"line_number":298,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":299,"context_line":"                    LOG.warn(_LW(\"PG %s is deleted but not eradicated \""}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_146feb60","line":296,"updated":"2015-02-13 04:50:00.000000000","message":"Use ().","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":308,"context_line":"                                        test_function,"},{"line_number":309,"context_line":"                                        timeout_exception,"},{"line_number":310,"context_line":"                                        max_retries):"},{"line_number":311,"context_line":"        \"\"\"Generic method to use in retry-wait pattern with loopingCall"},{"line_number":312,"context_line":"        :param function: The function to try"},{"line_number":313,"context_line":"        :param test_function:  the test to apply on result of function"},{"line_number":314,"context_line":"        :param timeout_exception: exception to raise if we exceed max_retries"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_f4aa576f","line":311,"updated":"2015-02-13 04:50:00.000000000","message":"http://docs.openstack.org/developer/hacking/#docstrings","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":332,"context_line":"                  \"target_group_setting_propagates.\")"},{"line_number":333,"context_line":"        timer \u003d loopingcall.FixedIntervalLoopingCall("},{"line_number":334,"context_line":"            self._retry_a_function_until_success,"},{"line_number":335,"context_line":"            # function to retry"},{"line_number":336,"context_line":"            lambda: _does_pgroup_exist("},{"line_number":337,"context_line":"                target_array,"},{"line_number":338,"context_line":"                pgroup_name_on_target),"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_74ae6782","line":335,"updated":"2015-02-13 04:50:00.000000000","message":"Upper case first letter.","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":370,"context_line":"    def _setup_replicated_pgroup(self, source_array, target_array):"},{"line_number":371,"context_line":"        LOG.debug(\"Enter PureISCSIDriver._setup_replicated_pgroup.\")"},{"line_number":372,"context_line":"        retry_interval \u003d 5  # 5 seconds"},{"line_number":373,"context_line":"        max_retries \u003d 12  # 12 * 5 \u003d 60 seconds"},{"line_number":374,"context_line":"        self._create_protection_group_if_not_exist("},{"line_number":375,"context_line":"            source_array, self._replication_protection_group)"},{"line_number":376,"context_line":"        \"\"\"Apply retention policies to a protection group"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_14bd2bb1","line":373,"updated":"2015-02-13 04:50:00.000000000","message":"Suggest you make these two configurable.","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":375,"context_line":"            source_array, self._replication_protection_group)"},{"line_number":376,"context_line":"        \"\"\"Apply retention policies to a protection group"},{"line_number":377,"context_line":"        These retention policies will be applied on the replicated snapshots"},{"line_number":378,"context_line":"        on the target array\"\"\""},{"line_number":379,"context_line":"        retention_policy \u003d self._generate_replication_retention()"},{"line_number":380,"context_line":"        source_array.set_pgroup(self._replication_protection_group,"},{"line_number":381,"context_line":"                                **retention_policy)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_54308355","line":378,"updated":"2015-02-13 04:50:00.000000000","message":"docstring is usually in the beginning of a function. Comments with # should be fine here.","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":380,"context_line":"        source_array.set_pgroup(self._replication_protection_group,"},{"line_number":381,"context_line":"                                **retention_policy)"},{"line_number":382,"context_line":"        \"\"\"Configure replication propagation frequency on a protection group"},{"line_number":383,"context_line":"        replicate_interval maps to replicate_frequency in Purity REST API\"\"\""},{"line_number":384,"context_line":"        source_array.set_pgroup(self._replication_protection_group,"},{"line_number":385,"context_line":"                                replicate_frequency\u003dself._replication_interval)"},{"line_number":386,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_f403370d","line":383,"updated":"2015-02-13 04:50:00.000000000","message":"Same","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":389,"context_line":"                                    addtargetlist\u003d[target_array.array_name])"},{"line_number":390,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":391,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":392,"context_line":"                if err.code \u003d\u003d 400 and \\"},{"line_number":393,"context_line":"                        \"Protection group already includes target\" in err.text:"},{"line_number":394,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":395,"context_line":"                    LOG.info(_LI(\"skipping add target %(target_array)s to \""}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_b773817e","line":392,"updated":"2015-02-13 04:50:00.000000000","message":"()","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":391,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":392,"context_line":"                if err.code \u003d\u003d 400 and \\"},{"line_number":393,"context_line":"                        \"Protection group already includes target\" in err.text:"},{"line_number":394,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":395,"context_line":"                    LOG.info(_LI(\"skipping add target %(target_array)s to \""},{"line_number":396,"context_line":"                                 \"PG %(pgname)s since it\u0027s already added\"),"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_d422b3ff","line":393,"updated":"2015-02-13 04:50:00.000000000","message":"Please use constant for the text you are trying to search.","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":408,"context_line":"        except purestorage.PureHTTPError as err:"},{"line_number":409,"context_line":"            with excutils.save_and_reraise_exception() as ctxt:"},{"line_number":410,"context_line":"                if err.code \u003d\u003d 400 and \\"},{"line_number":411,"context_line":"                        \"Protection group is already allowed on this \" \\"},{"line_number":412,"context_line":"                        \"target\" in err.text:"},{"line_number":413,"context_line":"                    ctxt.reraise \u003d False"},{"line_number":414,"context_line":"                    LOG.info(_LI(\"skipping allow pgroup %(pgname)s on \""}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_547ec3e4","line":411,"updated":"2015-02-13 04:50:00.000000000","message":"Use ()\n\nUse constant for the text.","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"47fda34c5d4507a16d57a2dd38598516c03ad583","unresolved":false,"context_lines":[{"line_number":461,"context_line":"            self._replication_target_array.iscsi_port \u003d \\"},{"line_number":462,"context_line":"                self._choose_target_iscsi_port(self._replication_target_array)"},{"line_number":463,"context_line":"            self._replication_protection_group \u003d \\"},{"line_number":464,"context_line":"                self.configuration.pure_replication_protection_group"},{"line_number":465,"context_line":"            self._replication_interval \u003d \\"},{"line_number":466,"context_line":"                self.configuration.pure_replication_interval"},{"line_number":467,"context_line":"            self._replication_retention_short_term \u003d \\"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_97d2fdce","line":464,"updated":"2015-02-13 04:50:00.000000000","message":"You can only have one replication protection group?","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"1313bdd88fda5ea4321602dc737fea537c84147e","unresolved":false,"context_lines":[{"line_number":638,"context_line":"                  \"volume \u003d %s\", volume[\"id\"])"},{"line_number":639,"context_line":"        # Verify that the volume is currently not replicating"},{"line_number":640,"context_line":"        if volume[\"replication_status\"] \u003d\u003d \"active\":"},{"line_number":641,"context_line":"            raise exception.PureDriverException("},{"line_number":642,"context_line":"                reason\u003d\"volume already has replication enabled\")"},{"line_number":643,"context_line":"        # Verify that volume type supports replication"},{"line_number":644,"context_line":"        if not _is_volume_replicated_type(volume):"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_f9dbf51e","line":641,"updated":"2015-02-15 09:43:54.000000000","message":"No need to raise an exception, you can just log saying, already enabled and do nothing","commit_id":"31edb11147eb03122e6da5ec1181eda7c6ba402d"}]}
