)]}'
{"cinder/volume/drivers/ibm/ibm_storage/ds8k_helper.py":[{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"deb1e1999150d11f13758a5a74860b12fa15a4bd","unresolved":false,"context_lines":[{"line_number":209,"context_line":"    def verify_rest_version_for_pprc_cg(self):"},{"line_number":210,"context_line":"        if \u00278.1\u0027 in self.backend[\u0027rest_version\u0027]:"},{"line_number":211,"context_line":"            raise exception.VolumeDriverException("},{"line_number":212,"context_line":"                message\u003d_(\"REST for DS8K 8.1 can not support PPRC \""},{"line_number":213,"context_line":"                          \"consistency group, please upgrade the CCL.\"))"},{"line_number":214,"context_line":"        valid_rest_version \u003d None"},{"line_number":215,"context_line":"        if (\u00275.7\u0027 in self.backend[\u0027rest_version\u0027] and"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_e48404b4","line":212,"range":{"start_line":212,"start_character":45,"end_line":212,"end_character":52},"updated":"2017-06-20 16:01:09.000000000","message":"does not","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":209,"context_line":"    def verify_rest_version_for_pprc_cg(self):"},{"line_number":210,"context_line":"        if \u00278.1\u0027 in self.backend[\u0027rest_version\u0027]:"},{"line_number":211,"context_line":"            raise exception.VolumeDriverException("},{"line_number":212,"context_line":"                message\u003d_(\"REST for DS8K 8.1 can not support PPRC \""},{"line_number":213,"context_line":"                          \"consistency group, please upgrade the CCL.\"))"},{"line_number":214,"context_line":"        valid_rest_version \u003d None"},{"line_number":215,"context_line":"        if (\u00275.7\u0027 in self.backend[\u0027rest_version\u0027] and"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_d28d3c7c","line":212,"range":{"start_line":212,"start_character":45,"end_line":212,"end_character":52},"in_reply_to":"5f201791_e48404b4","updated":"2017-06-21 02:46:12.000000000","message":"thanks Isaac, i will fix it.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"cd1c0f4b77eda19904c4bf8d1cf0e95b2832a8ee","unresolved":false,"context_lines":[{"line_number":660,"context_line":"            return ret_info"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"    def create_group(self, group):"},{"line_number":663,"context_line":"        return {\u0027status\u0027: fields.GroupStatus.AVAILABLE}"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"    def delete_group(self, group, src_luns):"},{"line_number":666,"context_line":"        volumes_model_update \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_4a985f69","line":663,"updated":"2017-06-20 16:19:33.000000000","message":"It does not look like this driver handles the generic group case when a group type is not replication group and not consistent group snapshot like the following.  Please point out where it is handled if I missed it.\n\nhttps://github.com/openstack/cinder/blob/master/cinder/volume/drivers/ibm/ibm_storage/xiv_proxy.py#L1690\n\n        # For generic group, create is executed by manager\n        raise NotImplementedError()","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"ba2cdcd87e41a0d8bf8b4b7e1ff33dfc0d6f5ae1","unresolved":false,"context_lines":[{"line_number":660,"context_line":"            return ret_info"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"    def create_group(self, group):"},{"line_number":663,"context_line":"        return {\u0027status\u0027: fields.GroupStatus.AVAILABLE}"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"    def delete_group(self, group, src_luns):"},{"line_number":666,"context_line":"        volumes_model_update \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f1d235d_978d867d","line":663,"in_reply_to":"3f1d235d_d4465c22","updated":"2017-06-29 05:14:47.000000000","message":"oh, got what you mean now, I misunderstood the purpose of the code from #L2662 to #L2668 in manage.py before. For drivers that have converted to group, they would never enter into the \u0027else\u0027 branch(#L2665), only drivers that have not converted to group will enter into it for consistency group.\n\nI will change the driver, thank you very much for your help.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ad84a711d8a3cf469b09cbcafb284538e0fd2500","unresolved":false,"context_lines":[{"line_number":660,"context_line":"            return ret_info"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"    def create_group(self, group):"},{"line_number":663,"context_line":"        return {\u0027status\u0027: fields.GroupStatus.AVAILABLE}"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"    def delete_group(self, group, src_luns):"},{"line_number":666,"context_line":"        volumes_model_update \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_95e03b28","line":663,"in_reply_to":"5f201791_1294d48a","updated":"2017-06-26 20:06:53.000000000","message":"I don\u0027t think I followed you completely.  Does d38k driver let the default implementation take over if the group type does not support consistent group snapshot?  We are trying to get all drivers to handle it in a same way and enforce the requirement of consistent_group_snapshot_enabed in group specs for cg snapshot.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":660,"context_line":"            return ret_info"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"    def create_group(self, group):"},{"line_number":663,"context_line":"        return {\u0027status\u0027: fields.GroupStatus.AVAILABLE}"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"    def delete_group(self, group, src_luns):"},{"line_number":666,"context_line":"        volumes_model_update \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_1294d48a","line":663,"in_reply_to":"5f201791_4a985f69","updated":"2017-06-21 02:46:12.000000000","message":"xyang, I don\u0027t like the default generic group implementation in base cinder, because for DS8K, it can bulk create/delete volumes which is more efficiently, I only implemented bulk delete in this driver before this driver is opened source, but not bulk create, which is in another patch that I had abandoned it because community will consider it in base cinder.\n\nanyway, ds8k driver will handle the case of generic group too.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c7d45164ad5bce7668929869e6b3cc7364e3875e","unresolved":false,"context_lines":[{"line_number":660,"context_line":"            return ret_info"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"    def create_group(self, group):"},{"line_number":663,"context_line":"        return {\u0027status\u0027: fields.GroupStatus.AVAILABLE}"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"    def delete_group(self, group, src_luns):"},{"line_number":666,"context_line":"        volumes_model_update \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_f60f5985","line":663,"in_reply_to":"5f201791_7d9b3d65","updated":"2017-06-27 14:36:57.000000000","message":"Hi jiamin, we are trying to have all drivers implement this feature in a consistent way.  So if group type supports CG snapshot, a CG will be created; otherwise, the driver should raise NotImplementedError and let the default implementation take over.  I see that xiv_proxy.py is implemented this way.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"0a485f8d23dfa307bedd4cecd31890275e3f0b33","unresolved":false,"context_lines":[{"line_number":660,"context_line":"            return ret_info"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"    def create_group(self, group):"},{"line_number":663,"context_line":"        return {\u0027status\u0027: fields.GroupStatus.AVAILABLE}"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"    def delete_group(self, group, src_luns):"},{"line_number":666,"context_line":"        volumes_model_update \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_7d9b3d65","line":663,"in_reply_to":"5f201791_95e03b28","updated":"2017-06-27 04:09:41.000000000","message":"hi xyang, i am sorry that i did not describe it clearly.\n\nDS8K driver does not let the default implementation take over if the group type does not support consistent group snapshot, because no matter for which type of group, ds8k driver can delete volumes in bulk mode, not one by one, and it is more efficiently.\n\nin all, DS8K driver will take over all group types. is it necessarily that driver should only take over group type which enable consistent group? thanks.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"39a060b42ac363d2d841752cc913ad26cf4337ee","unresolved":false,"context_lines":[{"line_number":660,"context_line":"            return ret_info"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"    def create_group(self, group):"},{"line_number":663,"context_line":"        return {\u0027status\u0027: fields.GroupStatus.AVAILABLE}"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"    def delete_group(self, group, src_luns):"},{"line_number":666,"context_line":"        volumes_model_update \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f1d235d_d4465c22","line":663,"in_reply_to":"5f201791_bd840cd4","updated":"2017-06-29 04:35:48.000000000","message":"I can\u0027t remove the handling of create_consistencygroup yet because there are still drivers not converted to use groups to support CG.  Since that is removed from your driver, why will that be a problem for you?\n\nWhat do you mean \"let the default implementation take over\" but \"create_group in manage.py still may call it, which will cause problem\"?\n\nIf driver raises NotImplementedError, create_group in manager.py should create a default generic group.  That design will remain even after all drivers have converted to use generic group to support CG.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"007fad00acf3ee20c98339853f0677928c9d5ba7","unresolved":false,"context_lines":[{"line_number":660,"context_line":"            return ret_info"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"    def create_group(self, group):"},{"line_number":663,"context_line":"        return {\u0027status\u0027: fields.GroupStatus.AVAILABLE}"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"    def delete_group(self, group, src_luns):"},{"line_number":666,"context_line":"        volumes_model_update \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_bd840cd4","line":663,"in_reply_to":"5f201791_f60f5985","updated":"2017-06-28 01:49:16.000000000","message":"Thank xyang for your information, I am fine to let the default implementation take over before DS8K totally support bulk create/delete mode. \n\nbut I still have a concern in base cinder, in driver side, create_consistencygroup has been removed, so if driver raises NotImplementedError, create_group in manage.py still may call it, which will cause problem.\n\ndo it think it is time to remove the design of default cgsnapshot type? so that base cinder doesn\u0027t need to call create_consistencygroup any more.\n\nif you plan to remove create_consistencygroup totally, please remind me, and I will change DS8K driver to let base cinder take over the job of create generic group. thanks.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"deb1e1999150d11f13758a5a74860b12fa15a4bd","unresolved":false,"context_lines":[{"line_number":877,"context_line":"        self._client.send(\u0027POST\u0027, \u0027/cs/pprcs/delete\u0027, pairData)"},{"line_number":878,"context_line":""},{"line_number":879,"context_line":"    def pause_pprc_pairs(self, pprc_pair_ids):"},{"line_number":880,"context_line":"        pairData \u003d {\u0027pprc_ids\u0027: pprc_pair_ids}"},{"line_number":881,"context_line":"        self._client.send(\u0027POST\u0027, \u0027/cs/pprcs/pause\u0027, pairData)"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"    def resume_pprc_pairs(self, pprc_pair_ids):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_a4a72c50","line":880,"range":{"start_line":880,"start_character":8,"end_line":880,"end_character":16},"updated":"2017-06-20 16:01:09.000000000","message":"pair_data","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":877,"context_line":"        self._client.send(\u0027POST\u0027, \u0027/cs/pprcs/delete\u0027, pairData)"},{"line_number":878,"context_line":""},{"line_number":879,"context_line":"    def pause_pprc_pairs(self, pprc_pair_ids):"},{"line_number":880,"context_line":"        pairData \u003d {\u0027pprc_ids\u0027: pprc_pair_ids}"},{"line_number":881,"context_line":"        self._client.send(\u0027POST\u0027, \u0027/cs/pprcs/pause\u0027, pairData)"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"    def resume_pprc_pairs(self, pprc_pair_ids):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_92ed8427","line":880,"range":{"start_line":880,"start_character":8,"end_line":880,"end_character":16},"in_reply_to":"5f201791_a4a72c50","updated":"2017-06-21 02:46:12.000000000","message":"thanks","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"deb1e1999150d11f13758a5a74860b12fa15a4bd","unresolved":false,"context_lines":[{"line_number":878,"context_line":""},{"line_number":879,"context_line":"    def pause_pprc_pairs(self, pprc_pair_ids):"},{"line_number":880,"context_line":"        pairData \u003d {\u0027pprc_ids\u0027: pprc_pair_ids}"},{"line_number":881,"context_line":"        self._client.send(\u0027POST\u0027, \u0027/cs/pprcs/pause\u0027, pairData)"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"    def resume_pprc_pairs(self, pprc_pair_ids):"},{"line_number":884,"context_line":"        pairData \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_446cd807","line":881,"range":{"start_line":881,"start_character":53,"end_line":881,"end_character":61},"updated":"2017-06-20 16:01:09.000000000","message":"pair_data","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":878,"context_line":""},{"line_number":879,"context_line":"    def pause_pprc_pairs(self, pprc_pair_ids):"},{"line_number":880,"context_line":"        pairData \u003d {\u0027pprc_ids\u0027: pprc_pair_ids}"},{"line_number":881,"context_line":"        self._client.send(\u0027POST\u0027, \u0027/cs/pprcs/pause\u0027, pairData)"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"    def resume_pprc_pairs(self, pprc_pair_ids):"},{"line_number":884,"context_line":"        pairData \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_72f2e808","line":881,"range":{"start_line":881,"start_character":53,"end_line":881,"end_character":61},"in_reply_to":"5f201791_446cd807","updated":"2017-06-21 02:46:12.000000000","message":"thanks","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"deb1e1999150d11f13758a5a74860b12fa15a4bd","unresolved":false,"context_lines":[{"line_number":881,"context_line":"        self._client.send(\u0027POST\u0027, \u0027/cs/pprcs/pause\u0027, pairData)"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"    def resume_pprc_pairs(self, pprc_pair_ids):"},{"line_number":884,"context_line":"        pairData \u003d {"},{"line_number":885,"context_line":"            \u0027pprc_ids\u0027: pprc_pair_ids,"},{"line_number":886,"context_line":"            \u0027type\u0027: \u0027metro_mirror\u0027,"},{"line_number":887,"context_line":"            \u0027options\u0027: [\u0027permit_space_efficient_target\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_c47fc8a9","line":884,"range":{"start_line":884,"start_character":8,"end_line":884,"end_character":16},"updated":"2017-06-20 16:01:09.000000000","message":"pair_data","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":881,"context_line":"        self._client.send(\u0027POST\u0027, \u0027/cs/pprcs/pause\u0027, pairData)"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"    def resume_pprc_pairs(self, pprc_pair_ids):"},{"line_number":884,"context_line":"        pairData \u003d {"},{"line_number":885,"context_line":"            \u0027pprc_ids\u0027: pprc_pair_ids,"},{"line_number":886,"context_line":"            \u0027type\u0027: \u0027metro_mirror\u0027,"},{"line_number":887,"context_line":"            \u0027options\u0027: [\u0027permit_space_efficient_target\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_52f7ecf6","line":884,"range":{"start_line":884,"start_character":8,"end_line":884,"end_character":16},"in_reply_to":"5f201791_c47fc8a9","updated":"2017-06-21 02:46:12.000000000","message":"thanks","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"deb1e1999150d11f13758a5a74860b12fa15a4bd","unresolved":false,"context_lines":[{"line_number":887,"context_line":"            \u0027options\u0027: [\u0027permit_space_efficient_target\u0027,"},{"line_number":888,"context_line":"                        \u0027initial_copy_out_of_sync\u0027]"},{"line_number":889,"context_line":"        }"},{"line_number":890,"context_line":"        self._client.send(\u0027POST\u0027, \u0027/cs/pprcs/resume\u0027, pairData)"},{"line_number":891,"context_line":""},{"line_number":892,"context_line":""},{"line_number":893,"context_line":"class DS8KReplicationSourceHelper(DS8KCommonHelper):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_244afc7f","line":890,"range":{"start_line":890,"start_character":54,"end_line":890,"end_character":62},"updated":"2017-06-20 16:01:09.000000000","message":"pair_data","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":887,"context_line":"            \u0027options\u0027: [\u0027permit_space_efficient_target\u0027,"},{"line_number":888,"context_line":"                        \u0027initial_copy_out_of_sync\u0027]"},{"line_number":889,"context_line":"        }"},{"line_number":890,"context_line":"        self._client.send(\u0027POST\u0027, \u0027/cs/pprcs/resume\u0027, pairData)"},{"line_number":891,"context_line":""},{"line_number":892,"context_line":""},{"line_number":893,"context_line":"class DS8KReplicationSourceHelper(DS8KCommonHelper):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_32dc7073","line":890,"range":{"start_line":890,"start_character":54,"end_line":890,"end_character":62},"in_reply_to":"5f201791_244afc7f","updated":"2017-06-21 02:46:12.000000000","message":"thanks","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"}],"cinder/volume/drivers/ibm/ibm_storage/ds8k_proxy.py":[{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"deb1e1999150d11f13758a5a74860b12fa15a4bd","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    .. code-block:: none"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        2.1.0 - Added support for specify pool and lss, also improve the code."},{"line_number":136,"context_line":"        2.1.1 - Adding support for replication consistency group."},{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    VERSION \u003d \"2.1.1\""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_cf6241d9","line":136,"range":{"start_line":136,"start_character":8,"end_line":136,"end_character":13},"updated":"2017-06-20 16:01:09.000000000","message":"if this is going to Pike, this will still be 2.1.0","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"b1540c3a092c6a7388aee1aca663be60418f9f87","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    .. code-block:: none"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        2.1.0 - Added support for specify pool and lss, also improve the code."},{"line_number":136,"context_line":"        2.1.1 - Adding support for replication consistency group."},{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    VERSION \u003d \"2.1.1\""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_c0d79d23","line":136,"range":{"start_line":136,"start_character":8,"end_line":136,"end_character":13},"in_reply_to":"5f201791_7240a808","updated":"2017-06-21 08:32:19.000000000","message":"The last digit is used for fixes that we backport to previous versions.\nFor example suppose you need to backport something to ocata release.\nThe driver version in Ocata is 2.0.0.\nThen, when the fix is merged in release/Ocata, the driver version would be  2.0.1","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"3218076f5c3f9646404fda52aa57cf6c1a3e7329","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    .. code-block:: none"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        2.1.0 - Added support for specify pool and lss, also improve the code."},{"line_number":136,"context_line":"        2.1.1 - Adding support for replication consistency group."},{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    VERSION \u003d \"2.1.1\""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_c0667d52","line":136,"range":{"start_line":136,"start_character":8,"end_line":136,"end_character":13},"in_reply_to":"5f201791_c0d79d23","updated":"2017-06-21 08:44:35.000000000","message":"Thanks Isaac, I think this rule is not proper for class in DS8K driver, because nearly for any new features I will need to update this version. but these features will not be back ported to previous version.\n\nBTW, this version is only for class, not for driver, maybe I use 2.x.x confuses you. and maybe I versioning it from 1.0.0 is better. but i only want to emphasize it is in Pike cycle.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    .. code-block:: none"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        2.1.0 - Added support for specify pool and lss, also improve the code."},{"line_number":136,"context_line":"        2.1.1 - Adding support for replication consistency group."},{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    VERSION \u003d \"2.1.1\""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_7240a808","line":136,"range":{"start_line":136,"start_character":8,"end_line":136,"end_character":13},"in_reply_to":"5f201791_cf6241d9","updated":"2017-06-21 02:46:12.000000000","message":"Thanks Isaac, I think the last digit is for feature is better, what is your opinion?","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"deb1e1999150d11f13758a5a74860b12fa15a4bd","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        2.1.1 - Adding support for replication consistency group."},{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    VERSION \u003d \"2.1.1\""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    class FakeLun(object):"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_6f9fadb4","line":139,"range":{"start_line":139,"start_character":4,"end_line":139,"end_character":20},"updated":"2017-06-20 16:01:09.000000000","message":"see above","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        2.1.1 - Adding support for replication consistency group."},{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    VERSION \u003d \"2.1.1\""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    class FakeLun(object):"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_f25398e1","line":139,"range":{"start_line":139,"start_character":4,"end_line":139,"end_character":20},"in_reply_to":"5f201791_6f9fadb4","updated":"2017-06-21 02:46:12.000000000","message":"check the reply above.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"deb1e1999150d11f13758a5a74860b12fa15a4bd","unresolved":false,"context_lines":[{"line_number":239,"context_line":"                    \u0027source\u0027: (None, self.ds_id[0:2]),"},{"line_number":240,"context_line":"                    \u0027target\u0027: (None, self.replica_ds_id[0:2])"},{"line_number":241,"context_line":"                }"},{"line_number":242,"context_line":"                # Don\u0027t use self.replication_status to judge the volume has"},{"line_number":243,"context_line":"                # been failed over or not, because when user fail over a"},{"line_number":244,"context_line":"                # group, replicaiton_status of the volume in group is"},{"line_number":245,"context_line":"                # failing over."}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_4f7d116d","line":242,"range":{"start_line":242,"start_character":61,"end_line":242,"end_character":64},"updated":"2017-06-20 16:01:09.000000000","message":"if the.....","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":239,"context_line":"                    \u0027source\u0027: (None, self.ds_id[0:2]),"},{"line_number":240,"context_line":"                    \u0027target\u0027: (None, self.replica_ds_id[0:2])"},{"line_number":241,"context_line":"                }"},{"line_number":242,"context_line":"                # Don\u0027t use self.replication_status to judge the volume has"},{"line_number":243,"context_line":"                # been failed over or not, because when user fail over a"},{"line_number":244,"context_line":"                # group, replicaiton_status of the volume in group is"},{"line_number":245,"context_line":"                # failing over."}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_525ecce6","line":242,"range":{"start_line":242,"start_character":61,"end_line":242,"end_character":64},"in_reply_to":"5f201791_4f7d116d","updated":"2017-06-21 02:46:12.000000000","message":"thanks","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"deb1e1999150d11f13758a5a74860b12fa15a4bd","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                    \u0027target\u0027: (None, self.replica_ds_id[0:2])"},{"line_number":241,"context_line":"                }"},{"line_number":242,"context_line":"                # Don\u0027t use self.replication_status to judge the volume has"},{"line_number":243,"context_line":"                # been failed over or not, because when user fail over a"},{"line_number":244,"context_line":"                # group, replicaiton_status of the volume in group is"},{"line_number":245,"context_line":"                # failing over."},{"line_number":246,"context_line":"                self.failed_over \u003d (True if \u0027default\u0027 in"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_cfe5a13a","line":243,"range":{"start_line":243,"start_character":61,"end_line":243,"end_character":70},"updated":"2017-06-20 16:01:09.000000000","message":"chooses to fail over....","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"deb1e1999150d11f13758a5a74860b12fa15a4bd","unresolved":false,"context_lines":[{"line_number":241,"context_line":"                }"},{"line_number":242,"context_line":"                # Don\u0027t use self.replication_status to judge the volume has"},{"line_number":243,"context_line":"                # been failed over or not, because when user fail over a"},{"line_number":244,"context_line":"                # group, replicaiton_status of the volume in group is"},{"line_number":245,"context_line":"                # failing over."},{"line_number":246,"context_line":"                self.failed_over \u003d (True if \u0027default\u0027 in"},{"line_number":247,"context_line":"                                    self.replication_driver_data.keys()"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_6fd68d52","line":244,"range":{"start_line":244,"start_character":47,"end_line":244,"end_character":50},"updated":"2017-06-20 16:01:09.000000000","message":"each","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":241,"context_line":"                }"},{"line_number":242,"context_line":"                # Don\u0027t use self.replication_status to judge the volume has"},{"line_number":243,"context_line":"                # been failed over or not, because when user fail over a"},{"line_number":244,"context_line":"                # group, replicaiton_status of the volume in group is"},{"line_number":245,"context_line":"                # failing over."},{"line_number":246,"context_line":"                self.failed_over \u003d (True if \u0027default\u0027 in"},{"line_number":247,"context_line":"                                    self.replication_driver_data.keys()"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_12705472","line":244,"range":{"start_line":244,"start_character":47,"end_line":244,"end_character":50},"in_reply_to":"5f201791_6fd68d52","updated":"2017-06-21 02:46:12.000000000","message":"thanks","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"cd1c0f4b77eda19904c4bf8d1cf0e95b2832a8ee","unresolved":false,"context_lines":[{"line_number":335,"context_line":"    def __init__(self, group, is_snapshot\u003dFalse):"},{"line_number":336,"context_line":"        self.id \u003d group.id"},{"line_number":337,"context_line":"        self.host \u003d group.host"},{"line_number":338,"context_line":"        self.consisgroup_enabled \u003d utils.is_group_a_cg_snapshot_type(group)"},{"line_number":339,"context_line":"        self.group_replication_enabled \u003d ("},{"line_number":340,"context_line":"            utils.is_group_a_non_consistent_replication_group_type(group))"},{"line_number":341,"context_line":"        self.consisgroup_replication_enabled \u003d ("}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_4f0d118f","line":338,"range":{"start_line":338,"start_character":13,"end_line":338,"end_character":32},"updated":"2017-06-20 16:19:33.000000000","message":"To avoid confusion with the CG replication, can this be changed to something like consisgroup_snapshot_enabled?","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":335,"context_line":"    def __init__(self, group, is_snapshot\u003dFalse):"},{"line_number":336,"context_line":"        self.id \u003d group.id"},{"line_number":337,"context_line":"        self.host \u003d group.host"},{"line_number":338,"context_line":"        self.consisgroup_enabled \u003d utils.is_group_a_cg_snapshot_type(group)"},{"line_number":339,"context_line":"        self.group_replication_enabled \u003d ("},{"line_number":340,"context_line":"            utils.is_group_a_non_consistent_replication_group_type(group))"},{"line_number":341,"context_line":"        self.consisgroup_replication_enabled \u003d ("}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_b20400c8","line":338,"range":{"start_line":338,"start_character":13,"end_line":338,"end_character":32},"in_reply_to":"5f201791_4f0d118f","updated":"2017-06-21 02:46:12.000000000","message":"thanks xyang for your suggestion, i will fix it in the new patch.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"deb1e1999150d11f13758a5a74860b12fa15a4bd","unresolved":false,"context_lines":[{"line_number":340,"context_line":"            utils.is_group_a_non_consistent_replication_group_type(group))"},{"line_number":341,"context_line":"        self.consisgroup_replication_enabled \u003d ("},{"line_number":342,"context_line":"            utils.is_group_a_consistent_replication_group_type(group))"},{"line_number":343,"context_line":"        if is_snapshot:"},{"line_number":344,"context_line":"            self.snapshots \u003d group.snapshots"},{"line_number":345,"context_line":"        else:"},{"line_number":346,"context_line":"            self.failed_over \u003d ("},{"line_number":347,"context_line":"                group.replication_status \u003d\u003d"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_cfc80176","line":344,"range":{"start_line":343,"start_character":0,"end_line":344,"end_character":44},"updated":"2017-06-20 16:01:09.000000000","message":"Here you create the group dynamically based on the input.\nYou can create a new object: GroupSnapshot which derive from Group and set this attribute there. Then you don\u0027t have to ask in the future if it has the attribute \"snapshots\"","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":340,"context_line":"            utils.is_group_a_non_consistent_replication_group_type(group))"},{"line_number":341,"context_line":"        self.consisgroup_replication_enabled \u003d ("},{"line_number":342,"context_line":"            utils.is_group_a_consistent_replication_group_type(group))"},{"line_number":343,"context_line":"        if is_snapshot:"},{"line_number":344,"context_line":"            self.snapshots \u003d group.snapshots"},{"line_number":345,"context_line":"        else:"},{"line_number":346,"context_line":"            self.failed_over \u003d ("},{"line_number":347,"context_line":"                group.replication_status \u003d\u003d"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_92d7c424","line":344,"range":{"start_line":343,"start_character":0,"end_line":344,"end_character":44},"in_reply_to":"5f201791_cfc80176","updated":"2017-06-21 02:46:12.000000000","message":"no, I don\u0027t want to create GroupSnapshot because it will almost like the Group. so it may need to inherit from Group.\nBTW, i want to keep it consistent with Lun too which is for volume and snapshot.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"cd1c0f4b77eda19904c4bf8d1cf0e95b2832a8ee","unresolved":false,"context_lines":[{"line_number":349,"context_line":"            # not all cinder driver APIs have used version object."},{"line_number":350,"context_line":"            try:"},{"line_number":351,"context_line":"                self.volumes \u003d group.volumes"},{"line_number":352,"context_line":"            except exc.DetachedInstanceError:"},{"line_number":353,"context_line":"                self.volumes \u003d []"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_afe02598","line":352,"range":{"start_line":352,"start_character":19,"end_line":352,"end_character":44},"updated":"2017-06-20 16:19:33.000000000","message":"When referencing \"group.volumes\", how can you get DetachedInstanceError?  Shouldn\u0027t this exception have something to do with OVO?","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9489af2fbfa0924ef4a469e21e9dd83f08d51617","unresolved":false,"context_lines":[{"line_number":349,"context_line":"            # not all cinder driver APIs have used version object."},{"line_number":350,"context_line":"            try:"},{"line_number":351,"context_line":"                self.volumes \u003d group.volumes"},{"line_number":352,"context_line":"            except exc.DetachedInstanceError:"},{"line_number":353,"context_line":"                self.volumes \u003d []"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f1d235d_52fa3842","line":352,"range":{"start_line":352,"start_character":19,"end_line":352,"end_character":44},"in_reply_to":"5f201791_3227d015","updated":"2017-06-30 04:09:40.000000000","message":"Please revisit the group interfaces in the driver.  create_group creates an empty group and it won\u0027t even know what volumes will be in it yet, so volumes won\u0027t be needed there.  create_group_from_src has volumes passed in as a parameter.  So there\u0027s no need to get volumes from group.volumes.  Same with delete_group.  What other cases do you need group.volumes?","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":349,"context_line":"            # not all cinder driver APIs have used version object."},{"line_number":350,"context_line":"            try:"},{"line_number":351,"context_line":"                self.volumes \u003d group.volumes"},{"line_number":352,"context_line":"            except exc.DetachedInstanceError:"},{"line_number":353,"context_line":"                self.volumes \u003d []"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_3227d015","line":352,"range":{"start_line":352,"start_character":19,"end_line":352,"end_character":44},"in_reply_to":"5f201791_afe02598","updated":"2017-06-21 02:46:12.000000000","message":"this one is a little tricky, \n\nthe root cause is that the group here may be gotten from volume.group, and this exception is caused by volume.group.volumes. \n\n:), it is a loop here, I know it is unreasonable but in initialize_connection and terminate_connection, it needs to find out whether the volume belongs to group or not and whether it has been failed over so that driver can find the correct client to finish the attach/detach operations. \n\nin initialize_connection/teminate_connection, it doesn\u0027t need to access group.volumes, but for other APIs, such as create_group, create_group_from_src etc. they need to access group.volumes.\n\nin all, this problem is caused by the Group class here wants to cover all cases driver handles the volume group.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"deb1e1999150d11f13758a5a74860b12fa15a4bd","unresolved":false,"context_lines":[{"line_number":349,"context_line":"            # not all cinder driver APIs have used version object."},{"line_number":350,"context_line":"            try:"},{"line_number":351,"context_line":"                self.volumes \u003d group.volumes"},{"line_number":352,"context_line":"            except exc.DetachedInstanceError:"},{"line_number":353,"context_line":"                self.volumes \u003d []"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"class DS8KProxy(proxy.IBMStorageProxy):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_ef905d51","line":353,"range":{"start_line":352,"start_character":0,"end_line":353,"end_character":33},"updated":"2017-06-20 16:01:09.000000000","message":"How you get to this exception?","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":349,"context_line":"            # not all cinder driver APIs have used version object."},{"line_number":350,"context_line":"            try:"},{"line_number":351,"context_line":"                self.volumes \u003d group.volumes"},{"line_number":352,"context_line":"            except exc.DetachedInstanceError:"},{"line_number":353,"context_line":"                self.volumes \u003d []"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"class DS8KProxy(proxy.IBMStorageProxy):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_7282e8ca","line":353,"range":{"start_line":352,"start_character":0,"end_line":353,"end_character":33},"in_reply_to":"5f201791_ef905d51","updated":"2017-06-21 02:46:12.000000000","message":"please check the comment above.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"cd1c0f4b77eda19904c4bf8d1cf0e95b2832a8ee","unresolved":false,"context_lines":[{"line_number":966,"context_line":"        if (grp.group_replication_enabled or"},{"line_number":967,"context_line":"           grp.consisgroup_replication_enabled):"},{"line_number":968,"context_line":"            for vol_type_id in group.volume_type_ids:"},{"line_number":969,"context_line":"                spec \u003d ("},{"line_number":970,"context_line":"                    volume_types.get_volume_type_extra_specs(vol_type_id))"},{"line_number":971,"context_line":"                replication_type \u003d utils.is_replicated_spec(spec)"},{"line_number":972,"context_line":"                if not replication_type:"},{"line_number":973,"context_line":"                    raise exception.VolumeDriverException("}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_2aa9a3de","line":970,"range":{"start_line":969,"start_character":0,"end_line":970,"end_character":74},"updated":"2017-06-20 16:19:33.000000000","message":"You should have group.volume_types which is a list of VolumeType objects.  Each VolumeType object has extra_specs dict.  So there\u0027s no need to call volume_types.get_volume_type_extra_specs for each volume type id in the db.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":966,"context_line":"        if (grp.group_replication_enabled or"},{"line_number":967,"context_line":"           grp.consisgroup_replication_enabled):"},{"line_number":968,"context_line":"            for vol_type_id in group.volume_type_ids:"},{"line_number":969,"context_line":"                spec \u003d ("},{"line_number":970,"context_line":"                    volume_types.get_volume_type_extra_specs(vol_type_id))"},{"line_number":971,"context_line":"                replication_type \u003d utils.is_replicated_spec(spec)"},{"line_number":972,"context_line":"                if not replication_type:"},{"line_number":973,"context_line":"                    raise exception.VolumeDriverException("}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_52600c33","line":970,"range":{"start_line":969,"start_character":0,"end_line":970,"end_character":74},"in_reply_to":"5f201791_2aa9a3de","updated":"2017-06-21 02:46:12.000000000","message":"Thanks xyang, i will fix it in the new patch.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"cd1c0f4b77eda19904c4bf8d1cf0e95b2832a8ee","unresolved":false,"context_lines":[{"line_number":982,"context_line":"            model_update[\u0027replication_status\u0027] \u003d ("},{"line_number":983,"context_line":"                fields.ReplicationStatus.ENABLED)"},{"line_number":984,"context_line":"        model_update.update(self._helper.create_group(group))"},{"line_number":985,"context_line":"        return model_update"},{"line_number":986,"context_line":""},{"line_number":987,"context_line":"    @proxy.logger"},{"line_number":988,"context_line":"    def delete_group(self, ctxt, group, volumes):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_6ae1dbd0","line":985,"updated":"2017-06-20 16:19:33.000000000","message":"Please see my comment in ds8k_helper.py.  It does not look like this driver handles the case of the generic group type (a group that is not replication group and does not support consistent group snapshot).  This applies to all group and group snapshot functions.\n\nhttps://github.com/openstack/cinder/blob/master/cinder/volume/drivers/ibm/ibm_storage/xiv_proxy.py#L1690","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":982,"context_line":"            model_update[\u0027replication_status\u0027] \u003d ("},{"line_number":983,"context_line":"                fields.ReplicationStatus.ENABLED)"},{"line_number":984,"context_line":"        model_update.update(self._helper.create_group(group))"},{"line_number":985,"context_line":"        return model_update"},{"line_number":986,"context_line":""},{"line_number":987,"context_line":"    @proxy.logger"},{"line_number":988,"context_line":"    def delete_group(self, ctxt, group, volumes):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_b2c64016","line":985,"in_reply_to":"5f201791_6ae1dbd0","updated":"2017-06-21 02:46:12.000000000","message":"please check my reply in ds8k_helper.py, thanks.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"d4bdd3796e2fc31d97dbfb7d3f35f1369459fa3a","unresolved":false,"context_lines":[{"line_number":993,"context_line":"            return self._delete_group_with_lock(group, luns)"},{"line_number":994,"context_line":"        elif (grp.group_replication_enabled or"},{"line_number":995,"context_line":"                grp.consisgroup_replication_enabled):"},{"line_number":996,"context_line":"            if grp.failed_over:"},{"line_number":997,"context_line":"                raise exception.VolumeDriverException("},{"line_number":998,"context_line":"                    message\u003d_(\u0027Group %s has been failed over, it does \u0027"},{"line_number":999,"context_line":"                              \u0027not support to delete it\u0027) % grp.id)"},{"line_number":1000,"context_line":"            else:"},{"line_number":1001,"context_line":"                for lun in luns:"},{"line_number":1002,"context_line":"                    self._replication.delete_replica(lun)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_a95025d6","line":999,"range":{"start_line":996,"start_character":0,"end_line":999,"end_character":67},"updated":"2017-06-20 14:55:26.000000000","message":"These 3 lines are duplicated few times in this file.\nI suggest you switch this attribute to a function. this would be something like:\ndef failed_over(raise_exp_if_true\u003dFalse)\n.....","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":993,"context_line":"            return self._delete_group_with_lock(group, luns)"},{"line_number":994,"context_line":"        elif (grp.group_replication_enabled or"},{"line_number":995,"context_line":"                grp.consisgroup_replication_enabled):"},{"line_number":996,"context_line":"            if grp.failed_over:"},{"line_number":997,"context_line":"                raise exception.VolumeDriverException("},{"line_number":998,"context_line":"                    message\u003d_(\u0027Group %s has been failed over, it does \u0027"},{"line_number":999,"context_line":"                              \u0027not support to delete it\u0027) % grp.id)"},{"line_number":1000,"context_line":"            else:"},{"line_number":1001,"context_line":"                for lun in luns:"},{"line_number":1002,"context_line":"                    self._replication.delete_replica(lun)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_f2e398a3","line":999,"range":{"start_line":996,"start_character":0,"end_line":999,"end_character":67},"in_reply_to":"5f201791_a95025d6","updated":"2017-06-21 02:46:12.000000000","message":"thanks Isaac, i will use _assert.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"deb1e1999150d11f13758a5a74860b12fa15a4bd","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"                grp, add_volumes)"},{"line_number":1086,"context_line":"        remove_volumes_update \u003d []"},{"line_number":1087,"context_line":"        if remove_volumes:"},{"line_number":1088,"context_line":"            remove_volumes_update \u003d self._remove_volumes_in_consisgroup("},{"line_number":1089,"context_line":"                grp, add_volumes, remove_volumes)"},{"line_number":1090,"context_line":"        return None, add_volumes_update, remove_volumes_update"},{"line_number":1091,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_cf47e1bc","line":1088,"range":{"start_line":1088,"start_character":57,"end_line":1088,"end_character":59},"updated":"2017-06-20 16:01:09.000000000","message":"from","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"                grp, add_volumes)"},{"line_number":1086,"context_line":"        remove_volumes_update \u003d []"},{"line_number":1087,"context_line":"        if remove_volumes:"},{"line_number":1088,"context_line":"            remove_volumes_update \u003d self._remove_volumes_in_consisgroup("},{"line_number":1089,"context_line":"                grp, add_volumes, remove_volumes)"},{"line_number":1090,"context_line":"        return None, add_volumes_update, remove_volumes_update"},{"line_number":1091,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_92c224e9","line":1088,"range":{"start_line":1088,"start_character":57,"end_line":1088,"end_character":59},"in_reply_to":"5f201791_cf47e1bc","updated":"2017-06-21 02:46:12.000000000","message":"thanks, i will change it.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"deb1e1999150d11f13758a5a74860b12fa15a4bd","unresolved":false,"context_lines":[{"line_number":1102,"context_line":""},{"line_number":1103,"context_line":"    @proxy.logger"},{"line_number":1104,"context_line":"    @coordination.synchronized(\u0027{self.prefix}-consistency-group\u0027)"},{"line_number":1105,"context_line":"    def _remove_volumes_in_consisgroup(self, grp, add_volumes, remove_volumes):"},{"line_number":1106,"context_line":"        remove_volumes_update \u003d []"},{"line_number":1107,"context_line":"        new_remove_luns, old_remove_luns \u003d ("},{"line_number":1108,"context_line":"            self._clone_lun_for_consisgroup(remove_volumes))"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_4f82b1ca","line":1105,"range":{"start_line":1105,"start_character":24,"end_line":1105,"end_character":26},"updated":"2017-06-20 16:01:09.000000000","message":"from","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":1102,"context_line":""},{"line_number":1103,"context_line":"    @proxy.logger"},{"line_number":1104,"context_line":"    @coordination.synchronized(\u0027{self.prefix}-consistency-group\u0027)"},{"line_number":1105,"context_line":"    def _remove_volumes_in_consisgroup(self, grp, add_volumes, remove_volumes):"},{"line_number":1106,"context_line":"        remove_volumes_update \u003d []"},{"line_number":1107,"context_line":"        new_remove_luns, old_remove_luns \u003d ("},{"line_number":1108,"context_line":"            self._clone_lun_for_consisgroup(remove_volumes))"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_52bc8c68","line":1105,"range":{"start_line":1105,"start_character":24,"end_line":1105,"end_character":26},"in_reply_to":"5f201791_4f82b1ca","updated":"2017-06-21 02:46:12.000000000","message":"thanks, i will change it.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"deb1e1999150d11f13758a5a74860b12fa15a4bd","unresolved":false,"context_lines":[{"line_number":1133,"context_line":"        return new_luns, old_luns"},{"line_number":1134,"context_line":""},{"line_number":1135,"context_line":"    @proxy.logger"},{"line_number":1136,"context_line":"    def _remove_record_in_consisgroup_cache(self, group_id):"},{"line_number":1137,"context_line":"        lss_pairs \u003d self.consisgroup_cache.get(group_id)"},{"line_number":1138,"context_line":"        if lss_pairs:"},{"line_number":1139,"context_line":"            LOG.debug(\u0027Consistecy Group %(id)s owns LSS %(lss)s in the cache.\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_4f5bd186","line":1136,"range":{"start_line":1136,"start_character":23,"end_line":1136,"end_character":25},"updated":"2017-06-20 16:01:09.000000000","message":"from","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"03cb06b926efaea1f38fe0026026665df3999042","unresolved":false,"context_lines":[{"line_number":1133,"context_line":"        return new_luns, old_luns"},{"line_number":1134,"context_line":""},{"line_number":1135,"context_line":"    @proxy.logger"},{"line_number":1136,"context_line":"    def _remove_record_in_consisgroup_cache(self, group_id):"},{"line_number":1137,"context_line":"        lss_pairs \u003d self.consisgroup_cache.get(group_id)"},{"line_number":1138,"context_line":"        if lss_pairs:"},{"line_number":1139,"context_line":"            LOG.debug(\u0027Consistecy Group %(id)s owns LSS %(lss)s in the cache.\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f201791_32b11091","line":1136,"range":{"start_line":1136,"start_character":23,"end_line":1136,"end_character":25},"in_reply_to":"5f201791_4f5bd186","updated":"2017-06-21 02:46:12.000000000","message":"thanks, i will change it.","commit_id":"75b134d6d029df28a064ab030c1ad7ea7c5619d0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"104fb51842f04c379bac58ee55292264b2ca6e8c","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                }"},{"line_number":243,"context_line":"                # Don\u0027t use self.replication_status to judge if volume has"},{"line_number":244,"context_line":"                # been failed over or not, because when user fail over a"},{"line_number":245,"context_line":"                # group, replicaiton_status of each volume in group is"},{"line_number":246,"context_line":"                # failing over."},{"line_number":247,"context_line":"                self.failed_over \u003d (True if \u0027default\u0027 in"},{"line_number":248,"context_line":"                                    self.replication_driver_data.keys()"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_32b8dcc6","line":245,"range":{"start_line":245,"start_character":25,"end_line":245,"end_character":36},"updated":"2017-06-30 04:09:55.000000000","message":"replication","commit_id":"90e8c7a4514f4cd9416f6cf4d83913a6f2f25612"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"5ad2d9bb547ee6c21d7118b716ed695fdb9dae2b","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                }"},{"line_number":243,"context_line":"                # Don\u0027t use self.replication_status to judge if volume has"},{"line_number":244,"context_line":"                # been failed over or not, because when user fail over a"},{"line_number":245,"context_line":"                # group, replicaiton_status of each volume in group is"},{"line_number":246,"context_line":"                # failing over."},{"line_number":247,"context_line":"                self.failed_over \u003d (True if \u0027default\u0027 in"},{"line_number":248,"context_line":"                                    self.replication_driver_data.keys()"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_2d8f6124","line":245,"range":{"start_line":245,"start_character":25,"end_line":245,"end_character":36},"in_reply_to":"3f1d235d_32b8dcc6","updated":"2017-06-30 04:38:22.000000000","message":"thanks, i will fix it.","commit_id":"90e8c7a4514f4cd9416f6cf4d83913a6f2f25612"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"104fb51842f04c379bac58ee55292264b2ca6e8c","unresolved":false,"context_lines":[{"line_number":351,"context_line":"            # not all cinder driver APIs have used version object."},{"line_number":352,"context_line":"            try:"},{"line_number":353,"context_line":"                self.volumes \u003d group.volumes"},{"line_number":354,"context_line":"            except exc.DetachedInstanceError:"},{"line_number":355,"context_line":"                self.volumes \u003d []"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_52c23835","line":354,"range":{"start_line":354,"start_character":19,"end_line":354,"end_character":44},"updated":"2017-06-30 04:09:55.000000000","message":"I read your explanation in patch set 9, but still couldn\u0027t understand how can such an exception be raised by group.volumes.  Also I added more comments in patch set 9.  You don\u0027t need to get volumes from the group object in create_group and create_group_from_src.  create_group won\u0027t even have volumes lets.  create_group_from_src and delete_group already have volumes passed in as a parameter so no need to retrieve volumes from the group.  If you really need this, please add some detailed comments here to explain in what situation you\u0027ll get this exception.","commit_id":"90e8c7a4514f4cd9416f6cf4d83913a6f2f25612"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"5ad2d9bb547ee6c21d7118b716ed695fdb9dae2b","unresolved":false,"context_lines":[{"line_number":351,"context_line":"            # not all cinder driver APIs have used version object."},{"line_number":352,"context_line":"            try:"},{"line_number":353,"context_line":"                self.volumes \u003d group.volumes"},{"line_number":354,"context_line":"            except exc.DetachedInstanceError:"},{"line_number":355,"context_line":"                self.volumes \u003d []"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_ed5ba984","line":354,"range":{"start_line":354,"start_character":19,"end_line":354,"end_character":44},"in_reply_to":"3f1d235d_52c23835","updated":"2017-06-30 04:38:22.000000000","message":":), it is a long story, but first of all, you are right that group relevant APIs don\u0027t need it. but not create_volume,\nplease refer to #L221.\n\nplease be patient. In create_volume, driver needs to find whether a volume is in a group or not, and if it is  consistency group, then it needs to find how many LSSs(DS8K\u0027s concept) have been used by the group, but group doesn\u0027t have metadata field, so driver needs to get information about LSSs from volumes in the group.","commit_id":"90e8c7a4514f4cd9416f6cf4d83913a6f2f25612"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"104fb51842f04c379bac58ee55292264b2ca6e8c","unresolved":false,"context_lines":[{"line_number":444,"context_line":"                sum(p[\u0027capavail\u0027] for p in storage_pools.values())),"},{"line_number":445,"context_line":"            \"reserved_percentage\": self.configuration.reserved_percentage,"},{"line_number":446,"context_line":"            \"consistent_group_snapshot_enabled\": True,"},{"line_number":447,"context_line":"            \"group_replication_enabled\": True,"},{"line_number":448,"context_line":"            \"consistent_group_replication_enabled\": True,"},{"line_number":449,"context_line":"            \"multiattach\": False"},{"line_number":450,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_4d6a9d80","line":447,"range":{"start_line":447,"start_character":12,"end_line":447,"end_character":46},"updated":"2017-06-30 04:09:55.000000000","message":"It does not look like you have any special code handling a replication group that is not consistent, so this capability is not needed.  This capability is for some backend that supports group replication without the guarantee of consistency.","commit_id":"90e8c7a4514f4cd9416f6cf4d83913a6f2f25612"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"5ad2d9bb547ee6c21d7118b716ed695fdb9dae2b","unresolved":false,"context_lines":[{"line_number":444,"context_line":"                sum(p[\u0027capavail\u0027] for p in storage_pools.values())),"},{"line_number":445,"context_line":"            \"reserved_percentage\": self.configuration.reserved_percentage,"},{"line_number":446,"context_line":"            \"consistent_group_snapshot_enabled\": True,"},{"line_number":447,"context_line":"            \"group_replication_enabled\": True,"},{"line_number":448,"context_line":"            \"consistent_group_replication_enabled\": True,"},{"line_number":449,"context_line":"            \"multiattach\": False"},{"line_number":450,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_2df08167","line":447,"range":{"start_line":447,"start_character":12,"end_line":447,"end_character":46},"in_reply_to":"3f1d235d_4d6a9d80","updated":"2017-06-30 04:38:22.000000000","message":"thanks xyang, please refer to #L965, driver needs to check whether volume_types in replication group have enabled replication or not. if driver raise unimplemented error for replication group without cg, base cinder doesn\u0027t check the volume_types in the group.","commit_id":"90e8c7a4514f4cd9416f6cf4d83913a6f2f25612"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"104fb51842f04c379bac58ee55292264b2ca6e8c","unresolved":false,"context_lines":[{"line_number":986,"context_line":"                    fields.ReplicationStatus.ENABLED)"},{"line_number":987,"context_line":"            model_update.update(self._helper.create_group(group))"},{"line_number":988,"context_line":"            return model_update"},{"line_number":989,"context_line":"        else:"},{"line_number":990,"context_line":"            raise NotImplementedError()"},{"line_number":991,"context_line":""},{"line_number":992,"context_line":"    @proxy.logger"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_ad401137","line":989,"updated":"2017-06-30 04:09:55.000000000","message":"grp.group_replication_enabled falls into the else block here.  group replication needs to be handled by the driver.  The default implementation can only create a group of volumes and take snapshot of each volume in the group.  The default implementation does not handle replication.\n\nIf this driver does not do anything with group_replication, it should be removed from the capabilities.","commit_id":"90e8c7a4514f4cd9416f6cf4d83913a6f2f25612"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"5ad2d9bb547ee6c21d7118b716ed695fdb9dae2b","unresolved":false,"context_lines":[{"line_number":986,"context_line":"                    fields.ReplicationStatus.ENABLED)"},{"line_number":987,"context_line":"            model_update.update(self._helper.create_group(group))"},{"line_number":988,"context_line":"            return model_update"},{"line_number":989,"context_line":"        else:"},{"line_number":990,"context_line":"            raise NotImplementedError()"},{"line_number":991,"context_line":""},{"line_number":992,"context_line":"    @proxy.logger"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_ad8811c6","line":989,"in_reply_to":"3f1d235d_ad401137","updated":"2017-06-30 04:38:22.000000000","message":"thanks xyang, if volume_tpyes in replication group have enabled replication, default implementation can take over the job for DS8K, so driver only need to make sure volume_types in replication group have enabled replication.","commit_id":"90e8c7a4514f4cd9416f6cf4d83913a6f2f25612"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"603c1f36e1690fb0a76e5d565da30a44ffa98007","unresolved":false,"context_lines":[{"line_number":350,"context_line":"                fields.ReplicationStatus.FAILED_OVER)"},{"line_number":351,"context_line":"            # not all cinder driver APIs have used versioned object,"},{"line_number":352,"context_line":"            # and create_volume needs to check volumes in the group,"},{"line_number":353,"context_line":"            # so get it from volume.group object."},{"line_number":354,"context_line":"            try:"},{"line_number":355,"context_line":"                self.volumes \u003d group.volumes"},{"line_number":356,"context_line":"            except exc.DetachedInstanceError:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_5b747e35","line":353,"updated":"2017-06-30 17:25:50.000000000","message":"Please specifically explain when you\u0027ll get this exception \"exc.DetachedInstanceError\" so future reviewers won\u0027t treat this as an error.","commit_id":"f1c7d63744b5e8284f39381452fd8aaa61c119c9"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"0cc43027db17ce70bacd3cc5edc681ccfac3bacd","unresolved":false,"context_lines":[{"line_number":350,"context_line":"                fields.ReplicationStatus.FAILED_OVER)"},{"line_number":351,"context_line":"            # not all cinder driver APIs have used versioned object,"},{"line_number":352,"context_line":"            # and create_volume needs to check volumes in the group,"},{"line_number":353,"context_line":"            # so get it from volume.group object."},{"line_number":354,"context_line":"            try:"},{"line_number":355,"context_line":"                self.volumes \u003d group.volumes"},{"line_number":356,"context_line":"            except exc.DetachedInstanceError:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_76ae2899","line":353,"in_reply_to":"3f1d235d_5b747e35","updated":"2017-07-01 00:20:20.000000000","message":"thanks for your suggestion.","commit_id":"f1c7d63744b5e8284f39381452fd8aaa61c119c9"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"83f6f5d9cd8544025adf1d57b7f59df06defa861","unresolved":false,"context_lines":[{"line_number":350,"context_line":"                fields.ReplicationStatus.FAILED_OVER)"},{"line_number":351,"context_line":"            # not all cinder driver APIs have used versioned object,"},{"line_number":352,"context_line":"            # and create_volume needs to check volumes in the group,"},{"line_number":353,"context_line":"            # so get it from volume.group object."},{"line_number":354,"context_line":"            try:"},{"line_number":355,"context_line":"                self.volumes \u003d group.volumes"},{"line_number":356,"context_line":"            except exc.DetachedInstanceError:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_e2d5c8b8","line":353,"in_reply_to":"3f1d235d_76ae2899","updated":"2017-07-03 02:37:15.000000000","message":"I remove this exception because this morning i verify it again, and don\u0027t find this exception any more. thanks.","commit_id":"f1c7d63744b5e8284f39381452fd8aaa61c119c9"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"603c1f36e1690fb0a76e5d565da30a44ffa98007","unresolved":false,"context_lines":[{"line_number":988,"context_line":"                    fields.ReplicationStatus.ENABLED)"},{"line_number":989,"context_line":"            model_update.update(self._helper.create_group(group))"},{"line_number":990,"context_line":"            return model_update"},{"line_number":991,"context_line":"        else:"},{"line_number":992,"context_line":"            raise NotImplementedError()"},{"line_number":993,"context_line":""},{"line_number":994,"context_line":"    @proxy.logger"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_fbb10ae3","line":991,"updated":"2017-06-30 17:25:50.000000000","message":"Can you add some comments here so future code maintainers and reviewers can easily follow this?\n\n# NOTE(jiamin): If grp.group_replication_enabled is True, the default implementation will handle the creation of the group and the driver will make sure each volume in the group is replicated.","commit_id":"f1c7d63744b5e8284f39381452fd8aaa61c119c9"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"0cc43027db17ce70bacd3cc5edc681ccfac3bacd","unresolved":false,"context_lines":[{"line_number":988,"context_line":"                    fields.ReplicationStatus.ENABLED)"},{"line_number":989,"context_line":"            model_update.update(self._helper.create_group(group))"},{"line_number":990,"context_line":"            return model_update"},{"line_number":991,"context_line":"        else:"},{"line_number":992,"context_line":"            raise NotImplementedError()"},{"line_number":993,"context_line":""},{"line_number":994,"context_line":"    @proxy.logger"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_16ca546c","line":991,"in_reply_to":"3f1d235d_fbb10ae3","updated":"2017-07-01 00:20:20.000000000","message":"Thanks xyang, your suggestion is great, because only DS8K guys know that DS8K supports replication consistency group and replication group at the same time, and default implementation can take over the replication group .\n\nI will add a note in self._helper.create_group too, because for DS8K, there is no group entity, so that other developers can know why it just returns the replication_status.","commit_id":"f1c7d63744b5e8284f39381452fd8aaa61c119c9"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"84c91c88899161d391a5dbf2801e353db21e4c6b","unresolved":false,"context_lines":[{"line_number":986,"context_line":"        else:"},{"line_number":987,"context_line":"            # NOTE(jiamin): If grp.group_replication_enabled is True, the"},{"line_number":988,"context_line":"            # default implementation will handle the creation of the group"},{"line_number":989,"context_line":"            # and driver just makes sure volume types in group is replicated."},{"line_number":990,"context_line":"            raise NotImplementedError()"},{"line_number":991,"context_line":""},{"line_number":992,"context_line":"    @proxy.logger"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_b8ddbc15","line":989,"range":{"start_line":989,"start_character":63,"end_line":989,"end_character":65},"updated":"2017-07-03 07:58:45.000000000","message":"are","commit_id":"7c4802236a708dd7a2509fa4bbe8b9f922832542"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"cc9d1912b2382d274bdacdbf841b445ed74c4e17","unresolved":false,"context_lines":[{"line_number":986,"context_line":"        else:"},{"line_number":987,"context_line":"            # NOTE(jiamin): If grp.group_replication_enabled is True, the"},{"line_number":988,"context_line":"            # default implementation will handle the creation of the group"},{"line_number":989,"context_line":"            # and driver just makes sure volume types in group is replicated."},{"line_number":990,"context_line":"            raise NotImplementedError()"},{"line_number":991,"context_line":""},{"line_number":992,"context_line":"    @proxy.logger"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_ce455245","line":989,"range":{"start_line":989,"start_character":63,"end_line":989,"end_character":65},"in_reply_to":"3f1d235d_b8ddbc15","updated":"2017-07-03 08:29:56.000000000","message":"Thanks Isaac, I will fix it in next patch set.","commit_id":"7c4802236a708dd7a2509fa4bbe8b9f922832542"}],"cinder/volume/drivers/ibm/ibm_storage/ds8k_replication.py":[{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"f4a0f12374605679a8ab10f35352b1f072996c37","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            return PPRC_PATH_NOT_EXIST, None"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        # get the paths whose port pairs have been set in configuration file."},{"line_number":166,"context_line":"        expected_port_pairs \u003d [(port[\u0027source_port_id\u0027],"},{"line_number":167,"context_line":"                                port[\u0027target_port_id\u0027]) for port in"},{"line_number":168,"context_line":"                               self._target_helper.backend[\u0027port_pairs\u0027]]"},{"line_number":169,"context_line":"        for path in paths[:]:"},{"line_number":170,"context_line":"            port_pairs \u003d [(p[\u0027source_port_id\u0027], p[\u0027target_port_id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"df140735_e7c1a030","line":167,"range":{"start_line":166,"start_character":55,"end_line":167,"end_character":56},"updated":"2017-05-29 07:54:40.000000000","message":"no need for a newline here","commit_id":"c56f73065bde919c652d55ba13e6cae6403c6b7a"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"37aa9756967be5aa22937166c4a03296dbdb774c","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            return PPRC_PATH_NOT_EXIST, None"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        # get the paths whose port pairs have been set in configuration file."},{"line_number":166,"context_line":"        expected_port_pairs \u003d [(port[\u0027source_port_id\u0027],"},{"line_number":167,"context_line":"                                port[\u0027target_port_id\u0027]) for port in"},{"line_number":168,"context_line":"                               self._target_helper.backend[\u0027port_pairs\u0027]]"},{"line_number":169,"context_line":"        for path in paths[:]:"},{"line_number":170,"context_line":"            port_pairs \u003d [(p[\u0027source_port_id\u0027], p[\u0027target_port_id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"df140735_d0227952","line":167,"range":{"start_line":166,"start_character":55,"end_line":167,"end_character":56},"in_reply_to":"df140735_e7c1a030","updated":"2017-06-01 08:04:27.000000000","message":"Thanks Tovin, I change it in the new patch.","commit_id":"c56f73065bde919c652d55ba13e6cae6403c6b7a"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"104fb51842f04c379bac58ee55292264b2ca6e8c","unresolved":false,"context_lines":[{"line_number":583,"context_line":"            self._target_helper.change_lun(backend[\u0027vol_hex_id\u0027], param)"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"    def delete_pprc_pairs(self, lun):"},{"line_number":586,"context_line":"            self._mm_manager.delete_pprc_pairs(lun)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def create_pprc_pairs(self, lun):"},{"line_number":589,"context_line":"            self._mm_manager.create_pprc_pairs(lun)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_927a1022","line":586,"range":{"start_line":586,"start_character":8,"end_line":586,"end_character":12},"updated":"2017-06-30 04:09:55.000000000","message":"Why adding extra indents?","commit_id":"90e8c7a4514f4cd9416f6cf4d83913a6f2f25612"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"5ad2d9bb547ee6c21d7118b716ed695fdb9dae2b","unresolved":false,"context_lines":[{"line_number":583,"context_line":"            self._target_helper.change_lun(backend[\u0027vol_hex_id\u0027], param)"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"    def delete_pprc_pairs(self, lun):"},{"line_number":586,"context_line":"            self._mm_manager.delete_pprc_pairs(lun)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def create_pprc_pairs(self, lun):"},{"line_number":589,"context_line":"            self._mm_manager.create_pprc_pairs(lun)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_8dae752c","line":586,"range":{"start_line":586,"start_character":8,"end_line":586,"end_character":12},"in_reply_to":"3f1d235d_927a1022","updated":"2017-06-30 04:38:22.000000000","message":"oh, I will fix it. thank you very much.","commit_id":"90e8c7a4514f4cd9416f6cf4d83913a6f2f25612"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"104fb51842f04c379bac58ee55292264b2ca6e8c","unresolved":false,"context_lines":[{"line_number":586,"context_line":"            self._mm_manager.delete_pprc_pairs(lun)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def create_pprc_pairs(self, lun):"},{"line_number":589,"context_line":"            self._mm_manager.create_pprc_pairs(lun)"},{"line_number":590,"context_line":""},{"line_number":591,"context_line":"    def start_host_pprc_failover(self, luns, backend_id):"},{"line_number":592,"context_line":"        self._mm_manager.do_pprc_failover(luns)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_7277743c","line":589,"range":{"start_line":589,"start_character":8,"end_line":589,"end_character":12},"updated":"2017-06-30 04:09:55.000000000","message":"Here too.","commit_id":"90e8c7a4514f4cd9416f6cf4d83913a6f2f25612"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"5ad2d9bb547ee6c21d7118b716ed695fdb9dae2b","unresolved":false,"context_lines":[{"line_number":586,"context_line":"            self._mm_manager.delete_pprc_pairs(lun)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def create_pprc_pairs(self, lun):"},{"line_number":589,"context_line":"            self._mm_manager.create_pprc_pairs(lun)"},{"line_number":590,"context_line":""},{"line_number":591,"context_line":"    def start_host_pprc_failover(self, luns, backend_id):"},{"line_number":592,"context_line":"        self._mm_manager.do_pprc_failover(luns)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_4da85d1e","line":589,"range":{"start_line":589,"start_character":8,"end_line":589,"end_character":12},"in_reply_to":"3f1d235d_7277743c","updated":"2017-06-30 04:38:22.000000000","message":"thank you very much.","commit_id":"90e8c7a4514f4cd9416f6cf4d83913a6f2f25612"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"84c91c88899161d391a5dbf2801e353db21e4c6b","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def check_physical_links(self):"},{"line_number":50,"context_line":"        ports \u003d self._source_helper.get_physical_links("},{"line_number":51,"context_line":"            self._target_helper.backend[\u0027storage_wwnn\u0027])"},{"line_number":52,"context_line":"        if not ports:"},{"line_number":53,"context_line":"            raise exception.VolumeDriverException("},{"line_number":54,"context_line":"                message\u003d((_(\"%(tgt)s is not connected to %(src)s!\") % {"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_b84dbc73","line":51,"range":{"start_line":51,"start_character":12,"end_line":51,"end_character":55},"updated":"2017-07-03 07:58:45.000000000","message":"Why you need to pass data member to a member function?\nCan\u0027t get_physical_linkes(....) access self?","commit_id":"7c4802236a708dd7a2509fa4bbe8b9f922832542"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"cc9d1912b2382d274bdacdbf841b445ed74c4e17","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def check_physical_links(self):"},{"line_number":50,"context_line":"        ports \u003d self._source_helper.get_physical_links("},{"line_number":51,"context_line":"            self._target_helper.backend[\u0027storage_wwnn\u0027])"},{"line_number":52,"context_line":"        if not ports:"},{"line_number":53,"context_line":"            raise exception.VolumeDriverException("},{"line_number":54,"context_line":"                message\u003d((_(\"%(tgt)s is not connected to %(src)s!\") % {"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_ee912e9b","line":51,"range":{"start_line":51,"start_character":12,"end_line":51,"end_character":55},"in_reply_to":"3f1d235d_b84dbc73","updated":"2017-07-03 08:29:56.000000000","message":"source_helper only manages primary backend, it doesn\u0027t know the message of secondary backend. :), it is _source_helper and  _target_helper here, not the same class.","commit_id":"7c4802236a708dd7a2509fa4bbe8b9f922832542"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"84c91c88899161d391a5dbf2801e353db21e4c6b","unresolved":false,"context_lines":[{"line_number":605,"context_line":""},{"line_number":606,"context_line":"    def _get_sample_luns(self, luns):"},{"line_number":607,"context_line":"        # choose sample lun according to position."},{"line_number":608,"context_line":"        sample_luns \u003d []"},{"line_number":609,"context_line":"        positions \u003d set()"},{"line_number":610,"context_line":"        for lun in luns:"},{"line_number":611,"context_line":"            position \u003d (lun.pool_lss_pair[\u0027source\u0027][1],"},{"line_number":612,"context_line":"                        lun.pool_lss_pair[\u0027target\u0027][1])"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_353c15c7","line":609,"range":{"start_line":608,"start_character":0,"end_line":609,"end_character":25},"updated":"2017-07-03 07:58:45.000000000","message":"why you need both \"set\" and \"list\" you can simply do all the actions on the set and simply convert it to list when you return","commit_id":"7c4802236a708dd7a2509fa4bbe8b9f922832542"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"cc9d1912b2382d274bdacdbf841b445ed74c4e17","unresolved":false,"context_lines":[{"line_number":605,"context_line":""},{"line_number":606,"context_line":"    def _get_sample_luns(self, luns):"},{"line_number":607,"context_line":"        # choose sample lun according to position."},{"line_number":608,"context_line":"        sample_luns \u003d []"},{"line_number":609,"context_line":"        positions \u003d set()"},{"line_number":610,"context_line":"        for lun in luns:"},{"line_number":611,"context_line":"            position \u003d (lun.pool_lss_pair[\u0027source\u0027][1],"},{"line_number":612,"context_line":"                        lun.pool_lss_pair[\u0027target\u0027][1])"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_ee212efd","line":609,"range":{"start_line":608,"start_character":0,"end_line":609,"end_character":25},"in_reply_to":"3f1d235d_353c15c7","updated":"2017-07-03 08:29:56.000000000","message":"both of them are list is fine here. I will change it in next patch.","commit_id":"7c4802236a708dd7a2509fa4bbe8b9f922832542"},{"author":{"_account_id":13047,"name":"Isaac Beckman","email":"beckmani@gmail.com","username":"isaacb"},"change_message_id":"84c91c88899161d391a5dbf2801e353db21e4c6b","unresolved":false,"context_lines":[{"line_number":637,"context_line":"        LOG.debug(\"Failback host ends, backend id is %s.\", backend_id)"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"    @proxy.logger"},{"line_number":640,"context_line":"    def start_group_pprc_failback(self, luns, backend_id):"},{"line_number":641,"context_line":"        # NOTE: unlike failover host, after group is failed over,"},{"line_number":642,"context_line":"        # source and target clients are not swapped."},{"line_number":643,"context_line":"        LOG.debug(\"Failback group starts, backend id is %s.\", backend_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_f891f49a","line":640,"range":{"start_line":640,"start_character":8,"end_line":640,"end_character":14},"updated":"2017-07-03 07:58:45.000000000","message":"Why you need the \"start\" prefix?\nYou actually do failback here. So why don\u0027t call it simply:\n\"group_pprc_failback\"\nI initially thought that the failback only start here but you need to call other functions to complete it.","commit_id":"7c4802236a708dd7a2509fa4bbe8b9f922832542"},{"author":{"_account_id":17564,"name":"jiamin","email":"shljia@cn.ibm.com","username":"jiamin"},"change_message_id":"cc9d1912b2382d274bdacdbf841b445ed74c4e17","unresolved":false,"context_lines":[{"line_number":637,"context_line":"        LOG.debug(\"Failback host ends, backend id is %s.\", backend_id)"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"    @proxy.logger"},{"line_number":640,"context_line":"    def start_group_pprc_failback(self, luns, backend_id):"},{"line_number":641,"context_line":"        # NOTE: unlike failover host, after group is failed over,"},{"line_number":642,"context_line":"        # source and target clients are not swapped."},{"line_number":643,"context_line":"        LOG.debug(\"Failback group starts, backend id is %s.\", backend_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_c95e6c11","line":640,"range":{"start_line":640,"start_character":8,"end_line":640,"end_character":14},"in_reply_to":"3f1d235d_f891f49a","updated":"2017-07-03 08:29:56.000000000","message":"it started with \u0027start\u0027 is to keep it consistent with start_host_pprc_failback which has a lot of operation.\n\ncalling start_group_pprc_failover here is because it is just the same as start_group_pprc_failback.\n\nBTW, it is better to read start_host_pprc_failover start_host_pprc_failback, start_group_pprc_failover and start_group_pprc_failback at the same time, so that it is easy\nto understand their differences and why I keep them consistent with each other.","commit_id":"7c4802236a708dd7a2509fa4bbe8b9f922832542"}]}
