)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6043,"name":"Kurt Martin","email":"kurt.f.martin@hpe.com","username":"kurt-f-martin"},"change_message_id":"b773967c9e8ac8facde67aad9256773370a37d74","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                       \u0027san_ip\u0027\u003d\u002710.10.10.10\u0027 \\"},{"line_number":35,"context_line":"                       \u0027san_login\u0027\u003d\u0027user\u0027 \\"},{"line_number":36,"context_line":"                       \u0027san_password\u0027\u003d\u0027pass\u0027}"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"Change-Id: I92bbe919c177e8242de8affad62f36a6edf7b0d7"},{"line_number":39,"context_line":"Implements: blueprint hp-3par-v2-replication"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7a2fa921_90bed7d2","line":37,"updated":"2015-10-07 20:39:46.000000000","message":"Please add a DocImpact flag to the commit message on your next patch set.","commit_id":"5bb8964893ffc30ba4e81486b9b2b0eaa9c300b9"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"286aa1dd5fb3d63167c8881d4aa28072ea9d1464","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                       \u0027san_ip\u0027\u003d\u002710.10.10.10\u0027 \\"},{"line_number":35,"context_line":"                       \u0027san_login\u0027\u003d\u0027user\u0027 \\"},{"line_number":36,"context_line":"                       \u0027san_password\u0027\u003d\u0027pass\u0027}"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"Change-Id: I92bbe919c177e8242de8affad62f36a6edf7b0d7"},{"line_number":39,"context_line":"Implements: blueprint hp-3par-v2-replication"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7a2fa921_1079672f","line":37,"in_reply_to":"7a2fa921_90bed7d2","updated":"2015-10-07 20:41:24.000000000","message":"Got it :)","commit_id":"5bb8964893ffc30ba4e81486b9b2b0eaa9c300b9"},{"author":{"_account_id":11903,"name":"Anthony Lee","email":"anthony.mic.lee@hpe.com","username":"leeantho"},"change_message_id":"d04c9eb790cd9e2dc15e7f8e6805fd9658a23e05","unresolved":false,"context_lines":[{"line_number":31,"context_line":"san_password \u003d pass"},{"line_number":32,"context_line":"volume_backend_name \u003d 3parfcrep"},{"line_number":33,"context_line":"hpe3par_cpg \u003d REMOTE_COPY_CPG2,REMOTE_COPY_CPG"},{"line_number":34,"context_line":"volume_driver \u003d cinder.volume.drivers.san.hp.hp_3par_fc.HP3PARFCDriver"},{"line_number":35,"context_line":"replication_device \u003d target_device_id:eos7,replication_mode:periodic,cpg_map:"},{"line_number":36,"context_line":"                     REMOTE_COPY_CPG2:REMOTE_COPY_DEST2 REMOTE_COPY_CPG:REMOTE_COPY_DEST,"},{"line_number":37,"context_line":"                     hpe3par_api_url:http://11.11.11.11:8008/api/v1,hpe3par_username:user,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":39,"id":"9a8ffd7b_d7256bc2","line":34,"updated":"2015-11-24 23:30:07.000000000","message":"since all the new config options are in this example this can be the new driver path, too:\n\nvolume_driver \u003d cinder.volume.drivers.hpe.hpe_3par_fc.HPE3PARFCDriver","commit_id":"9e65f7aa8d89e53912c0f35bd5d4a375f17c8328"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"795271ed2508df9cd0686ec55cd7be0608cdb7e7","unresolved":false,"context_lines":[{"line_number":31,"context_line":"san_password \u003d pass"},{"line_number":32,"context_line":"volume_backend_name \u003d 3parfcrep"},{"line_number":33,"context_line":"hpe3par_cpg \u003d REMOTE_COPY_CPG2,REMOTE_COPY_CPG"},{"line_number":34,"context_line":"volume_driver \u003d cinder.volume.drivers.san.hp.hp_3par_fc.HP3PARFCDriver"},{"line_number":35,"context_line":"replication_device \u003d target_device_id:eos7,replication_mode:periodic,cpg_map:"},{"line_number":36,"context_line":"                     REMOTE_COPY_CPG2:REMOTE_COPY_DEST2 REMOTE_COPY_CPG:REMOTE_COPY_DEST,"},{"line_number":37,"context_line":"                     hpe3par_api_url:http://11.11.11.11:8008/api/v1,hpe3par_username:user,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":39,"id":"9a8ffd7b_675e6d14","line":34,"in_reply_to":"9a8ffd7b_d7256bc2","updated":"2015-11-30 16:01:36.000000000","message":"Done","commit_id":"9e65f7aa8d89e53912c0f35bd5d4a375f17c8328"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"3238324628c1c62d93470098673cb60cabb958b9","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                     REMOTE_COPY_CPG2:REMOTE_COPY_DEST2 REMOTE_COPY_CPG:REMOTE_COPY_DEST,"},{"line_number":37,"context_line":"                     hpe3par_api_url:http://11.11.11.11:8008/api/v1,hpe3par_username:user,"},{"line_number":38,"context_line":"                     hpe3par_password:pass,san_ip:11.11.11.11,san_login:user,"},{"line_number":39,"context_line":"                     san_password:pass"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Change-Id: I92bbe919c177e8242de8affad62f36a6edf7b0d7"},{"line_number":42,"context_line":"Implements: blueprint hp-3par-v2-replication"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":58,"id":"5a710552_33ff02ac","line":39,"updated":"2015-12-15 22:33:44.000000000","message":"Do you think it\u0027s worth while adding an example iscsi driver conf block?\n\nprobably should also list the hpe3par_iscsi_ips list here as well for attaching for iscsi.  I think if we just support hpe3par_iscsi_ips here it should work for iSCSI attaches.","commit_id":"004cca89b28552ce05f0880bcb8d9d9db893c216"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"552a86157ff617d072f2af70bc9d2b9168ebc347","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                     REMOTE_COPY_CPG2:REMOTE_COPY_DEST2 REMOTE_COPY_CPG:REMOTE_COPY_DEST,"},{"line_number":37,"context_line":"                     hpe3par_api_url:http://11.11.11.11:8008/api/v1,hpe3par_username:user,"},{"line_number":38,"context_line":"                     hpe3par_password:pass,san_ip:11.11.11.11,san_login:user,"},{"line_number":39,"context_line":"                     san_password:pass"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Change-Id: I92bbe919c177e8242de8affad62f36a6edf7b0d7"},{"line_number":42,"context_line":"Implements: blueprint hp-3par-v2-replication"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":58,"id":"5a710552_dc600b38","line":39,"in_reply_to":"5a710552_33ff02ac","updated":"2015-12-15 22:53:17.000000000","message":"Done. I think that would be beneficial.","commit_id":"004cca89b28552ce05f0880bcb8d9d9db893c216"}],"cinder/tests/unit/test_hp3par.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"919d772f5b51b876b8f30fa73d47f97487c01221","unresolved":false,"context_lines":[{"line_number":4647,"context_line":""},{"line_number":4648,"context_line":"            # test a unsuccessful failover"},{"line_number":4649,"context_line":"            mock_replicated_client.getStorageSystemInfo.side_effect \u003d ("},{"line_number":4650,"context_line":"                Exception(\"Error: Failover was unsuccessful.\"))"},{"line_number":4651,"context_line":"            self.assertRaises("},{"line_number":4652,"context_line":"                exception.VolumeBackendAPIException,"},{"line_number":4653,"context_line":"                self.driver.replication_failover,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_4edd6213","line":4650,"updated":"2015-10-06 01:12:44.000000000","message":"This should be a VolumeBackendAPIException to match line 4652, rather than a general Exception.","commit_id":"ccb6a0e5a7bc5c7b6204b13878615b67dadc4a6b"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"3f1110ad8b1765ca4cfbc71c3c81fdf56689a0f4","unresolved":false,"context_lines":[{"line_number":4647,"context_line":""},{"line_number":4648,"context_line":"            # test a unsuccessful failover"},{"line_number":4649,"context_line":"            mock_replicated_client.getStorageSystemInfo.side_effect \u003d ("},{"line_number":4650,"context_line":"                Exception(\"Error: Failover was unsuccessful.\"))"},{"line_number":4651,"context_line":"            self.assertRaises("},{"line_number":4652,"context_line":"                exception.VolumeBackendAPIException,"},{"line_number":4653,"context_line":"                self.driver.replication_failover,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_8299f070","line":4650,"in_reply_to":"7a2fa921_4edd6213","updated":"2015-10-06 15:15:47.000000000","message":"Done","commit_id":"ccb6a0e5a7bc5c7b6204b13878615b67dadc4a6b"}],"cinder/volume/drivers/hpe/hpe_3par_common.py":[{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"0366853232620350a33842a29e2fb3fdb6c59c1e","unresolved":false,"context_lines":[{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        return cl"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    def client_login(self, conf\u003dNone):"},{"line_number":308,"context_line":"        if conf:"},{"line_number":309,"context_line":"            hpe3par_username \u003d conf[\u0027hpe3par_username\u0027]"},{"line_number":310,"context_line":"            hpe3par_password \u003d conf[\u0027hpe3par_password\u0027]"}],"source_content_type":"text/x-python","patch_set":30,"id":"da85f559_53aa4186","line":307,"updated":"2015-11-12 09:06:10.000000000","message":"Alex. I do not quite understand why conf is added for unmanaged, but not managed.\nIMO, no matter it is managed or unmanaged, we always need to parse the information from replication_device to get the connection information for the target. Right?","commit_id":"fb5f58e100b57496862317cac468efb28e363825"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"db3f4ae4269dfb8c3472149644cf286443fff84e","unresolved":false,"context_lines":[{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        return cl"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    def client_login(self, conf\u003dNone):"},{"line_number":308,"context_line":"        if conf:"},{"line_number":309,"context_line":"            hpe3par_username \u003d conf[\u0027hpe3par_username\u0027]"},{"line_number":310,"context_line":"            hpe3par_password \u003d conf[\u0027hpe3par_password\u0027]"}],"source_content_type":"text/x-python","patch_set":30,"id":"da85f559_7b56e507","line":307,"in_reply_to":"da85f559_53aa4186","updated":"2015-11-13 21:11:46.000000000","message":"Hi Vincent,\n\nWith managed replication, an entirely new driver instance exists for the replication device. With unmanaged, this is not the case. If you take a look at the commit message of my managed patch, you can see it has two configured backends in cinder.conf: 3parfcrep and 3parfc. When a replicated volume (backend 3parfcrep) is failed over, the volumes host value is changed to represent the 3parfc backend. When this happens, the new driver instance will receive all provisioning requests for that volume. This driver instance also know exactly how to contact the new array, so there is no need to pass in the replication_device info.\n\nIn unmanaged, we are forcing the original driver instance to handle where exactly the volume lives and how to contact it. So, in the case of a failed over volume, we allow conf to be passed into client_login. If conf exists, we will login into that array. If conf does not exist, the original cinder.conf values for the backend will be used. The only time conf will exist is if the volume does not exist on the backend the driver instance was configured to.\n\nI hope that clears it up. If not please let me know.","commit_id":"fb5f58e100b57496862317cac468efb28e363825"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"7be0e8c31330e5e71af9d2a517c8af623498a527","unresolved":false,"context_lines":[{"line_number":392,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dmsg)"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"        try:"},{"line_number":395,"context_line":"            self.client \u003d self._create_client(conf, timeout\u003dNone)"},{"line_number":396,"context_line":"            wsapi_version \u003d self.client.getWsApiVersion()"},{"line_number":397,"context_line":"            self.API_VERSION \u003d wsapi_version[\u0027build\u0027]"},{"line_number":398,"context_line":"        except hpeexceptions.UnsupportedVersion as ex:"}],"source_content_type":"text/x-python","patch_set":53,"id":"7a740942_8c552ac3","line":395,"updated":"2015-12-11 18:26:04.000000000","message":"Oops, this line should not have been changed. timeout still needs to be honored. I will update this with a new patch set soon.\n\n    self.client \u003d self._create_client(conf, timeout\u003dtimeout)","commit_id":"80d58f6e6da080bf3ddd2114dd9f9f3eac3d07d4"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"e20f3ae49caf8aa55c91e997e0554ddc4dd88b0f","unresolved":false,"context_lines":[{"line_number":2812,"context_line":"                # correctly configured, and it its version matches the"},{"line_number":2813,"context_line":"                # primary arrarys version."},{"line_number":2814,"context_line":"                try:"},{"line_number":2815,"context_line":"                    cl \u003d self._create_replication_client(remote_array)"},{"line_number":2816,"context_line":"                    array_id \u003d six.text_type(cl.getStorageSystemInfo()[\u0027id\u0027])"},{"line_number":2817,"context_line":"                    remote_array[\u0027id\u0027] \u003d array_id"},{"line_number":2818,"context_line":"                    wsapi_version \u003d cl.getWsApiVersion()[\u0027build\u0027]"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a710552_61f89e7d","line":2815,"updated":"2015-12-14 19:40:06.000000000","message":"yet another call to getStorageSystemInfo() here FWIW.","commit_id":"a513670fb950e10f8a11ec469e4fc429f2247d39"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"e52bdf2b939549104dab853e9420f842144a4e2b","unresolved":false,"context_lines":[{"line_number":2911,"context_line":"            self._client_conf[\u0027hpe3par_password\u0027] \u003d conf[\u0027hpe3par_password\u0027]"},{"line_number":2912,"context_line":"            self._client_conf[\u0027san_ip\u0027] \u003d conf[\u0027san_ip\u0027]"},{"line_number":2913,"context_line":"            self._client_conf[\u0027san_login\u0027] \u003d conf[\u0027san_login\u0027]"},{"line_number":2914,"context_line":"            self._client_conf[\u0027san_password\u0027] \u003d conf[\u0027san_password\u0027]"},{"line_number":2915,"context_line":"            self._client_conf[\u0027san_ssh_port\u0027] \u003d conf[\u0027san_ssh_port\u0027]"},{"line_number":2916,"context_line":"            self._client_conf[\u0027ssh_conn_timeout\u0027] \u003d conf[\u0027ssh_conn_timeout\u0027]"},{"line_number":2917,"context_line":"            self._client_conf[\u0027san_private_key\u0027] \u003d conf[\u0027san_private_key\u0027]"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a710552_c0e703ab","line":2914,"updated":"2015-12-14 22:06:51.000000000","message":"need to change all these to conf.get(\u0027variable\u0027)","commit_id":"75f4aa33b3bd4b0add2fa88044a0b4bdc3f495ef"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"3238324628c1c62d93470098673cb60cabb958b9","unresolved":false,"context_lines":[{"line_number":281,"context_line":"                LOG.error(msg)"},{"line_number":282,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def check_rep_flags(self, options, required_flags):"},{"line_number":285,"context_line":"        for flag in required_flags:"},{"line_number":286,"context_line":"            if not options.get(flag, None):"},{"line_number":287,"context_line":"                msg \u003d _(\u0027%s is not set\u0027) % flag"}],"source_content_type":"text/x-python","patch_set":58,"id":"5a710552_9657c401","line":284,"updated":"2015-12-15 22:33:44.000000000","message":"check_replication_flags ?","commit_id":"004cca89b28552ce05f0880bcb8d9d9db893c216"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"552a86157ff617d072f2af70bc9d2b9168ebc347","unresolved":false,"context_lines":[{"line_number":281,"context_line":"                LOG.error(msg)"},{"line_number":282,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def check_rep_flags(self, options, required_flags):"},{"line_number":285,"context_line":"        for flag in required_flags:"},{"line_number":286,"context_line":"            if not options.get(flag, None):"},{"line_number":287,"context_line":"                msg \u003d _(\u0027%s is not set\u0027) % flag"}],"source_content_type":"text/x-python","patch_set":58,"id":"5a710552_590d0d3d","line":284,"in_reply_to":"5a710552_9657c401","updated":"2015-12-15 22:53:17.000000000","message":"Done","commit_id":"004cca89b28552ce05f0880bcb8d9d9db893c216"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"3238324628c1c62d93470098673cb60cabb958b9","unresolved":false,"context_lines":[{"line_number":2782,"context_line":"                # Format iscsi IPs correctly"},{"line_number":2783,"context_line":"                iscsi_ips \u003d dev.get(\u0027hpe3par_iscsi_ips\u0027)"},{"line_number":2784,"context_line":"                if iscsi_ips:"},{"line_number":2785,"context_line":"                    remote_array[\u0027hpe3par_iscsi_ips\u0027] \u003d iscsi_ips.split(\u0027 \u0027)"},{"line_number":2786,"context_line":"                # Format hpe3par_iscsi_chap_enabled as a bool"},{"line_number":2787,"context_line":"                remote_array[\u0027hpe3par_iscsi_chap_enabled\u0027] \u003d ("},{"line_number":2788,"context_line":"                    dev.get(\u0027hpe3par_iscsi_chap_enabled\u0027) \u003d\u003d \u0027True\u0027)"}],"source_content_type":"text/x-python","patch_set":58,"id":"5a710552_16f3d49f","line":2785,"updated":"2015-12-15 22:33:44.000000000","message":"so the value is separated with spaces ?\nthe cinder.conf entry is supposed to be separated with ,","commit_id":"004cca89b28552ce05f0880bcb8d9d9db893c216"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"552a86157ff617d072f2af70bc9d2b9168ebc347","unresolved":false,"context_lines":[{"line_number":2782,"context_line":"                # Format iscsi IPs correctly"},{"line_number":2783,"context_line":"                iscsi_ips \u003d dev.get(\u0027hpe3par_iscsi_ips\u0027)"},{"line_number":2784,"context_line":"                if iscsi_ips:"},{"line_number":2785,"context_line":"                    remote_array[\u0027hpe3par_iscsi_ips\u0027] \u003d iscsi_ips.split(\u0027 \u0027)"},{"line_number":2786,"context_line":"                # Format hpe3par_iscsi_chap_enabled as a bool"},{"line_number":2787,"context_line":"                remote_array[\u0027hpe3par_iscsi_chap_enabled\u0027] \u003d ("},{"line_number":2788,"context_line":"                    dev.get(\u0027hpe3par_iscsi_chap_enabled\u0027) \u003d\u003d \u0027True\u0027)"}],"source_content_type":"text/x-python","patch_set":58,"id":"5a710552_7c3d57ba","line":2785,"in_reply_to":"5a710552_16f3d49f","updated":"2015-12-15 22:53:17.000000000","message":"Unfortunately the above line:\n    replication_devices \u003d self.config.replication_device\n\nDoes not work with with commas in this way. The comma is supposed to denote the next entry, so it thinks hpe3par_iscsi_ips:1.1.1.1,2.2.2.2 is an invalid entry. \n\n\nhttps://github.com/openstack/cinder/blob/08026af17fffbf58b440ebd56fcb75d7d73b016f/cinder/volume/driver.py#L211-L220","commit_id":"004cca89b28552ce05f0880bcb8d9d9db893c216"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"3238324628c1c62d93470098673cb60cabb958b9","unresolved":false,"context_lines":[{"line_number":2917,"context_line":"                        break"},{"line_number":2918,"context_line":"        self._build_3par_config(conf)"},{"line_number":2919,"context_line":""},{"line_number":2920,"context_line":"    def _build_3par_config(self, conf\u003dNone):"},{"line_number":2921,"context_line":"        if conf:"},{"line_number":2922,"context_line":"            self._client_conf[\u0027hpe3par_username\u0027] \u003d ("},{"line_number":2923,"context_line":"                conf.get(\u0027hpe3par_username\u0027))"}],"source_content_type":"text/x-python","patch_set":58,"id":"5a710552_d9881d25","line":2920,"updated":"2015-12-15 22:33:44.000000000","message":"Can we add a quick comment block here explaining the purpose of this guy.","commit_id":"004cca89b28552ce05f0880bcb8d9d9db893c216"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"552a86157ff617d072f2af70bc9d2b9168ebc347","unresolved":false,"context_lines":[{"line_number":2917,"context_line":"                        break"},{"line_number":2918,"context_line":"        self._build_3par_config(conf)"},{"line_number":2919,"context_line":""},{"line_number":2920,"context_line":"    def _build_3par_config(self, conf\u003dNone):"},{"line_number":2921,"context_line":"        if conf:"},{"line_number":2922,"context_line":"            self._client_conf[\u0027hpe3par_username\u0027] \u003d ("},{"line_number":2923,"context_line":"                conf.get(\u0027hpe3par_username\u0027))"}],"source_content_type":"text/x-python","patch_set":58,"id":"5a710552_9c6e03c8","line":2920,"in_reply_to":"5a710552_d9881d25","updated":"2015-12-15 22:53:17.000000000","message":"Done","commit_id":"004cca89b28552ce05f0880bcb8d9d9db893c216"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"725192628bec5bdef23ac65cee244665b6db9003","unresolved":false,"context_lines":[{"line_number":284,"context_line":"    def check_replication_flags(self, options, required_flags):"},{"line_number":285,"context_line":"        for flag in required_flags:"},{"line_number":286,"context_line":"            if not options.get(flag, None):"},{"line_number":287,"context_line":"                msg \u003d _(\u0027%s is not set\u0027) % flag"},{"line_number":288,"context_line":"                LOG.error(msg)"},{"line_number":289,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":290,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"3a7e1126_32c1882f","line":287,"updated":"2015-12-16 22:31:38.000000000","message":"This message doesn\u0027t seem like it would be very useful.  Would be good to indicate that the option is required for replication.","commit_id":"4322da9cc55c8e391d2d206fdb55bc882fb7ef25"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"d48f4911ab48c2596b78d13c09aac0b756b4e4fd","unresolved":false,"context_lines":[{"line_number":284,"context_line":"    def check_replication_flags(self, options, required_flags):"},{"line_number":285,"context_line":"        for flag in required_flags:"},{"line_number":286,"context_line":"            if not options.get(flag, None):"},{"line_number":287,"context_line":"                msg \u003d _(\u0027%s is not set\u0027) % flag"},{"line_number":288,"context_line":"                LOG.error(msg)"},{"line_number":289,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":290,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"3a7e1126_80234605","line":287,"in_reply_to":"3a7e1126_32c1882f","updated":"2015-12-16 22:55:11.000000000","message":"Done","commit_id":"4322da9cc55c8e391d2d206fdb55bc882fb7ef25"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"725192628bec5bdef23ac65cee244665b6db9003","unresolved":false,"context_lines":[{"line_number":955,"context_line":"                raise exception.Invalid3PARDomain(err\u003de.get_description())"},{"line_number":956,"context_line":"            else:"},{"line_number":957,"context_line":"                raise exception.VolumeBackendAPIException("},{"line_number":958,"context_line":"                    data\u003de.get_description())"},{"line_number":959,"context_line":""},{"line_number":960,"context_line":"    def _safe_hostname(self, hostname):"},{"line_number":961,"context_line":"        \"\"\"We have to use a safe hostname length for 3PAR host names.\"\"\""}],"source_content_type":"text/x-python","patch_set":59,"id":"3a7e1126_72515062","line":958,"updated":"2015-12-16 22:31:38.000000000","message":"Was this change intended?","commit_id":"4322da9cc55c8e391d2d206fdb55bc882fb7ef25"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"d48f4911ab48c2596b78d13c09aac0b756b4e4fd","unresolved":false,"context_lines":[{"line_number":955,"context_line":"                raise exception.Invalid3PARDomain(err\u003de.get_description())"},{"line_number":956,"context_line":"            else:"},{"line_number":957,"context_line":"                raise exception.VolumeBackendAPIException("},{"line_number":958,"context_line":"                    data\u003de.get_description())"},{"line_number":959,"context_line":""},{"line_number":960,"context_line":"    def _safe_hostname(self, hostname):"},{"line_number":961,"context_line":"        \"\"\"We have to use a safe hostname length for 3PAR host names.\"\"\""}],"source_content_type":"text/x-python","patch_set":59,"id":"3a7e1126_c0106eab","line":958,"in_reply_to":"3a7e1126_72515062","updated":"2015-12-16 22:55:11.000000000","message":"Yes, there are other possible error descriptions outside of this one that we are not catching. I ran into it when dealing with bad/non-existent iSCSI ports (which happened on attach after fail-over). Now at least the error will be reported.","commit_id":"4322da9cc55c8e391d2d206fdb55bc882fb7ef25"}],"cinder/volume/drivers/hpe/hpe_3par_iscsi.py":[{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"e20f3ae49caf8aa55c91e997e0554ddc4dd88b0f","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def _login(self, volume\u003dNone, timeout\u003dNone):"},{"line_number":122,"context_line":"        common \u003d self._init_common()"},{"line_number":123,"context_line":"        conf \u003d common.get_3par_config(volume)"},{"line_number":124,"context_line":"        common.do_setup(None, conf, timeout\u003dtimeout)"},{"line_number":125,"context_line":"        # If replication is enabled and we cannot login, we do not want to"},{"line_number":126,"context_line":"        # raise an exception so a failover can still be executed."}],"source_content_type":"text/x-python","patch_set":54,"id":"5a710552_024f5893","line":123,"updated":"2015-12-14 19:40:06.000000000","message":"we should move this into common.do_setup() and just pass in the volume object.   have the common object handle creating the correct conf and store it as a instance variable, that we can later use here in initialize_iscsi_ports","commit_id":"a513670fb950e10f8a11ec469e4fc429f2247d39"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"0effadb11f98b91721dc15edf1c0d49f5be106de","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def _login(self, volume\u003dNone, timeout\u003dNone):"},{"line_number":122,"context_line":"        common \u003d self._init_common()"},{"line_number":123,"context_line":"        conf \u003d common.get_3par_config(volume)"},{"line_number":124,"context_line":"        common.do_setup(None, conf, timeout\u003dtimeout)"},{"line_number":125,"context_line":"        # If replication is enabled and we cannot login, we do not want to"},{"line_number":126,"context_line":"        # raise an exception so a failover can still be executed."}],"source_content_type":"text/x-python","patch_set":54,"id":"5a710552_6573c14e","line":123,"in_reply_to":"5a710552_024f5893","updated":"2015-12-14 21:35:01.000000000","message":"Done","commit_id":"a513670fb950e10f8a11ec469e4fc429f2247d39"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"e20f3ae49caf8aa55c91e997e0554ddc4dd88b0f","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        self.iscsi_ips \u003d {}"},{"line_number":187,"context_line":"        temp_iscsi_ip \u003d {}"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        # use the 3PAR ip_addr list for iSCSI configuration"},{"line_number":190,"context_line":"        if len(self.configuration.hpe3par_iscsi_ips) \u003e 0:"},{"line_number":191,"context_line":"            # add port values to ip_addr, if necessary"},{"line_number":192,"context_line":"            for ip_addr in self.configuration.hpe3par_iscsi_ips:"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a710552_82510865","line":189,"updated":"2015-12-14 19:40:06.000000000","message":"The hpe3par_iscsi_ips need to be in the common conf as well, because they are specific to the array we are doing an attach to.","commit_id":"a513670fb950e10f8a11ec469e4fc429f2247d39"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"0effadb11f98b91721dc15edf1c0d49f5be106de","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        self.iscsi_ips \u003d {}"},{"line_number":187,"context_line":"        temp_iscsi_ip \u003d {}"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        # use the 3PAR ip_addr list for iSCSI configuration"},{"line_number":190,"context_line":"        if len(self.configuration.hpe3par_iscsi_ips) \u003e 0:"},{"line_number":191,"context_line":"            # add port values to ip_addr, if necessary"},{"line_number":192,"context_line":"            for ip_addr in self.configuration.hpe3par_iscsi_ips:"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a710552_e586d112","line":189,"in_reply_to":"5a710552_82510865","updated":"2015-12-14 21:35:01.000000000","message":"Done","commit_id":"a513670fb950e10f8a11ec469e4fc429f2247d39"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"e20f3ae49caf8aa55c91e997e0554ddc4dd88b0f","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        # add the single value iscsi_ip_address option to the IP dictionary."},{"line_number":202,"context_line":"        # This way we can see if it\u0027s a valid iSCSI IP. If it\u0027s not valid,"},{"line_number":203,"context_line":"        # we won\u0027t use it and won\u0027t bother to report it, see below"},{"line_number":204,"context_line":"        if (self.configuration.iscsi_ip_address not in temp_iscsi_ip):"},{"line_number":205,"context_line":"            ip \u003d self.configuration.iscsi_ip_address"},{"line_number":206,"context_line":"            ip_port \u003d self.configuration.iscsi_port"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a710552_a29e8405","line":203,"updated":"2015-12-14 19:40:06.000000000","message":"same as above.","commit_id":"a513670fb950e10f8a11ec469e4fc429f2247d39"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"0effadb11f98b91721dc15edf1c0d49f5be106de","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        # add the single value iscsi_ip_address option to the IP dictionary."},{"line_number":202,"context_line":"        # This way we can see if it\u0027s a valid iSCSI IP. If it\u0027s not valid,"},{"line_number":203,"context_line":"        # we won\u0027t use it and won\u0027t bother to report it, see below"},{"line_number":204,"context_line":"        if (self.configuration.iscsi_ip_address not in temp_iscsi_ip):"},{"line_number":205,"context_line":"            ip \u003d self.configuration.iscsi_ip_address"},{"line_number":206,"context_line":"            ip_port \u003d self.configuration.iscsi_port"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a710552_857cad21","line":203,"in_reply_to":"5a710552_a29e8405","updated":"2015-12-14 21:35:01.000000000","message":"Done","commit_id":"a513670fb950e10f8a11ec469e4fc429f2247d39"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"e20f3ae49caf8aa55c91e997e0554ddc4dd88b0f","unresolved":false,"context_lines":[{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        # if the single value iscsi_ip_address option is still in the"},{"line_number":225,"context_line":"        # temp dictionary it\u0027s because it defaults to $my_ip which doesn\u0027t"},{"line_number":226,"context_line":"        # make sense in this context. So, if present, remove it and move on."},{"line_number":227,"context_line":"        if (self.configuration.iscsi_ip_address in temp_iscsi_ip):"},{"line_number":228,"context_line":"            del temp_iscsi_ip[self.configuration.iscsi_ip_address]"},{"line_number":229,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"5a710552_62897cca","line":226,"updated":"2015-12-14 19:40:06.000000000","message":"same","commit_id":"a513670fb950e10f8a11ec469e4fc429f2247d39"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"0effadb11f98b91721dc15edf1c0d49f5be106de","unresolved":false,"context_lines":[{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        # if the single value iscsi_ip_address option is still in the"},{"line_number":225,"context_line":"        # temp dictionary it\u0027s because it defaults to $my_ip which doesn\u0027t"},{"line_number":226,"context_line":"        # make sense in this context. So, if present, remove it and move on."},{"line_number":227,"context_line":"        if (self.configuration.iscsi_ip_address in temp_iscsi_ip):"},{"line_number":228,"context_line":"            del temp_iscsi_ip[self.configuration.iscsi_ip_address]"},{"line_number":229,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"5a710552_4576c53f","line":226,"in_reply_to":"5a710552_62897cca","updated":"2015-12-14 21:35:01.000000000","message":"Done","commit_id":"a513670fb950e10f8a11ec469e4fc429f2247d39"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"5eef711f2de4dd7631b6170cee81974b2364d65d","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            # If the volume has been failed over, we need to reinitialize"},{"line_number":321,"context_line":"            # iSCSI ports so they represent the new array."},{"line_number":322,"context_line":"            if volume.get(\u0027replication_status\u0027) \u003d\u003d \u0027failed-over\u0027:"},{"line_number":323,"context_line":"                self.initialize_iscsi_ports(common)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"            # we have to make sure we have a host"},{"line_number":326,"context_line":"            host, username, password \u003d self._create_host("}],"source_content_type":"text/x-python","patch_set":59,"id":"3a7e1126_7222b0bb","line":323,"range":{"start_line":323,"start_character":50,"end_line":323,"end_character":51},"updated":"2015-12-16 22:05:06.000000000","message":"This looks like after we do any failover, the self.iscsi_ips will forever be associated with the failover target array, which will cause attaches to fail on every other array.  :(","commit_id":"4322da9cc55c8e391d2d206fdb55bc882fb7ef25"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"d48f4911ab48c2596b78d13c09aac0b756b4e4fd","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            # If the volume has been failed over, we need to reinitialize"},{"line_number":321,"context_line":"            # iSCSI ports so they represent the new array."},{"line_number":322,"context_line":"            if volume.get(\u0027replication_status\u0027) \u003d\u003d \u0027failed-over\u0027:"},{"line_number":323,"context_line":"                self.initialize_iscsi_ports(common)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"            # we have to make sure we have a host"},{"line_number":326,"context_line":"            host, username, password \u003d self._create_host("}],"source_content_type":"text/x-python","patch_set":59,"id":"3a7e1126_40e23ea1","line":323,"range":{"start_line":323,"start_character":50,"end_line":323,"end_character":51},"in_reply_to":"3a7e1126_7222b0bb","updated":"2015-12-16 22:55:11.000000000","message":"Very good catch. Verified and this is correct. I have corrected this issue in the newest patch set.","commit_id":"4322da9cc55c8e391d2d206fdb55bc882fb7ef25"}],"cinder/volume/drivers/san/hp/hp_3par_common.py":[{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"420b5afe77d134ccb871d5f9a172a97d61f6cde7","unresolved":false,"context_lines":[{"line_number":2891,"context_line":"            self._do_replication_setup()"},{"line_number":2892,"context_line":"        conf \u003d None"},{"line_number":2893,"context_line":"        if volume:"},{"line_number":2894,"context_line":"            provider_location \u003d volume.get(\"provider_location\", None)"},{"line_number":2895,"context_line":"            if provider_location:"},{"line_number":2896,"context_line":"                if volume[\u0027replication_status\u0027] \u003d\u003d \u0027failed-over\u0027:"},{"line_number":2897,"context_line":"                    _, provider_location \u003d provider_location.split(\u0027:\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a29b11f_f566d2b9","line":2894,"updated":"2015-10-22 06:45:29.000000000","message":"Just volume.get(\"provider_location\") is OK, no need the second parameter \u0027None\u0027.","commit_id":"cae902d5fa64430324bcebd26646f6f08b3c0e20"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"9692e4db4d4e3bed51db82d58ac6598ff8f6692c","unresolved":false,"context_lines":[{"line_number":2891,"context_line":"            self._do_replication_setup()"},{"line_number":2892,"context_line":"        conf \u003d None"},{"line_number":2893,"context_line":"        if volume:"},{"line_number":2894,"context_line":"            provider_location \u003d volume.get(\"provider_location\", None)"},{"line_number":2895,"context_line":"            if provider_location:"},{"line_number":2896,"context_line":"                if volume[\u0027replication_status\u0027] \u003d\u003d \u0027failed-over\u0027:"},{"line_number":2897,"context_line":"                    _, provider_location \u003d provider_location.split(\u0027:\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a29b11f_8898921d","line":2894,"in_reply_to":"3a29b11f_f566d2b9","updated":"2015-10-22 15:01:51.000000000","message":"Done.","commit_id":"cae902d5fa64430324bcebd26646f6f08b3c0e20"},{"author":{"_account_id":13203,"name":"Wilson Liu","email":"295988511@qq.com","username":"Bob-OpenStack"},"change_message_id":"420b5afe77d134ccb871d5f9a172a97d61f6cde7","unresolved":false,"context_lines":[{"line_number":2893,"context_line":"        if volume:"},{"line_number":2894,"context_line":"            provider_location \u003d volume.get(\"provider_location\", None)"},{"line_number":2895,"context_line":"            if provider_location:"},{"line_number":2896,"context_line":"                if volume[\u0027replication_status\u0027] \u003d\u003d \u0027failed-over\u0027:"},{"line_number":2897,"context_line":"                    _, provider_location \u003d provider_location.split(\u0027:\u0027)"},{"line_number":2898,"context_line":""},{"line_number":2899,"context_line":"                for target in self._replication_targets:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a29b11f_15d26e28","line":2896,"updated":"2015-10-22 06:45:29.000000000","message":"Use volume.get(\u0027replication_status\u0027) is more reliable, if \u0027replication_status\u0027 is not in volume, there will be a exception raised here which is really no need.","commit_id":"cae902d5fa64430324bcebd26646f6f08b3c0e20"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"9692e4db4d4e3bed51db82d58ac6598ff8f6692c","unresolved":false,"context_lines":[{"line_number":2893,"context_line":"        if volume:"},{"line_number":2894,"context_line":"            provider_location \u003d volume.get(\"provider_location\", None)"},{"line_number":2895,"context_line":"            if provider_location:"},{"line_number":2896,"context_line":"                if volume[\u0027replication_status\u0027] \u003d\u003d \u0027failed-over\u0027:"},{"line_number":2897,"context_line":"                    _, provider_location \u003d provider_location.split(\u0027:\u0027)"},{"line_number":2898,"context_line":""},{"line_number":2899,"context_line":"                for target in self._replication_targets:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a29b11f_a89b0e17","line":2896,"in_reply_to":"3a29b11f_15d26e28","updated":"2015-10-22 15:01:51.000000000","message":"Done","commit_id":"cae902d5fa64430324bcebd26646f6f08b3c0e20"}],"releasenotes/notes/3par-v2-replication-unmanaged-13f3d6a52198a7a6.yaml":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"dada9eac118ba1ded332c16379c0c1f7eb2230ad","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Adds unmanaged v2 replication support to the"},{"line_number":4,"context_line":"    HPE 3PAR iSCSI and FC drivers."},{"line_number":5,"context_line":"features:"},{"line_number":6,"context_line":"  - Create replicated volumes on unmanaged targets."},{"line_number":7,"context_line":"  - Failover replicated volumes to an unmanaged"}],"source_content_type":"text/x-yaml","patch_set":61,"id":"3a7e1126_292fdaa2","line":4,"range":{"start_line":4,"start_character":33,"end_line":4,"end_character":34},"updated":"2015-12-17 01:46:51.000000000","message":"I don\u0027t think you should add this \"prelude\" section.  See example from Sean\u0027s release notes.  He only added a line under features.\n\nhttps://review.openstack.org/#/c/251517/5/releasenotes/notes/lefthand-consistency-groups-d73f8e418884fcc6.yaml","commit_id":"90937b3f1a91fb3e0a6a3c75a9690ca31dc8486a"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"f9a7121ea62297e3a1ff73a2e0ec46260fff41e9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Adds unmanaged v2 replication support to the"},{"line_number":4,"context_line":"    HPE 3PAR iSCSI and FC drivers."},{"line_number":5,"context_line":"features:"},{"line_number":6,"context_line":"  - Create replicated volumes on unmanaged targets."},{"line_number":7,"context_line":"  - Failover replicated volumes to an unmanaged"}],"source_content_type":"text/x-yaml","patch_set":61,"id":"3a7e1126_9519fb7b","line":4,"range":{"start_line":4,"start_character":33,"end_line":4,"end_character":34},"in_reply_to":"3a7e1126_292fdaa2","updated":"2015-12-17 16:09:22.000000000","message":"Thanks for pointing this out. I made the change in the newest patch set.","commit_id":"90937b3f1a91fb3e0a6a3c75a9690ca31dc8486a"}]}
