)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"dc0bfb5d91f20dfe979bf010a0358e7fd726e496","unresolved":false,"context_lines":[{"line_number":11,"context_line":"I wanted to get up to get feedback on and to help"},{"line_number":12,"context_line":"clarify some of the questions that have come up in the"},{"line_number":13,"context_line":"spec."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I406390e4d5f3c9947df1c4f2de68821e0fd7f75b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"1a4dcd0f_2de7cf47","line":14,"updated":"2015-08-13 21:36:47.000000000","message":"Can you please add a link to your blueprint here?\n\nimplements blueprint replication-v2","commit_id":"482a0bfdd47349474b13e0be1dcfbb283fac515d"}],"cinder/api/contrib/admin_actions.py":[{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"d53c34ef7ad7da943a252f4595cde4ad09fc3f7f","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        \"\"\"Failover a replicating volume to it\u0027s secondary"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"        Admin only method, used to force a fail-over to"},{"line_number":374,"context_line":"        a replication target. Optional secondary param to"},{"line_number":375,"context_line":"        indicate what device to promote in case of multiple"},{"line_number":376,"context_line":"        replication targets."},{"line_number":377,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_fcd06855","line":374,"updated":"2015-08-19 02:39:33.000000000","message":"Wrong comment here. I think it should be list the targets or something.","commit_id":"ba013614a47a583fc7ac5418aa060702bb2ed2c7"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4bc75a14f8f4cc06e5ed06169c694725e142537b","unresolved":false,"context_lines":[{"line_number":314,"context_line":"        return webob.Response(status_int\u003d202)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    @wsgi.action(\u0027os-enable_replication\u0027)"},{"line_number":317,"context_line":"    def _enable_replication(self, req, id, body):"},{"line_number":318,"context_line":"        \"\"\"Enable/Re-enable replication on replciation capable volume."},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        Admin only method, used primarily for cases like disable/re-enable"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_3898f077","line":317,"updated":"2015-08-20 01:17:31.000000000","message":"Just found that these actions are under BackupAdminController (See line 279).  They should be moved under VolumeAdminController (line 118-256).","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"81c8f6f3df2e4f240c7cd049f3b28a303d8ec2db","unresolved":false,"context_lines":[{"line_number":351,"context_line":"    def _failover_replication(self, req, id, body):"},{"line_number":352,"context_line":"        \"\"\"Failover a replicating volume to it\u0027s secondary"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"        Admin only method, used to force a fail-over to"},{"line_number":355,"context_line":"        a replication target. Optional secondary param to"},{"line_number":356,"context_line":"        indicate what device to promote in case of multiple"},{"line_number":357,"context_line":"        replication targets."},{"line_number":358,"context_line":"        \"\"\""},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_6a8a1c1d","line":357,"range":{"start_line":354,"start_character":8,"end_line":357,"end_character":28},"updated":"2015-08-19 18:42:19.000000000","message":"Is the optional secondary param still a thing?","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"2f6deca92ffa617fcfaf2f84fdec98750a09b5b1","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        Admin only method, used to force a fail-over to"},{"line_number":355,"context_line":"        a replication target. Optional secondary param to"},{"line_number":356,"context_line":"        indicate what device to promote in case of multiple"},{"line_number":357,"context_line":"        replication targets."},{"line_number":358,"context_line":"        \"\"\""},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_b2cdd832","line":357,"in_reply_to":"fa1b9901_6a8a1c1d","updated":"2015-08-20 16:28:53.000000000","message":"Yeah","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9934449a07952f3fdc97b4f0fe6f954e914e2080","unresolved":false,"context_lines":[{"line_number":363,"context_line":"            volume \u003d self._get(context, id)"},{"line_number":364,"context_line":"        except exception.VolumeNotFound as e:"},{"line_number":365,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.msg)"},{"line_number":366,"context_line":"        self.volume_api.failover_replication(context, volume)"},{"line_number":367,"context_line":"        return webob.Response(status_int\u003d202)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    @wsgi.action(\u0027os-list_replication_targets\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_132b8d95","line":366,"updated":"2015-08-20 02:07:35.000000000","message":"volume_api.failover_replication has another parameter secondary\u003dNone, but nothing is passed in here.","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"2f6deca92ffa617fcfaf2f84fdec98750a09b5b1","unresolved":false,"context_lines":[{"line_number":363,"context_line":"            volume \u003d self._get(context, id)"},{"line_number":364,"context_line":"        except exception.VolumeNotFound as e:"},{"line_number":365,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.msg)"},{"line_number":366,"context_line":"        self.volume_api.failover_replication(context, volume)"},{"line_number":367,"context_line":"        return webob.Response(status_int\u003d202)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    @wsgi.action(\u0027os-list_replication_targets\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_52d0fcc8","line":366,"in_reply_to":"fa1b9901_132b8d95","updated":"2015-08-20 16:28:53.000000000","message":"Done","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"c66b253ab3578ad23e0ba4efa901dacfdf81592a","unresolved":false,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":380,"context_line":"        self.authorize(context, \u0027list_replication-targets\u0027)"},{"line_number":381,"context_line":"        self.volume_api.get_replication_targets(context, host)"},{"line_number":382,"context_line":"        return webob.Response(status_int\u003d202)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_f8536337","line":381,"updated":"2015-08-19 20:42:27.000000000","message":"I believe that in the volume API the function is list_replication_targets and it takes context and host. In the driver it is get_replication_targets and takes just context.","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"2f6deca92ffa617fcfaf2f84fdec98750a09b5b1","unresolved":false,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":380,"context_line":"        self.authorize(context, \u0027list_replication-targets\u0027)"},{"line_number":381,"context_line":"        self.volume_api.get_replication_targets(context, host)"},{"line_number":382,"context_line":"        return webob.Response(status_int\u003d202)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_92f1b46d","line":381,"in_reply_to":"fa1b9901_f8536337","updated":"2015-08-20 16:28:53.000000000","message":"Right, in the driver you already \"are\" the host :)","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"81c8f6f3df2e4f240c7cd049f3b28a303d8ec2db","unresolved":false,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":380,"context_line":"        self.authorize(context, \u0027list_replication-targets\u0027)"},{"line_number":381,"context_line":"        self.volume_api.get_replication_targets(context, host)"},{"line_number":382,"context_line":"        return webob.Response(status_int\u003d202)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"class Admin_actions(extensions.ExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_6a2d3cfd","line":382,"range":{"start_line":381,"start_character":8,"end_line":382,"end_character":45},"updated":"2015-08-19 18:42:19.000000000","message":"I\u0027m still learning how the api code works, so this might be a dumb question... but don\u0027t we need to actually return the replication targets with our response? For this kind of api I would have expected back some json showing the replication targets and 200.","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"2f6deca92ffa617fcfaf2f84fdec98750a09b5b1","unresolved":false,"context_lines":[{"line_number":379,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":380,"context_line":"        self.authorize(context, \u0027list_replication-targets\u0027)"},{"line_number":381,"context_line":"        self.volume_api.get_replication_targets(context, host)"},{"line_number":382,"context_line":"        return webob.Response(status_int\u003d202)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"class Admin_actions(extensions.ExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_9298d41d","line":382,"in_reply_to":"fa1b9901_6a2d3cfd","updated":"2015-08-20 16:28:53.000000000","message":"hehe... yeah :)","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"bae6196009fa52a9c5b18b6a8731dddb7763e54a","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        return webob.Response(status_int\u003d202)"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    @wsgi.action(\u0027os-list_replication_targets\u0027)"},{"line_number":313,"context_line":"    def _list_replication_targets(self, req, host, body):"},{"line_number":314,"context_line":"        \"\"\"Show replication targets for the specified host."},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        Admin only method, used to display configured"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa1b9901_886c1809","line":313,"updated":"2015-08-20 20:14:21.000000000","message":"I don\u0027t know how to invoke this action.  It seems that all the actions are for a volume, but this action doesn\u0027t have a volume id.  If this doesn\u0027t need a volume id, it seems like this one should be in a separate controller, not the admin action (like the one for get_pools).","commit_id":"4b7cb6d8d9c913abc300713c54a577b77e2865fd"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"17af3d03064a1e7a3622d240aeea843285a458e6","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        # specified backend), but priority here is for"},{"line_number":324,"context_line":"        # a volume as it\u0027s likely to be more useful."},{"line_number":325,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":326,"context_line":"        self.authorize(context, \u0027list_replication-targets\u0027)"},{"line_number":327,"context_line":"        try:"},{"line_number":328,"context_line":"            volume \u003d self._get(context, id)"},{"line_number":329,"context_line":"        except exception.VolumeNotFound as e:"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_00166aa7","line":326,"updated":"2015-08-21 16:29:59.000000000","message":"Should be all underscore:\n\ns/list_replication-targets/list_replication_targets","commit_id":"3ce72ce2427937728ef5b97ef2d057854ee57e71"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"07f2ce5cfab1227166c0454519ad8a04d3f4b7d9","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        # specified backend), but priority here is for"},{"line_number":324,"context_line":"        # a volume as it\u0027s likely to be more useful."},{"line_number":325,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":326,"context_line":"        self.authorize(context, \u0027list_replication-targets\u0027)"},{"line_number":327,"context_line":"        try:"},{"line_number":328,"context_line":"            volume \u003d self._get(context, id)"},{"line_number":329,"context_line":"        except exception.VolumeNotFound as e:"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_234858cc","line":326,"in_reply_to":"fa1b9901_00166aa7","updated":"2015-08-21 16:45:36.000000000","message":"bahhhh","commit_id":"3ce72ce2427937728ef5b97ef2d057854ee57e71"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b326ac944fe3f9d297c6cd598dde28809c14efaa","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            volume \u003d self._get(context, id)"},{"line_number":329,"context_line":"        except exception.VolumeNotFound as e:"},{"line_number":330,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.msg)"},{"line_number":331,"context_line":"        return self.volume_api.list_replication_targets(context, volume)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"class SnapshotAdminController(AdminController):"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_a933e961","line":331,"updated":"2015-08-21 17:34:15.000000000","message":"I\u0027m getting a 500 error here when it returns.\n\nI think this should be something like:\n\ntargets \u003d self.volume_api.list_replication_targets(context, volume)\n\nreturn self._view_builder.targets(req, pools)\n\nAnd you need to define targets in a ViewBuilder under api/view.","commit_id":"d65438d5845696eb3fd79cd2e1edecfec2d1bcdd"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"fb962e0f91e40bf1a36422eb11860348299ddaf4","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            volume \u003d self._get(context, id)"},{"line_number":329,"context_line":"        except exception.VolumeNotFound as e:"},{"line_number":330,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.msg)"},{"line_number":331,"context_line":"        return self.volume_api.list_replication_targets(context, volume)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"class SnapshotAdminController(AdminController):"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_deca7c6e","line":331,"in_reply_to":"fa1b9901_411f81b7","updated":"2015-08-22 15:19:06.000000000","message":"I just converted to format to a proper dictionary from the driver response, works on my side let me know if this seems ok for you at least for now.","commit_id":"d65438d5845696eb3fd79cd2e1edecfec2d1bcdd"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b6846677f7331a8b2bf395244481dacbbb3f0e59","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            volume \u003d self._get(context, id)"},{"line_number":329,"context_line":"        except exception.VolumeNotFound as e:"},{"line_number":330,"context_line":"            raise exc.HTTPNotFound(explanation\u003de.msg)"},{"line_number":331,"context_line":"        return self.volume_api.list_replication_targets(context, volume)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"class SnapshotAdminController(AdminController):"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_411f81b7","line":331,"in_reply_to":"fa1b9901_a933e961","updated":"2015-08-21 18:44:07.000000000","message":"Yeah, still need to work on that; I was going to just use pretty table since the response can be fairly free-form.  I\u0027ll look at it again this week-end.","commit_id":"d65438d5845696eb3fd79cd2e1edecfec2d1bcdd"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"6be3b5ab28bc4b59c1ea852877d88e06ab40fcd4","unresolved":false,"context_lines":[{"line_number":309,"context_line":"        self.volume_api.failover_replication(context, volume, secondary)"},{"line_number":310,"context_line":"        return webob.Response(status_int\u003d202)"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    @wsgi.action(\u0027os-list_replication_targets\u0027)"},{"line_number":313,"context_line":"    def _list_replication_targets(self, req, id, body):"},{"line_number":314,"context_line":"        \"\"\"Show replication targets for the specified host."},{"line_number":315,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"fa1b9901_40a99bde","line":312,"updated":"2015-08-23 14:55:05.000000000","message":"I only see action implemented as a \"post\" (when sending requests in cinderclient), but this one sounds like it should be a \"get\".  I don\u0027t know if it is possible to do a \"get\" for this.  I tested this API and I got results back.  So I think it is fine.","commit_id":"00767bc2b377513041f908b17f71341c2039b19a"}],"cinder/tests/unit/policy.json":[{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"d53c34ef7ad7da943a252f4595cde4ad09fc3f7f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    \"volume:retype\": \"\","},{"line_number":36,"context_line":"    \"volume:copy_volume_to_image\": \"\","},{"line_number":37,"context_line":"\t\"volume:enable_replication\": \"rule:admin_api\","},{"line_number":38,"context_line":"\t\"volume:disable_replication\": \"rule:admin_api\","},{"line_number":39,"context_line":"\t\"volume:failover_replication\": \"rule:admin_api\","},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    \"volume_extension:volume_admin_actions:reset_status\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":7,"id":"fa1b9901_dccd64b8","line":38,"updated":"2015-08-19 02:39:33.000000000","message":"I guess it is some indentation issues.","commit_id":"ba013614a47a583fc7ac5418aa060702bb2ed2c7"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"cdc404caef7f265730aa678a3a4661ad52476df4","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    \"volume:copy_volume_to_image\": \"\","},{"line_number":37,"context_line":"\t\"volume:enable_replication\": \"rule:admin_api\","},{"line_number":38,"context_line":"\t\"volume:disable_replication\": \"rule:admin_api\","},{"line_number":39,"context_line":"\t\"volume:failover_replication\": \"rule:admin_api\","},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    \"volume_extension:volume_admin_actions:reset_status\": \"rule:admin_api\","},{"line_number":42,"context_line":"    \"volume_extension:snapshot_admin_actions:reset_status\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":7,"id":"fa1b9901_e7352cf7","line":39,"updated":"2015-08-19 04:52:43.000000000","message":"Looks like tabs.","commit_id":"ba013614a47a583fc7ac5418aa060702bb2ed2c7"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"d53c34ef7ad7da943a252f4595cde4ad09fc3f7f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"\t\"volume:enable_replication\": \"rule:admin_api\","},{"line_number":38,"context_line":"\t\"volume:disable_replication\": \"rule:admin_api\","},{"line_number":39,"context_line":"\t\"volume:failover_replication\": \"rule:admin_api\","},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    \"volume_extension:volume_admin_actions:reset_status\": \"rule:admin_api\","},{"line_number":42,"context_line":"    \"volume_extension:snapshot_admin_actions:reset_status\": \"rule:admin_api\","},{"line_number":43,"context_line":"    \"volume_extension:backup_admin_actions:reset_status\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":7,"id":"fa1b9901_5cbab40b","line":40,"updated":"2015-08-19 02:39:33.000000000","message":"Is volume:get_replication_target missing here?","commit_id":"ba013614a47a583fc7ac5418aa060702bb2ed2c7"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"cdc404caef7f265730aa678a3a4661ad52476df4","unresolved":false,"context_lines":[{"line_number":37,"context_line":"\t\"volume:enable_replication\": \"rule:admin_api\","},{"line_number":38,"context_line":"\t\"volume:disable_replication\": \"rule:admin_api\","},{"line_number":39,"context_line":"\t\"volume:failover_replication\": \"rule:admin_api\","},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    \"volume_extension:volume_admin_actions:reset_status\": \"rule:admin_api\","},{"line_number":42,"context_line":"    \"volume_extension:snapshot_admin_actions:reset_status\": \"rule:admin_api\","},{"line_number":43,"context_line":"    \"volume_extension:backup_admin_actions:reset_status\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":7,"id":"fa1b9901_d22788b4","line":40,"in_reply_to":"fa1b9901_5cbab40b","updated":"2015-08-19 04:52:43.000000000","message":"Yes, it is missing here.","commit_id":"ba013614a47a583fc7ac5418aa060702bb2ed2c7"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"c66b253ab3578ad23e0ba4efa901dacfdf81592a","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    \"volume:copy_volume_to_image\": \"\","},{"line_number":37,"context_line":"\t\"volume:enable_replication\": \"rule:admin_api\","},{"line_number":38,"context_line":"\t\"volume:disable_replication\": \"rule:admin_api\","},{"line_number":39,"context_line":"\t\"volume:failover_replication\": \"rule:admin_api\","},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    \"volume_extension:volume_admin_actions:reset_status\": \"rule:admin_api\","},{"line_number":42,"context_line":"    \"volume_extension:snapshot_admin_actions:reset_status\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":8,"id":"fa1b9901_3bc4758f","line":39,"updated":"2015-08-19 20:42:27.000000000","message":"Also, shouldn\u0027t volume:get_replication_target be here as well? Or is it volume:list_replication_target?","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"81c8f6f3df2e4f240c7cd049f3b28a303d8ec2db","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    \"volume:copy_volume_to_image\": \"\","},{"line_number":37,"context_line":"\t\"volume:enable_replication\": \"rule:admin_api\","},{"line_number":38,"context_line":"\t\"volume:disable_replication\": \"rule:admin_api\","},{"line_number":39,"context_line":"\t\"volume:failover_replication\": \"rule:admin_api\","},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    \"volume_extension:volume_admin_actions:reset_status\": \"rule:admin_api\","},{"line_number":42,"context_line":"    \"volume_extension:snapshot_admin_actions:reset_status\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":8,"id":"fa1b9901_4ad4f8bb","line":39,"updated":"2015-08-19 18:42:19.000000000","message":"tabs -\u003e spaces?","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"2f6deca92ffa617fcfaf2f84fdec98750a09b5b1","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    \"volume:copy_volume_to_image\": \"\","},{"line_number":37,"context_line":"\t\"volume:enable_replication\": \"rule:admin_api\","},{"line_number":38,"context_line":"\t\"volume:disable_replication\": \"rule:admin_api\","},{"line_number":39,"context_line":"\t\"volume:failover_replication\": \"rule:admin_api\","},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    \"volume_extension:volume_admin_actions:reset_status\": \"rule:admin_api\","},{"line_number":42,"context_line":"    \"volume_extension:snapshot_admin_actions:reset_status\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":8,"id":"fa1b9901_95775e9f","line":39,"in_reply_to":"fa1b9901_3bc4758f","updated":"2015-08-20 16:28:53.000000000","message":"Done","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"}],"cinder/tests/unit/test_volume.py":[{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"d53c34ef7ad7da943a252f4595cde4ad09fc3f7f","unresolved":false,"context_lines":[{"line_number":5872,"context_line":"            volume[\u0027replication_status\u0027] \u003d \u0027enabled\u0027"},{"line_number":5873,"context_line":"            volume_api.disable_replication(ctxt, volume)"},{"line_number":5874,"context_line":"            self.assertTrue(mock_disable_rep.called)"},{"line_number":5875,"context_line":""},{"line_number":5876,"context_line":""},{"line_number":5877,"context_line":"class LVMISCSIVolumeDriverTestCase(DriverTestCase):"},{"line_number":5878,"context_line":"    \"\"\"Test case for VolumeDriver\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_61934ca4","line":5875,"updated":"2015-08-19 02:39:33.000000000","message":"Are we missing the cases for list_replication_targets and failover_replication?","commit_id":"ba013614a47a583fc7ac5418aa060702bb2ed2c7"}],"cinder/volume/api.py":[{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"6727d177ed495c8e45bb77dd088e3869abbdc9ac","unresolved":false,"context_lines":[{"line_number":1556,"context_line":"                                    volume,"},{"line_number":1557,"context_line":"                                    secondary\u003dNone):"},{"line_number":1558,"context_line":""},{"line_number":1559,"context_line":"        self.volume_rpcapi.failover_volume_replication(context,"},{"line_number":1560,"context_line":"                                                       volume,"},{"line_number":1561,"context_line":"                                                       secondary)"},{"line_number":1562,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_d1ffe232","line":1559,"updated":"2015-07-12 08:46:25.000000000","message":"failover should include the same flow as disable/enable to make sure  the volume is in consistent state. Should be in \"Failover started\", and changed to \"enabled\" status when finished.","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"8b92c7922454e63455eb04ac8bc382c463cfc7d6","unresolved":false,"context_lines":[{"line_number":1556,"context_line":"                                    volume,"},{"line_number":1557,"context_line":"                                    secondary\u003dNone):"},{"line_number":1558,"context_line":""},{"line_number":1559,"context_line":"        self.volume_rpcapi.failover_volume_replication(context,"},{"line_number":1560,"context_line":"                                                       volume,"},{"line_number":1561,"context_line":"                                                       secondary)"},{"line_number":1562,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_235ecd76","line":1559,"in_reply_to":"9a41bdd9_d1ffe232","updated":"2015-07-13 14:54:00.000000000","message":"Agreed, just haven\u0027t gotten to this one yet :)","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1520,"context_line":""},{"line_number":1521,"context_line":"        # TODO(jdg): Move these up to a global list for each call and ban the"},{"line_number":1522,"context_line":"        # free form typing of states and state checks going forward"},{"line_number":1523,"context_line":"        valid_rep_status \u003d [\u0027disabled\u0027]"},{"line_number":1524,"context_line":"        rep_status \u003d volume.get(\u0027replication_status\u0027, valid_rep_status[0])"},{"line_number":1525,"context_line":""},{"line_number":1526,"context_line":"        if rep_status not in valid_rep_status:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_dc8c1bdc","line":1523,"updated":"2015-07-23 07:45:43.000000000","message":"So, to *change* the replication count replication needs to be disabled first? Or even deleted? Ie. 4 replicas \u003d\u003e 1 replica (via delete) \u003d\u003e 5 replicas, with all the associated network traffic?\n\nHaving another API call seems wasteful, so how about allowing \"enabled\" here too? (Perhaps even \"enabling\" ;) (But not \"disabling\"!)","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1548,"context_line":"        # NOTE(jdg): Just use disabled here (item 1 in the list) this"},{"line_number":1549,"context_line":"        # way if someone says disable_rep on a voume that\u0027s not being"},{"line_number":1550,"context_line":"        # replicated we just say \"ok, done\""},{"line_number":1551,"context_line":"        rep_status \u003d volume.get(\u0027replication_status\u0027, valid_disable_status[1])"},{"line_number":1552,"context_line":""},{"line_number":1553,"context_line":"        if rep_status not in valid_disable_status:"},{"line_number":1554,"context_line":"            msg \u003d (_(\"Invalid status to disable replication. \""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_5c66cb2a","line":1551,"updated":"2015-07-23 07:45:43.000000000","message":"I\u0027d use the \"special\" item as [0], to reduce problems if other statii are inserted later on.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7594a7941c3b6f01bf369117846a5e22da57c06d","unresolved":false,"context_lines":[{"line_number":1548,"context_line":"        # NOTE(jdg): Just use disabled here (item 1 in the list) this"},{"line_number":1549,"context_line":"        # way if someone says disable_rep on a voume that\u0027s not being"},{"line_number":1550,"context_line":"        # replicated we just say \"ok, done\""},{"line_number":1551,"context_line":"        rep_status \u003d volume.get(\u0027replication_status\u0027, valid_disable_status[1])"},{"line_number":1552,"context_line":""},{"line_number":1553,"context_line":"        if rep_status not in valid_disable_status:"},{"line_number":1554,"context_line":"            msg \u003d (_(\"Invalid status to disable replication. \""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_79a9f28f","line":1551,"in_reply_to":"3a50d1a3_5c66cb2a","updated":"2015-07-31 00:07:33.000000000","message":"yes, good point","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6226f148e451021092201ed3c84256d4f1159e89","unresolved":false,"context_lines":[{"line_number":1560,"context_line":"            raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":1561,"context_line":""},{"line_number":1562,"context_line":"        if rep_status \u003d\u003d \u0027disabled\u0027:"},{"line_number":1563,"context_line":"            # Don\u0027t have a hissy fit, just continue on"},{"line_number":1564,"context_line":"            return"},{"line_number":1565,"context_line":""},{"line_number":1566,"context_line":"        vref \u003d self.db.volume_update(context,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_77ce195b","line":1563,"updated":"2015-07-29 21:16:34.000000000","message":"Would it make sense to still pass this through to the driver so the backend can do something if it needs to?\n\nI\u0027m thinking of a situation where cinder thinks its disabled... but its not really on the backend. Might be nice to just keep piping them through to the driver and let it decide if this should be a no-op or not.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7594a7941c3b6f01bf369117846a5e22da57c06d","unresolved":false,"context_lines":[{"line_number":1560,"context_line":"            raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":1561,"context_line":""},{"line_number":1562,"context_line":"        if rep_status \u003d\u003d \u0027disabled\u0027:"},{"line_number":1563,"context_line":"            # Don\u0027t have a hissy fit, just continue on"},{"line_number":1564,"context_line":"            return"},{"line_number":1565,"context_line":""},{"line_number":1566,"context_line":"        vref \u003d self.db.volume_update(context,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_b99f7a64","line":1563,"in_reply_to":"3a50d1a3_77ce195b","updated":"2015-07-31 00:07:33.000000000","message":"yes, we can certainly change that... but after 4 years we still have drivers that freak out when a delete on a non-existent object is received.  But yeah, it makes sense to pass it through.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4c69aa4145c25d18ce081c0cf484ef6cbf92bb5d","unresolved":false,"context_lines":[{"line_number":1579,"context_line":"        rep_status \u003d volume.get(\u0027replication_status\u0027, \u0027na\u0027)"},{"line_number":1580,"context_line":""},{"line_number":1581,"context_line":"        if rep_status not in valid_failover_status:"},{"line_number":1582,"context_line":"            msg \u003d (_(\"Invalid status to disable replication. \""},{"line_number":1583,"context_line":"                     \"valid states are: %(valid_states)s, \""},{"line_number":1584,"context_line":"                     \"current replication-state is: %(curr_state)s.\"),"},{"line_number":1585,"context_line":"                   {\u0027valid_states\u0027: valid_failover_status,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_cfb42dd3","line":1582,"updated":"2015-08-03 15:19:24.000000000","message":"disable -\u003e failover","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6226f148e451021092201ed3c84256d4f1159e89","unresolved":false,"context_lines":[{"line_number":1590,"context_line":"        vref \u003d self.db.volume_update("},{"line_number":1591,"context_line":"            context,"},{"line_number":1592,"context_line":"            volume[\u0027id\u0027],"},{"line_number":1593,"context_line":"            {\u0027replication_status\u0027: \u0027enabling_secondary\u0027})"},{"line_number":1594,"context_line":""},{"line_number":1595,"context_line":"        self.volume_rpcapi.failover_volume_replication(context,"},{"line_number":1596,"context_line":"                                                       vref,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_d7c84d24","line":1593,"updated":"2015-07-29 21:16:34.000000000","message":"I know this kind of goes against how other things have been done, but can we maybe use a well defined enum kind of thing for the various replication status strings?\n\nIt might make things a little more verbose since it would maybe need syntax like repl_status.ENABLING_SECONDARY but I think that sort of thing is very useful to make sure everyone is on the same page with what status strings are possible and to avoid silly typos or anything in future changes.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7594a7941c3b6f01bf369117846a5e22da57c06d","unresolved":false,"context_lines":[{"line_number":1590,"context_line":"        vref \u003d self.db.volume_update("},{"line_number":1591,"context_line":"            context,"},{"line_number":1592,"context_line":"            volume[\u0027id\u0027],"},{"line_number":1593,"context_line":"            {\u0027replication_status\u0027: \u0027enabling_secondary\u0027})"},{"line_number":1594,"context_line":""},{"line_number":1595,"context_line":"        self.volume_rpcapi.failover_volume_replication(context,"},{"line_number":1596,"context_line":"                                                       vref,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_99b71ef5","line":1593,"in_reply_to":"3a50d1a3_d7c84d24","updated":"2015-07-31 00:07:33.000000000","message":"Yes, I think something like that can/should be done; not just here but elsewhere in our code.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":1519,"context_line":"        # also, use a list, we may want to add to it some day"},{"line_number":1520,"context_line":""},{"line_number":1521,"context_line":"        # TODO(jdg): Move these up to a global list for each call and ban the"},{"line_number":1522,"context_line":"        # free form typing of states and state checks going forward"},{"line_number":1523,"context_line":"        valid_rep_status \u003d [\u0027disabled\u0027]"},{"line_number":1524,"context_line":"        rep_status \u003d volume.get(\u0027replication_status\u0027, valid_rep_status[0])"},{"line_number":1525,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_3d92a2f7","line":1522,"updated":"2015-08-07 22:46:10.000000000","message":"+1","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":1532,"context_line":""},{"line_number":1533,"context_line":"            raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":1534,"context_line":""},{"line_number":1535,"context_line":"        vref \u003d self.db.volume_update(context,"},{"line_number":1536,"context_line":"                                     volume[\u0027id\u0027],"},{"line_number":1537,"context_line":"                                     {\u0027replication_status\u0027: \u0027enabling\u0027})"},{"line_number":1538,"context_line":"        self.volume_rpcapi.replicate_volume(context,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_5d7d2eb0","line":1535,"updated":"2015-08-07 22:46:10.000000000","message":"ctxt is passed in on line 1511.  Do you intend to use \"ctxt\" instead of \"context\" here?","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":1532,"context_line":""},{"line_number":1533,"context_line":"            raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":1534,"context_line":""},{"line_number":1535,"context_line":"        vref \u003d self.db.volume_update(context,"},{"line_number":1536,"context_line":"                                     volume[\u0027id\u0027],"},{"line_number":1537,"context_line":"                                     {\u0027replication_status\u0027: \u0027enabling\u0027})"},{"line_number":1538,"context_line":"        self.volume_rpcapi.replicate_volume(context,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_e7ad8d9c","line":1535,"in_reply_to":"1a4dcd0f_5d7d2eb0","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":1535,"context_line":"        vref \u003d self.db.volume_update(context,"},{"line_number":1536,"context_line":"                                     volume[\u0027id\u0027],"},{"line_number":1537,"context_line":"                                     {\u0027replication_status\u0027: \u0027enabling\u0027})"},{"line_number":1538,"context_line":"        self.volume_rpcapi.replicate_volume(context,"},{"line_number":1539,"context_line":"                                            vref,"},{"line_number":1540,"context_line":"                                            asynchronous,"},{"line_number":1541,"context_line":"                                            replica_count)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_dd3e1eda","line":1538,"updated":"2015-08-07 22:46:10.000000000","message":"Here too.  Should be \"ctxt\" instead of \"context\".","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":1535,"context_line":"        vref \u003d self.db.volume_update(context,"},{"line_number":1536,"context_line":"                                     volume[\u0027id\u0027],"},{"line_number":1537,"context_line":"                                     {\u0027replication_status\u0027: \u0027enabling\u0027})"},{"line_number":1538,"context_line":"        self.volume_rpcapi.replicate_volume(context,"},{"line_number":1539,"context_line":"                                            vref,"},{"line_number":1540,"context_line":"                                            asynchronous,"},{"line_number":1541,"context_line":"                                            replica_count)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_a790e54f","line":1538,"in_reply_to":"1a4dcd0f_dd3e1eda","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":1559,"context_line":""},{"line_number":1560,"context_line":"            raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":1561,"context_line":""},{"line_number":1562,"context_line":"        vref \u003d self.db.volume_update(context,"},{"line_number":1563,"context_line":"                                     volume[\u0027id\u0027],"},{"line_number":1564,"context_line":"                                     {\u0027replication_status\u0027: \u0027disabling\u0027})"},{"line_number":1565,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_bd10f25a","line":1562,"updated":"2015-08-07 22:46:10.000000000","message":"ctxt is passed in, not context.","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":1559,"context_line":""},{"line_number":1560,"context_line":"            raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":1561,"context_line":""},{"line_number":1562,"context_line":"        vref \u003d self.db.volume_update(context,"},{"line_number":1563,"context_line":"                                     volume[\u0027id\u0027],"},{"line_number":1564,"context_line":"                                     {\u0027replication_status\u0027: \u0027disabling\u0027})"},{"line_number":1565,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_679add70","line":1562,"in_reply_to":"1a4dcd0f_bd10f25a","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":1563,"context_line":"                                     volume[\u0027id\u0027],"},{"line_number":1564,"context_line":"                                     {\u0027replication_status\u0027: \u0027disabling\u0027})"},{"line_number":1565,"context_line":""},{"line_number":1566,"context_line":"        self.volume_rpcapi.disable_volume_replication(context, vref)"},{"line_number":1567,"context_line":""},{"line_number":1568,"context_line":"    @wrap_check_policy"},{"line_number":1569,"context_line":"    def failover_volume_replication(self,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_581c5c6a","line":1566,"updated":"2015-08-07 22:46:10.000000000","message":"ctxt","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":1563,"context_line":"                                     volume[\u0027id\u0027],"},{"line_number":1564,"context_line":"                                     {\u0027replication_status\u0027: \u0027disabling\u0027})"},{"line_number":1565,"context_line":""},{"line_number":1566,"context_line":"        self.volume_rpcapi.disable_volume_replication(context, vref)"},{"line_number":1567,"context_line":""},{"line_number":1568,"context_line":"    @wrap_check_policy"},{"line_number":1569,"context_line":"    def failover_volume_replication(self,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_278b7520","line":1566,"in_reply_to":"1a4dcd0f_581c5c6a","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":1584,"context_line":"            raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":1585,"context_line":""},{"line_number":1586,"context_line":"        vref \u003d self.db.volume_update("},{"line_number":1587,"context_line":"            context,"},{"line_number":1588,"context_line":"            volume[\u0027id\u0027],"},{"line_number":1589,"context_line":"            {\u0027replication_status\u0027: \u0027enabling_secondary\u0027})"},{"line_number":1590,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_78191879","line":1587,"updated":"2015-08-07 22:46:10.000000000","message":"ctxt","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":1588,"context_line":"            volume[\u0027id\u0027],"},{"line_number":1589,"context_line":"            {\u0027replication_status\u0027: \u0027enabling_secondary\u0027})"},{"line_number":1590,"context_line":""},{"line_number":1591,"context_line":"        self.volume_rpcapi.failover_volume_replication(context,"},{"line_number":1592,"context_line":"                                                       vref,"},{"line_number":1593,"context_line":"                                                       secondary)"},{"line_number":1594,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_382ab07f","line":1591,"updated":"2015-08-07 22:46:10.000000000","message":"ctxt","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"5e37ff598de960033df497b6fe0345dd77f0c8c1","unresolved":false,"context_lines":[{"line_number":1521,"context_line":""},{"line_number":1522,"context_line":"        # TODO(jdg): Move these up to a global list for each call and ban the"},{"line_number":1523,"context_line":"        # free form typing of states and state checks going forward"},{"line_number":1524,"context_line":"        valid_rep_status \u003d [\u0027disabled\u0027]"},{"line_number":1525,"context_line":"        rep_status \u003d volume.get(\u0027replication_status\u0027, valid_rep_status[0])"},{"line_number":1526,"context_line":""},{"line_number":1527,"context_line":"        if rep_status not in valid_rep_status:"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_c52124a0","line":1524,"updated":"2015-08-15 08:22:19.000000000","message":"Could we use use the same logic as for the disable-replication? let the driver verify that replication is indeed working and if so, do nothing, if something not right, let the driver try to fix it?\non caveat I see might be an issue with changing the status from enabled to enabling.","commit_id":"482a0bfdd47349474b13e0be1dcfbb283fac515d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"e0293ad1e8fec80331cc9cce50fcb10f7fb7ed24","unresolved":false,"context_lines":[{"line_number":1521,"context_line":""},{"line_number":1522,"context_line":"        # TODO(jdg): Move these up to a global list for each call and ban the"},{"line_number":1523,"context_line":"        # free form typing of states and state checks going forward"},{"line_number":1524,"context_line":"        valid_rep_status \u003d [\u0027disabled\u0027]"},{"line_number":1525,"context_line":"        rep_status \u003d volume.get(\u0027replication_status\u0027, valid_rep_status[0])"},{"line_number":1526,"context_line":""},{"line_number":1527,"context_line":"        if rep_status not in valid_rep_status:"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa1b9901_ab92f655","line":1524,"in_reply_to":"1a4dcd0f_c52124a0","updated":"2015-08-17 15:45:02.000000000","message":"I don\u0027t know that there\u0027s any problem with that, I\u0027ll look at adding it in the next patch set.","commit_id":"482a0bfdd47349474b13e0be1dcfbb283fac515d"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"5e37ff598de960033df497b6fe0345dd77f0c8c1","unresolved":false,"context_lines":[{"line_number":1562,"context_line":""},{"line_number":1563,"context_line":"        vref \u003d self.db.volume_update(ctxt,"},{"line_number":1564,"context_line":"                                     volume[\u0027id\u0027],"},{"line_number":1565,"context_line":"                                     {\u0027replication_status\u0027: \u0027disabling\u0027})"},{"line_number":1566,"context_line":""},{"line_number":1567,"context_line":"        self.volume_rpcapi.disable_volume_replication(ctxt, vref)"},{"line_number":1568,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_653930d8","line":1565,"updated":"2015-08-15 08:22:19.000000000","message":"does it make sense to change status from \"disabled\" to \"disabling\"?","commit_id":"482a0bfdd47349474b13e0be1dcfbb283fac515d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"e0293ad1e8fec80331cc9cce50fcb10f7fb7ed24","unresolved":false,"context_lines":[{"line_number":1562,"context_line":""},{"line_number":1563,"context_line":"        vref \u003d self.db.volume_update(ctxt,"},{"line_number":1564,"context_line":"                                     volume[\u0027id\u0027],"},{"line_number":1565,"context_line":"                                     {\u0027replication_status\u0027: \u0027disabling\u0027})"},{"line_number":1566,"context_line":""},{"line_number":1567,"context_line":"        self.volume_rpcapi.disable_volume_replication(ctxt, vref)"},{"line_number":1568,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa1b9901_0bba02e2","line":1565,"in_reply_to":"1a4dcd0f_653930d8","updated":"2015-08-17 15:45:02.000000000","message":"maybe not, the only reason I do like doing this however is there\u0027s a known state transition, and technically we are going through the disabling state at this point even though we\u0027re allowing a disable on a disabled vol.\n\nIf we want to just send this through as opposed to ignoring like the previous patch set (which is probably a good idea) I would prefer that we go through all of the steps the same way.  If nothing else it provides consistency in the flow and provides an indication of where the volume is in the transition states.","commit_id":"482a0bfdd47349474b13e0be1dcfbb283fac515d"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"d53c34ef7ad7da943a252f4595cde4ad09fc3f7f","unresolved":false,"context_lines":[{"line_number":1596,"context_line":"            {\u0027replication_status\u0027: \u0027enabling_secondary\u0027})"},{"line_number":1597,"context_line":""},{"line_number":1598,"context_line":"        self.volume_rpcapi.failover_replication(ctxt,"},{"line_number":1599,"context_line":"                                                       vref,"},{"line_number":1600,"context_line":"                                                       secondary)"},{"line_number":1601,"context_line":""},{"line_number":1602,"context_line":"    @wrap_check_policy"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_9c912c55","line":1599,"updated":"2015-08-19 02:39:33.000000000","message":"It is better to fix the indentation here.","commit_id":"ba013614a47a583fc7ac5418aa060702bb2ed2c7"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"cdc404caef7f265730aa678a3a4661ad52476df4","unresolved":false,"context_lines":[{"line_number":1597,"context_line":""},{"line_number":1598,"context_line":"        self.volume_rpcapi.failover_replication(ctxt,"},{"line_number":1599,"context_line":"                                                       vref,"},{"line_number":1600,"context_line":"                                                       secondary)"},{"line_number":1601,"context_line":""},{"line_number":1602,"context_line":"    @wrap_check_policy"},{"line_number":1603,"context_line":"    def list_replication_targets(self, ctxt, host):"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_87131066","line":1600,"updated":"2015-08-19 04:52:43.000000000","message":"This will probably cause pep8 error.","commit_id":"ba013614a47a583fc7ac5418aa060702bb2ed2c7"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"81c8f6f3df2e4f240c7cd049f3b28a303d8ec2db","unresolved":false,"context_lines":[{"line_number":1553,"context_line":"        valid_disable_status \u003d [\u0027disabled\u0027, \u0027enabled\u0027]"},{"line_number":1554,"context_line":""},{"line_number":1555,"context_line":"        # NOTE(jdg): Just use disabled here (item 1 in the list) this"},{"line_number":1556,"context_line":"        # way if someone says disable_rep on a voume that\u0027s not being"},{"line_number":1557,"context_line":"        # replicated we just say \"ok, done\""},{"line_number":1558,"context_line":"        rep_status \u003d volume.get(\u0027replication_status\u0027, valid_disable_status[0])"},{"line_number":1559,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_ea0e2c3a","line":1556,"updated":"2015-08-19 18:42:19.000000000","message":"voume -\u003e volume","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"81c8f6f3df2e4f240c7cd049f3b28a303d8ec2db","unresolved":false,"context_lines":[{"line_number":1576,"context_line":"    def failover_replication(self,"},{"line_number":1577,"context_line":"                             ctxt,"},{"line_number":1578,"context_line":"                             volume,"},{"line_number":1579,"context_line":"                             secondary\u003dNone):"},{"line_number":1580,"context_line":""},{"line_number":1581,"context_line":"        valid_failover_status \u003d [\u0027enabled\u0027]"},{"line_number":1582,"context_line":"        rep_status \u003d volume.get(\u0027replication_status\u0027, \u0027na\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_a52dc596","line":1579,"updated":"2015-08-19 18:42:19.000000000","message":"What type would secondary be? Whats in it?","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"e9fdec228fbe9b9baabe6c8c8c76b69ec0dd3321","unresolved":false,"context_lines":[{"line_number":1615,"context_line":"    def list_replication_targets(self, ctxt, vref):"},{"line_number":1616,"context_line":""},{"line_number":1617,"context_line":"        # NOTE(jdg): This collects info for the specified volume"},{"line_number":1618,"context_line":"        # it is NOT an erro if the volume is not being replicated"},{"line_number":1619,"context_line":"        # also, would be worth having something at a backend/host"},{"line_number":1620,"context_line":"        # level to show an admin how a backend is configured."},{"line_number":1621,"context_line":"        return self.volume_rpcapi.list_replication_targets(ctxt, vref)"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_aabc66bb","line":1618,"updated":"2015-08-21 02:36:07.000000000","message":"erro -\u003e error","commit_id":"3e00671340ed3cd82b3a320c835452c8b80b583f"}],"cinder/volume/driver.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4c69aa4145c25d18ce081c0cf484ef6cbf92bb5d","unresolved":false,"context_lines":[{"line_number":1196,"context_line":"        \"\"\""},{"line_number":1197,"context_line":"        return"},{"line_number":1198,"context_line":""},{"line_number":1199,"context_line":"    # Repliation V2"},{"line_number":1200,"context_line":"    # Ok, why not just use this existing replication class temporarily"},{"line_number":1201,"context_line":"    # Just don\u0027t put abc deorator on yet or the drivers that have this"},{"line_number":1202,"context_line":"    # already will barf"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_ef5fa973","line":1199,"updated":"2015-08-03 15:19:24.000000000","message":"s/Repliation/Replication","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6226f148e451021092201ed3c84256d4f1159e89","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"    # Repliation V2"},{"line_number":1200,"context_line":"    # Ok, why not just use this existing replication class temporarily"},{"line_number":1201,"context_line":"    # Just don\u0027t put abc deorator on yet or the drivers that have this"},{"line_number":1202,"context_line":"    # already will barf"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"    def replication_enable(self, context, volume, asynch, replica_count):"},{"line_number":1205,"context_line":"        \"\"\"Enable replication on a replication capable volume."}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_57799dc6","line":1202,"updated":"2015-07-29 21:16:34.000000000","message":"If we end up keeping the split up abc classes we should probably put this into a different class then, right?","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7594a7941c3b6f01bf369117846a5e22da57c06d","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"    # Repliation V2"},{"line_number":1200,"context_line":"    # Ok, why not just use this existing replication class temporarily"},{"line_number":1201,"context_line":"    # Just don\u0027t put abc deorator on yet or the drivers that have this"},{"line_number":1202,"context_line":"    # already will barf"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"    def replication_enable(self, context, volume, asynch, replica_count):"},{"line_number":1205,"context_line":"        \"\"\"Enable replication on a replication capable volume."}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_5947561d","line":1202,"in_reply_to":"3a50d1a3_57799dc6","updated":"2015-07-31 00:07:33.000000000","message":"yes, that would mean yet another class.  I\u0027m obviously opposed to that, I would prefer that people use their brain a little bit including reviewers and just ensure a driver implements all 5 of the methods.\n\nGiven they\u0027re grouped and have labels I don\u0027t think this is too much to ask.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6226f148e451021092201ed3c84256d4f1159e89","unresolved":false,"context_lines":[{"line_number":1201,"context_line":"    # Just don\u0027t put abc deorator on yet or the drivers that have this"},{"line_number":1202,"context_line":"    # already will barf"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"    def replication_enable(self, context, volume, asynch, replica_count):"},{"line_number":1205,"context_line":"        \"\"\"Enable replication on a replication capable volume."},{"line_number":1206,"context_line":""},{"line_number":1207,"context_line":"        If the volume was created on a replication_enabled host this method"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_9a3e6c89","line":1204,"updated":"2015-07-29 21:16:34.000000000","message":"I\u0027m not entirely sure I have a great alternative for this... but I kind of don\u0027t like that the driver is told whether or not it should be asynch or what the replica count is here. Maybe I\u0027m biased because the replication model for my array doesn\u0027t really work that way :D\n\nI had envision that those sort of things would be specified maybe as volume type specifications, or set by backend config options that are used as defaults if not specified by the volume type. That way at the point in time where you say to replicate a volume you don\u0027t get into an awkward situation where the backend says \u0027wait, no, just kidding I cant deal with the volume I said I could handle and the scheduler gave me\u0027","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7594a7941c3b6f01bf369117846a5e22da57c06d","unresolved":false,"context_lines":[{"line_number":1201,"context_line":"    # Just don\u0027t put abc deorator on yet or the drivers that have this"},{"line_number":1202,"context_line":"    # already will barf"},{"line_number":1203,"context_line":""},{"line_number":1204,"context_line":"    def replication_enable(self, context, volume, asynch, replica_count):"},{"line_number":1205,"context_line":"        \"\"\"Enable replication on a replication capable volume."},{"line_number":1206,"context_line":""},{"line_number":1207,"context_line":"        If the volume was created on a replication_enabled host this method"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_19ff8eab","line":1204,"in_reply_to":"3a50d1a3_9a3e6c89","updated":"2015-07-31 00:07:33.000000000","message":"yeah, that\u0027s a valid point and part of why I don\u0027t like having this sort of stuff in the API at all.  I will take another look at this and look at pushing it down into the type, then vendors have more flexibility and we don\u0027t have to try and accommodate every different model.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"51df979040c20c2687b1df05b2615d757b8a11a2","unresolved":false,"context_lines":[{"line_number":1213,"context_line":"        In case of a backend having num_avail_secondaries \u003e replica_count"},{"line_number":1214,"context_line":"        it\u0027s left up to the driver to pick which avail_secondary device"},{"line_number":1215,"context_line":"        to use.  This can be random, load based or whatever the driver"},{"line_number":1216,"context_line":"        deems appropriate."},{"line_number":1217,"context_line":""},{"line_number":1218,"context_line":"        :param context: security context"},{"line_number":1219,"context_line":"        :param volume: volume object returned by DB"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_b0dd8742","line":1216,"updated":"2015-07-29 22:06:38.000000000","message":"Maybe it is implied, but what is the expectation if more replicas than are available are requested.  Exception should be thrown?","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7594a7941c3b6f01bf369117846a5e22da57c06d","unresolved":false,"context_lines":[{"line_number":1213,"context_line":"        In case of a backend having num_avail_secondaries \u003e replica_count"},{"line_number":1214,"context_line":"        it\u0027s left up to the driver to pick which avail_secondary device"},{"line_number":1215,"context_line":"        to use.  This can be random, load based or whatever the driver"},{"line_number":1216,"context_line":"        deems appropriate."},{"line_number":1217,"context_line":""},{"line_number":1218,"context_line":"        :param context: security context"},{"line_number":1219,"context_line":"        :param volume: volume object returned by DB"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_99295e3a","line":1216,"in_reply_to":"3a50d1a3_b0dd8742","updated":"2015-07-31 00:07:33.000000000","message":"It fails.. It\u0027s not implied; I spell that out explicitly somewhere.  But based on Patrick\u0027s comment it may not be something we want to do here anyway.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1220,"context_line":"        :param asynchronous: Indicates use of async vs sync rep"},{"line_number":1221,"context_line":"        :param replica_count: Indicates the number of replicas to create"},{"line_number":1222,"context_line":"        \"\"\""},{"line_number":1223,"context_line":""},{"line_number":1224,"context_line":"        raise NotImplementedError()"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"    def replication_disable(self, context, volume):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_df7f2d13","line":1223,"updated":"2015-07-23 07:45:43.000000000","message":"What\u0027s the expected return value? Should the driver tell the hosts the replicas are on? Just True?","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"178282dfa5f746b1e313c7ee5345f24051d17418","unresolved":false,"context_lines":[{"line_number":1220,"context_line":"        :param asynchronous: Indicates use of async vs sync rep"},{"line_number":1221,"context_line":"        :param replica_count: Indicates the number of replicas to create"},{"line_number":1222,"context_line":"        \"\"\""},{"line_number":1223,"context_line":""},{"line_number":1224,"context_line":"        raise NotImplementedError()"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"    def replication_disable(self, context, volume):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_88fbea7a","line":1223,"in_reply_to":"3a50d1a3_df7f2d13","updated":"2015-07-28 12:30:50.000000000","message":"Agree, can we define what db values should be returned by the driver. What is mandatory (if any) and what is optional.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4c69aa4145c25d18ce081c0cf484ef6cbf92bb5d","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"        \"\"\"Disable replicaton on the specified volume."},{"line_number":1228,"context_line":""},{"line_number":1229,"context_line":"        If the specified volume is currently replication enabled,"},{"line_number":1230,"context_line":"        this method can be used to disable the replciation process"},{"line_number":1231,"context_line":"        on the backend.  This method assumes that we checked"},{"line_number":1232,"context_line":"        replication status in the API layer to ensure we should"},{"line_number":1233,"context_line":"        send this call to the driver."}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_aa1f4f5a","line":1230,"updated":"2015-08-03 15:19:24.000000000","message":"replication","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"51df979040c20c2687b1df05b2615d757b8a11a2","unresolved":false,"context_lines":[{"line_number":1233,"context_line":"        send this call to the driver."},{"line_number":1234,"context_line":""},{"line_number":1235,"context_line":"        :param context: security context"},{"line_number":1236,"context_line":"        :param volume: volume object returned by DB"},{"line_number":1237,"context_line":"        \"\"\""},{"line_number":1238,"context_line":""},{"line_number":1239,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_50cc4369","line":1236,"updated":"2015-07-29 22:06:38.000000000","message":"Is it expected that this will always be successful?  What are the expected return values.  Maybe if disabling fails it is less concerning but wanted to mention it.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7594a7941c3b6f01bf369117846a5e22da57c06d","unresolved":false,"context_lines":[{"line_number":1233,"context_line":"        send this call to the driver."},{"line_number":1234,"context_line":""},{"line_number":1235,"context_line":"        :param context: security context"},{"line_number":1236,"context_line":"        :param volume: volume object returned by DB"},{"line_number":1237,"context_line":"        \"\"\""},{"line_number":1238,"context_line":""},{"line_number":1239,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_1916aef1","line":1236,"in_reply_to":"3a50d1a3_50cc4369","updated":"2015-07-31 00:07:33.000000000","message":"Just like anything else we do in Cinder we assume it will be succesful, if it\u0027s not we\u0027ll need to update the replication_status \u003d error\n\nWill need to add the exception pieces in the manager.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"51df979040c20c2687b1df05b2615d757b8a11a2","unresolved":false,"context_lines":[{"line_number":1242,"context_line":"        \"\"\"Force failover to a secondary replication target."},{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"        Forces the failover action of a replicated volume to one of its"},{"line_number":1245,"context_line":"        secondar/target devices.  By default the choice of target devices"},{"line_number":1246,"context_line":"        is left up to the driver.  Inparticular we expect one way"},{"line_number":1247,"context_line":"        replication here, but are providing a mechanism for \u0027n\u0027 way"},{"line_number":1248,"context_line":"        if supported/configrued."}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_b0fee767","line":1245,"updated":"2015-07-29 22:06:38.000000000","message":"Secondar -\u003e secondary","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6226f148e451021092201ed3c84256d4f1159e89","unresolved":false,"context_lines":[{"line_number":1242,"context_line":"        \"\"\"Force failover to a secondary replication target."},{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"        Forces the failover action of a replicated volume to one of its"},{"line_number":1245,"context_line":"        secondar/target devices.  By default the choice of target devices"},{"line_number":1246,"context_line":"        is left up to the driver.  Inparticular we expect one way"},{"line_number":1247,"context_line":"        replication here, but are providing a mechanism for \u0027n\u0027 way"},{"line_number":1248,"context_line":"        if supported/configrued."}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_fa6210ac","line":1245,"updated":"2015-07-29 21:16:34.000000000","message":"s/secondar/secondary/","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"51df979040c20c2687b1df05b2615d757b8a11a2","unresolved":false,"context_lines":[{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"        Forces the failover action of a replicated volume to one of its"},{"line_number":1245,"context_line":"        secondar/target devices.  By default the choice of target devices"},{"line_number":1246,"context_line":"        is left up to the driver.  Inparticular we expect one way"},{"line_number":1247,"context_line":"        replication here, but are providing a mechanism for \u0027n\u0027 way"},{"line_number":1248,"context_line":"        if supported/configrued."},{"line_number":1249,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_3042d7ab","line":1246,"updated":"2015-07-29 22:06:38.000000000","message":"Inparticular -\u003e in particular","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":17405,"name":"Jacob Gregor","email":"jgregor@us.ibm.com","username":"jgregor"},"change_message_id":"e517ddcc4fad2f4b7b02a493518d6942ff76ecdf","unresolved":false,"context_lines":[{"line_number":1245,"context_line":"        secondar/target devices.  By default the choice of target devices"},{"line_number":1246,"context_line":"        is left up to the driver.  Inparticular we expect one way"},{"line_number":1247,"context_line":"        replication here, but are providing a mechanism for \u0027n\u0027 way"},{"line_number":1248,"context_line":"        if supported/configrued."},{"line_number":1249,"context_line":""},{"line_number":1250,"context_line":"        Currently we leave it up to the driver to figure out how/what"},{"line_number":1251,"context_line":"        to do here.  Rather than doing things like ID swaps, we instead"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_30709707","line":1248,"updated":"2015-07-29 22:05:07.000000000","message":"\"configrued\" -\u003e \"configured\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6226f148e451021092201ed3c84256d4f1159e89","unresolved":false,"context_lines":[{"line_number":1253,"context_line":""},{"line_number":1254,"context_line":"        In cases where we might want to drop a volume-service node and"},{"line_number":1255,"context_line":"        the replication target is a configured cinder backend, we\u0027ll"},{"line_number":1256,"context_line":"        just update the host column for the volume."},{"line_number":1257,"context_line":""},{"line_number":1258,"context_line":"        :param context: security context"},{"line_number":1259,"context_line":"        :param volume: volume object returned by DB"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_da2dd446","line":1256,"updated":"2015-07-29 21:16:34.000000000","message":"Would that be something the driver needs to do? How would a driver know if the secondary target is a cinder backend or not?","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7594a7941c3b6f01bf369117846a5e22da57c06d","unresolved":false,"context_lines":[{"line_number":1253,"context_line":""},{"line_number":1254,"context_line":"        In cases where we might want to drop a volume-service node and"},{"line_number":1255,"context_line":"        the replication target is a configured cinder backend, we\u0027ll"},{"line_number":1256,"context_line":"        just update the host column for the volume."},{"line_number":1257,"context_line":""},{"line_number":1258,"context_line":"        :param context: security context"},{"line_number":1259,"context_line":"        :param volume: volume object returned by DB"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_79db3250","line":1256,"in_reply_to":"3a50d1a3_da2dd446","updated":"2015-07-31 00:07:33.000000000","message":"If you do your config correctly that info is included.  See the API code.  Regardless it would not be mandatory so I can just remove it if it alleviates confusion.\n\nI wanted to put it here to point out that folks might want to consider how they setup drivers in order to make this something that\u0027s possible.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1257,"context_line":""},{"line_number":1258,"context_line":"        :param context: security context"},{"line_number":1259,"context_line":"        :param volume: volume object returned by DB"},{"line_number":1260,"context_line":"        :param secondary: Specifies rep target to fail over to"},{"line_number":1261,"context_line":"        \"\"\""},{"line_number":1262,"context_line":""},{"line_number":1263,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_fff6a98d","line":1260,"updated":"2015-07-23 07:45:43.000000000","message":"What would \"secondary\" be, really?\nreplication_enable \u003d\u003e driver says \"okay\"\nreplication_failover \u003d\u003e \"a secondary\"? how would cinder tell which one?\n\nIs that a string that can be passed on the command line, eg. to say \"host17\"? Does the admin have to find out where the replicas are?\n\nA boolean? \"True\" \u003d\u003e use another host, \"False\" \u003d\u003e stay on Primary?\n\nshould the \"Primary\" host change after a failover? (as that\u0027s what \"Primary\" means in DRBD ;)","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7594a7941c3b6f01bf369117846a5e22da57c06d","unresolved":false,"context_lines":[{"line_number":1257,"context_line":""},{"line_number":1258,"context_line":"        :param context: security context"},{"line_number":1259,"context_line":"        :param volume: volume object returned by DB"},{"line_number":1260,"context_line":"        :param secondary: Specifies rep target to fail over to"},{"line_number":1261,"context_line":"        \"\"\""},{"line_number":1262,"context_line":""},{"line_number":1263,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_d915a69b","line":1260,"in_reply_to":"3a50d1a3_90416b65","updated":"2015-07-31 00:07:33.000000000","message":"Target from your configured targets list \n\nAgain, this was a POC just to communicate the basic idea.  There are details like what you mention here that are lacking; but I\u0027ll be adding them if anybody actually agrees with the basic concept here.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"51df979040c20c2687b1df05b2615d757b8a11a2","unresolved":false,"context_lines":[{"line_number":1257,"context_line":""},{"line_number":1258,"context_line":"        :param context: security context"},{"line_number":1259,"context_line":"        :param volume: volume object returned by DB"},{"line_number":1260,"context_line":"        :param secondary: Specifies rep target to fail over to"},{"line_number":1261,"context_line":"        \"\"\""},{"line_number":1262,"context_line":""},{"line_number":1263,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_90416b65","line":1260,"in_reply_to":"3a50d1a3_fff6a98d","updated":"2015-07-29 22:06:38.000000000","message":"Good question.  There are multiple ways we could failover.  Feels like we need a way here to specify how we want fail overs to occur?  I guess drivers could use a config option but it seems like more consistency would be better.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1265,"context_line":"    def get_replication_targets(self, context):"},{"line_number":1266,"context_line":"        \"\"\"Provide a means to obtain replication targets for a device."},{"line_number":1267,"context_line":""},{"line_number":1268,"context_line":"        This method isused to query a backend to get it\u0027s current"},{"line_number":1269,"context_line":"        replciation config info.  Primarily this is intended to provide"},{"line_number":1270,"context_line":"        properly formatted info containing \"what\" targets are configured."},{"line_number":1271,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_9f48c5cd","line":1268,"updated":"2015-07-23 07:45:43.000000000","message":"\"is used\", \"its\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1266,"context_line":"        \"\"\"Provide a means to obtain replication targets for a device."},{"line_number":1267,"context_line":""},{"line_number":1268,"context_line":"        This method isused to query a backend to get it\u0027s current"},{"line_number":1269,"context_line":"        replciation config info.  Primarily this is intended to provide"},{"line_number":1270,"context_line":"        properly formatted info containing \"what\" targets are configured."},{"line_number":1271,"context_line":""},{"line_number":1272,"context_line":"        In the case of no-targets configured, the driver should return"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_df296de7","line":1269,"updated":"2015-07-23 07:45:43.000000000","message":"\"replication\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1274,"context_line":"        update_replication_targets) with the values set to None."},{"line_number":1275,"context_line":""},{"line_number":1276,"context_line":"        This provides a handy mechanism for an admin to ensure he/she"},{"line_number":1277,"context_line":"        sends properl formatted data to teh backend when updating targets."},{"line_number":1278,"context_line":""},{"line_number":1279,"context_line":"        Example response:"},{"line_number":1280,"context_line":"        [{remote_targets:[{san_ip: xxx, san_login: xxx, san_password: xxxx,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_bf1a61c4","line":1277,"updated":"2015-07-23 07:45:43.000000000","message":"\"properly\", \"the\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1276,"context_line":"        This provides a handy mechanism for an admin to ensure he/she"},{"line_number":1277,"context_line":"        sends properl formatted data to teh backend when updating targets."},{"line_number":1278,"context_line":""},{"line_number":1279,"context_line":"        Example response:"},{"line_number":1280,"context_line":"        [{remote_targets:[{san_ip: xxx, san_login: xxx, san_password: xxxx,"},{"line_number":1281,"context_line":"                           san_password: xxx, status: \u003cenabled|disabled\u003e},"},{"line_number":1282,"context_line":"                          ...{}],"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_1f8275c8","line":1279,"updated":"2015-07-23 07:45:43.000000000","message":"THAT\u0027s what I was always looking for - what results are expected.\nTHANKS!","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"51df979040c20c2687b1df05b2615d757b8a11a2","unresolved":false,"context_lines":[{"line_number":1282,"context_line":"                          ...{}],"},{"line_number":1283,"context_line":"         {cinder_hosts: [volume_backend_name,....]}]"},{"line_number":1284,"context_line":""},{"line_number":1285,"context_line":"        \"\"\""},{"line_number":1286,"context_line":""},{"line_number":1287,"context_line":"        raise NotImplementedError()"},{"line_number":1288,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_2b44ac44","line":1285,"updated":"2015-07-29 22:06:38.000000000","message":"So, this information would be supplied by the driver.  My concern here is how the driver gets that information.  Don\u0027t want every driver creating their own drivername_replica_target field. In think I remember talking about adding a shared config option at the summit.  Can we add that as part of this WIP.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1287,"context_line":"        raise NotImplementedError()"},{"line_number":1288,"context_line":""},{"line_number":1289,"context_line":"    def update_replication_targets(self, context, device_info, enable):"},{"line_number":1290,"context_line":"        \"\"\"Provides a means to pass in a new secondary device to a backend."},{"line_number":1291,"context_line":""},{"line_number":1292,"context_line":"        While we can use config entries for this to setup replication tarets"},{"line_number":1293,"context_line":"        for a device, it may be handy to be more dynamic and provide a"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_1fe7d5ac","line":1290,"updated":"2015-07-23 07:45:43.000000000","message":"\"a new secondary device\" as in \"use this VG too\"?","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1289,"context_line":"    def update_replication_targets(self, context, device_info, enable):"},{"line_number":1290,"context_line":"        \"\"\"Provides a means to pass in a new secondary device to a backend."},{"line_number":1291,"context_line":""},{"line_number":1292,"context_line":"        While we can use config entries for this to setup replication tarets"},{"line_number":1293,"context_line":"        for a device, it may be handy to be more dynamic and provide a"},{"line_number":1294,"context_line":"        mechanism via the APi to eanble/disable devices dynamically."},{"line_number":1295,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_5f631d42","line":1292,"updated":"2015-07-23 07:45:43.000000000","message":"\"targets\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1291,"context_line":""},{"line_number":1292,"context_line":"        While we can use config entries for this to setup replication tarets"},{"line_number":1293,"context_line":"        for a device, it may be handy to be more dynamic and provide a"},{"line_number":1294,"context_line":"        mechanism via the APi to eanble/disable devices dynamically."},{"line_number":1295,"context_line":""},{"line_number":1296,"context_line":"        The backend device should also use this to determine if it shoudl set"},{"line_number":1297,"context_line":"        replication_enabled \u003d T/F in it\u0027s capability reporting"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_7f661952","line":1294,"updated":"2015-07-23 07:45:43.000000000","message":"\"API\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4c69aa4145c25d18ce081c0cf484ef6cbf92bb5d","unresolved":false,"context_lines":[{"line_number":1292,"context_line":"        While we can use config entries for this to setup replication tarets"},{"line_number":1293,"context_line":"        for a device, it may be handy to be more dynamic and provide a"},{"line_number":1294,"context_line":"        mechanism via the APi to eanble/disable devices dynamically."},{"line_number":1295,"context_line":""},{"line_number":1296,"context_line":"        The backend device should also use this to determine if it shoudl set"},{"line_number":1297,"context_line":"        replication_enabled \u003d T/F in it\u0027s capability reporting"},{"line_number":1298,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_aac98fae","line":1295,"updated":"2015-08-03 15:19:24.000000000","message":"s/eanble/enable","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1293,"context_line":"        for a device, it may be handy to be more dynamic and provide a"},{"line_number":1294,"context_line":"        mechanism via the APi to eanble/disable devices dynamically."},{"line_number":1295,"context_line":""},{"line_number":1296,"context_line":"        The backend device should also use this to determine if it shoudl set"},{"line_number":1297,"context_line":"        replication_enabled \u003d T/F in it\u0027s capability reporting"},{"line_number":1298,"context_line":""},{"line_number":1299,"context_line":"        This also means that if a volume is actively being replicated"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_df572d56","line":1296,"updated":"2015-07-23 07:45:43.000000000","message":"\"should\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1294,"context_line":"        mechanism via the APi to eanble/disable devices dynamically."},{"line_number":1295,"context_line":""},{"line_number":1296,"context_line":"        The backend device should also use this to determine if it shoudl set"},{"line_number":1297,"context_line":"        replication_enabled \u003d T/F in it\u0027s capability reporting"},{"line_number":1298,"context_line":""},{"line_number":1299,"context_line":"        This also means that if a volume is actively being replicated"},{"line_number":1300,"context_line":"        on the backend and it\u0027s target is disabled, that the replication"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_bf4821b4","line":1297,"updated":"2015-07-23 07:45:43.000000000","message":"period missing","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1304,"context_line":""},{"line_number":1305,"context_line":"        :param context: security context"},{"line_number":1306,"context_line":"        :param target_info: dict containing secondary device to add/remove"},{"line_number":1307,"context_line":"        :param enable: enables/disables replication to speified device"},{"line_number":1308,"context_line":""},{"line_number":1309,"context_line":"        :return volume_updates: We return a list of any volumes that"},{"line_number":1310,"context_line":"        will be impacted by the targets update call.  This may be that"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_1fd035c8","line":1307,"updated":"2015-07-23 07:45:43.000000000","message":"\"specified\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"51df979040c20c2687b1df05b2615d757b8a11a2","unresolved":false,"context_lines":[{"line_number":1311,"context_line":"        some volumes are no longer replicated etc."},{"line_number":1312,"context_line":""},{"line_number":1313,"context_line":"        updates \u003d [{id: volumd-id,"},{"line_number":1314,"context_line":""},{"line_number":1315,"context_line":"        \"\"\""},{"line_number":1316,"context_line":""},{"line_number":1317,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_4b225853","line":1314,"updated":"2015-07-29 22:06:38.000000000","message":"So, this is our way to enable/disable replication for a whole target.  Is it expected that the driver code for this will update the replication status for all impacted volumes?  I ask because it is a little confusing that we are also retuning the list of impacted volumes.  Is there something that needs to happen afterwards?  Want to better understand your thinking here.  \n\nShould the backend automatically enable replication for all impacted volumes or is that a choice for the backend?","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":1212,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1213,"context_line":"class ReplicaV2VD(object):"},{"line_number":1214,"context_line":"    @abc.abstractmethod"},{"line_number":1215,"context_line":"    def replication_enable(self, context, volume):"},{"line_number":1216,"context_line":"        \"\"\"Enable replication on a replication capable volume."},{"line_number":1217,"context_line":""},{"line_number":1218,"context_line":"        If the volume was created on a replication_enabled host this method"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_987bc429","line":1215,"updated":"2015-08-07 22:46:10.000000000","message":"In the manager, \u0027asynchronous\u0027 and \u0027replica_count\u0027 are also passed in to call this driver method.  So asynchronous and replica_count should be added to replication_enable as additional parameters.\n\n\nrep_driver_data \u003d self.driver.replication_enable(context,\n                                             volume,\n                                             asynchronous,\n\t\t\t                     replica_count)","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":1212,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1213,"context_line":"class ReplicaV2VD(object):"},{"line_number":1214,"context_line":"    @abc.abstractmethod"},{"line_number":1215,"context_line":"    def replication_enable(self, context, volume):"},{"line_number":1216,"context_line":"        \"\"\"Enable replication on a replication capable volume."},{"line_number":1217,"context_line":""},{"line_number":1218,"context_line":"        If the volume was created on a replication_enabled host this method"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_2792954c","line":1215,"in_reply_to":"1a4dcd0f_987bc429","updated":"2015-08-13 19:26:44.000000000","message":"yeah, folks seemed to want that to go away, but I didn\u0027t update there yet... thanks!","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":7111,"name":"hadi esiely","email":"hadi.esiely-barrera@jhuapl.edu","username":"HEsiely"},"change_message_id":"f23c2e882472c3148b2577a66d40350a9362ff4f","unresolved":false,"context_lines":[{"line_number":1284,"context_line":"    def get_replication_targets(self, context):"},{"line_number":1285,"context_line":"        \"\"\"Provide a means to obtain replication targets for a device."},{"line_number":1286,"context_line":""},{"line_number":1287,"context_line":"        This method isused to query a backend to get it\u0027s current"},{"line_number":1288,"context_line":"        replciation config info.  Primarily this is intended to provide"},{"line_number":1289,"context_line":"        properly formatted info containing \"what\" targets are configured."},{"line_number":1290,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_c529ee9c","line":1287,"updated":"2015-08-11 15:24:04.000000000","message":"\"This method is used\"","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":1284,"context_line":"    def get_replication_targets(self, context):"},{"line_number":1285,"context_line":"        \"\"\"Provide a means to obtain replication targets for a device."},{"line_number":1286,"context_line":""},{"line_number":1287,"context_line":"        This method isused to query a backend to get it\u0027s current"},{"line_number":1288,"context_line":"        replciation config info.  Primarily this is intended to provide"},{"line_number":1289,"context_line":"        properly formatted info containing \"what\" targets are configured."},{"line_number":1290,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_e7b26de5","line":1287,"in_reply_to":"1a4dcd0f_c529ee9c","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":7111,"name":"hadi esiely","email":"hadi.esiely-barrera@jhuapl.edu","username":"HEsiely"},"change_message_id":"f23c2e882472c3148b2577a66d40350a9362ff4f","unresolved":false,"context_lines":[{"line_number":1285,"context_line":"        \"\"\"Provide a means to obtain replication targets for a device."},{"line_number":1286,"context_line":""},{"line_number":1287,"context_line":"        This method isused to query a backend to get it\u0027s current"},{"line_number":1288,"context_line":"        replciation config info.  Primarily this is intended to provide"},{"line_number":1289,"context_line":"        properly formatted info containing \"what\" targets are configured."},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"        In the case of no-targets configured, the driver should return"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_851e866e","line":1288,"updated":"2015-08-11 15:24:04.000000000","message":"\"replication\"","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":1285,"context_line":"        \"\"\"Provide a means to obtain replication targets for a device."},{"line_number":1286,"context_line":""},{"line_number":1287,"context_line":"        This method isused to query a backend to get it\u0027s current"},{"line_number":1288,"context_line":"        replciation config info.  Primarily this is intended to provide"},{"line_number":1289,"context_line":"        properly formatted info containing \"what\" targets are configured."},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"        In the case of no-targets configured, the driver should return"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_87c84958","line":1288,"in_reply_to":"1a4dcd0f_851e866e","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":7111,"name":"hadi esiely","email":"hadi.esiely-barrera@jhuapl.edu","username":"HEsiely"},"change_message_id":"f23c2e882472c3148b2577a66d40350a9362ff4f","unresolved":false,"context_lines":[{"line_number":1293,"context_line":"        update_replication_targets) with the values set to None."},{"line_number":1294,"context_line":""},{"line_number":1295,"context_line":"        This provides a handy mechanism for an admin to ensure he/she"},{"line_number":1296,"context_line":"        sends properl formatted data to teh backend when updating targets."},{"line_number":1297,"context_line":""},{"line_number":1298,"context_line":"        Example response:"},{"line_number":1299,"context_line":"        [{remote_targets:[{san_ip: xxx, san_login: xxx, san_password: xxxx,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_2006801c","line":1296,"updated":"2015-08-11 15:24:04.000000000","message":"\"properly formatted data to the backend\"","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":1293,"context_line":"        update_replication_targets) with the values set to None."},{"line_number":1294,"context_line":""},{"line_number":1295,"context_line":"        This provides a handy mechanism for an admin to ensure he/she"},{"line_number":1296,"context_line":"        sends properl formatted data to teh backend when updating targets."},{"line_number":1297,"context_line":""},{"line_number":1298,"context_line":"        Example response:"},{"line_number":1299,"context_line":"        [{remote_targets:[{san_ip: xxx, san_login: xxx, san_password: xxxx,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_07dbd922","line":1296,"in_reply_to":"1a4dcd0f_2006801c","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"5e37ff598de960033df497b6fe0345dd77f0c8c1","unresolved":false,"context_lines":[{"line_number":1414,"context_line":"        \"\"\"Enable replication on a replication capable volume."},{"line_number":1415,"context_line":""},{"line_number":1416,"context_line":"        If the volume was created on a replication_enabled host this method"},{"line_number":1417,"context_line":"        is used to enable replication for the volume."},{"line_number":1418,"context_line":""},{"line_number":1419,"context_line":"        NOTE: This is intended as an ADMIN only call and is not"},{"line_number":1420,"context_line":"        intended to be used by end-user to enable replication.  We\u0027re"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_e57220b0","line":1417,"updated":"2015-08-15 08:22:19.000000000","message":"if we allow the driver to \"re-enable\" it should be documented here as well.","commit_id":"482a0bfdd47349474b13e0be1dcfbb283fac515d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"e0293ad1e8fec80331cc9cce50fcb10f7fb7ed24","unresolved":false,"context_lines":[{"line_number":1414,"context_line":"        \"\"\"Enable replication on a replication capable volume."},{"line_number":1415,"context_line":""},{"line_number":1416,"context_line":"        If the volume was created on a replication_enabled host this method"},{"line_number":1417,"context_line":"        is used to enable replication for the volume."},{"line_number":1418,"context_line":""},{"line_number":1419,"context_line":"        NOTE: This is intended as an ADMIN only call and is not"},{"line_number":1420,"context_line":"        intended to be used by end-user to enable replication.  We\u0027re"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa1b9901_ab8676b7","line":1417,"in_reply_to":"1a4dcd0f_e57220b0","updated":"2015-08-17 15:45:02.000000000","message":"Yeah, I\u0027ll change the wording because in reality this ends up being re-enable more than anything else.  Honestly we could get by without any of the API methods and just have a type handle most everything for us but I understand that there\u0027s a requirement to be able to force and test this.\n\nAnyway, I\u0027ll update the docstring and hopefully it\u0027ll make sense and be closer to what you\u0027re asking for.","commit_id":"482a0bfdd47349474b13e0be1dcfbb283fac515d"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"5e37ff598de960033df497b6fe0345dd77f0c8c1","unresolved":false,"context_lines":[{"line_number":1440,"context_line":"        this method can be used to disable the replciation process"},{"line_number":1441,"context_line":"        on the backend.  This method assumes that we checked"},{"line_number":1442,"context_line":"        replication status in the API layer to ensure we should"},{"line_number":1443,"context_line":"        send this call to the driver."},{"line_number":1444,"context_line":""},{"line_number":1445,"context_line":"        This is intended as an ADMIN only call to allow for"},{"line_number":1446,"context_line":"        maintenance and testing.  If a driver receives this call"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a4dcd0f_253328f8","line":1443,"updated":"2015-08-15 08:22:19.000000000","message":"Should also add:\nif the replication status of the volume is disabled, it is up to the driver to verify that replication is indeed disabled.","commit_id":"482a0bfdd47349474b13e0be1dcfbb283fac515d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"e0293ad1e8fec80331cc9cce50fcb10f7fb7ed24","unresolved":false,"context_lines":[{"line_number":1440,"context_line":"        this method can be used to disable the replciation process"},{"line_number":1441,"context_line":"        on the backend.  This method assumes that we checked"},{"line_number":1442,"context_line":"        replication status in the API layer to ensure we should"},{"line_number":1443,"context_line":"        send this call to the driver."},{"line_number":1444,"context_line":""},{"line_number":1445,"context_line":"        This is intended as an ADMIN only call to allow for"},{"line_number":1446,"context_line":"        maintenance and testing.  If a driver receives this call"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa1b9901_abad1633","line":1443,"in_reply_to":"1a4dcd0f_253328f8","updated":"2015-08-17 15:45:02.000000000","message":"Yep, I\u0027ll add some wording there, thanks!","commit_id":"482a0bfdd47349474b13e0be1dcfbb283fac515d"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"81c8f6f3df2e4f240c7cd049f3b28a303d8ec2db","unresolved":false,"context_lines":[{"line_number":1415,"context_line":"    the use of volume-types in conjunction with the filter scheduler."},{"line_number":1416,"context_line":"    This requires:"},{"line_number":1417,"context_line":"    1. The driver reports \"replication \u003d True\" in it\u0027s capabilities"},{"line_number":1418,"context_line":"    2. The cinder.conf file includes the valid_replication_devices section"},{"line_number":1419,"context_line":""},{"line_number":1420,"context_line":"    The driver configuration is expected to take one of the following two"},{"line_number":1421,"context_line":"    forms:"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_e58bbd66","line":1418,"updated":"2015-08-19 18:42:19.000000000","message":"We probably want to make sure to do a scrub of this to standardize all of the comments/docs to have the same name for this. Elsewhere it drops the \u0027valid_\u0027 prefix.","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"c66b253ab3578ad23e0ba4efa901dacfdf81592a","unresolved":false,"context_lines":[{"line_number":1448,"context_line":"    \"\"\""},{"line_number":1449,"context_line":""},{"line_number":1450,"context_line":"    @abc.abstractmethod"},{"line_number":1451,"context_line":"    def replication_enable(self, context, volume):"},{"line_number":1452,"context_line":"        \"\"\"Enable replication on a replication capable volume."},{"line_number":1453,"context_line":""},{"line_number":1454,"context_line":"        If the volume was created on a replication_enabled host this method"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_bb2de596","line":1451,"updated":"2015-08-19 20:42:27.000000000","message":"Like Patrick East mentioned in the manager, does this need asynchronous and replica_count? Or should it be removed from the manager?","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"2f6deca92ffa617fcfaf2f84fdec98750a09b5b1","unresolved":false,"context_lines":[{"line_number":1448,"context_line":"    \"\"\""},{"line_number":1449,"context_line":""},{"line_number":1450,"context_line":"    @abc.abstractmethod"},{"line_number":1451,"context_line":"    def replication_enable(self, context, volume):"},{"line_number":1452,"context_line":"        \"\"\"Enable replication on a replication capable volume."},{"line_number":1453,"context_line":""},{"line_number":1454,"context_line":"        If the volume was created on a replication_enabled host this method"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_550ea6e5","line":1451,"in_reply_to":"fa1b9901_bb2de596","updated":"2015-08-20 16:28:53.000000000","message":"Nope, we decided to leave that up to the type spec","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"e9fdec228fbe9b9baabe6c8c8c76b69ec0dd3321","unresolved":false,"context_lines":[{"line_number":237,"context_line":"                     \u0027{san_ip\u003d2.2.2.2 san_login\u003dadmin san_password\u003dadmin}.  \u0027"},{"line_number":238,"context_line":"                     \u0027NOTE: managed and unmanaged replication target options \u0027"},{"line_number":239,"context_line":"                     \u0027are mutually exclusive, you must only configure one or \u0027"},{"line_number":240,"context_line":"                     \u0027the other, both will result ina n error for invalid \u0027"},{"line_number":241,"context_line":"                     \u0027config.  Consult vendor documentation for details.\u0027)"},{"line_number":242,"context_line":"]"},{"line_number":243,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_2ac93659","line":240,"updated":"2015-08-21 02:36:07.000000000","message":"ina n -\u003e in an","commit_id":"3e00671340ed3cd82b3a320c835452c8b80b583f"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"2912dc94fd2714d9b67e5bb117b9e518cae2a155","unresolved":false,"context_lines":[{"line_number":1455,"context_line":""},{"line_number":1456,"context_line":""},{"line_number":1457,"context_line":"        :param context: security context"},{"line_number":1458,"context_line":"        :param volume: volume object returned by DB"},{"line_number":1459,"context_line":"        \"\"\""},{"line_number":1460,"context_line":""},{"line_number":1461,"context_line":"        # TODO(jdg): Put a check in at API layer to verify the host is"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_ab552ffa","line":1458,"updated":"2015-08-21 13:16:23.000000000","message":"need to add expected return value details\n\n{\u0027replication_driver_data\u0027: \u0027driver-specific-stuff-for-db\u0027 }","commit_id":"3e00671340ed3cd82b3a320c835452c8b80b583f"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"2912dc94fd2714d9b67e5bb117b9e518cae2a155","unresolved":false,"context_lines":[{"line_number":1480,"context_line":"        This is intended as an ADMIN only call to allow for"},{"line_number":1481,"context_line":"        maintenance and testing.  If a driver receives this call"},{"line_number":1482,"context_line":"        and the process fails for some reason the driver should"},{"line_number":1483,"context_line":"        return a status update to \"replication_status\u003ddisable_failed\""},{"line_number":1484,"context_line":""},{"line_number":1485,"context_line":"        :param context: security context"},{"line_number":1486,"context_line":"        :param volume: volume object returned by DB"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_b0391ef4","line":1483,"updated":"2015-08-21 13:16:23.000000000","message":"change to \"replcation_status\u003d\u0027disabled\" to reflect actual status in enable_replication","commit_id":"3e00671340ed3cd82b3a320c835452c8b80b583f"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"2912dc94fd2714d9b67e5bb117b9e518cae2a155","unresolved":false,"context_lines":[{"line_number":1483,"context_line":"        return a status update to \"replication_status\u003ddisable_failed\""},{"line_number":1484,"context_line":""},{"line_number":1485,"context_line":"        :param context: security context"},{"line_number":1486,"context_line":"        :param volume: volume object returned by DB"},{"line_number":1487,"context_line":"        \"\"\""},{"line_number":1488,"context_line":""},{"line_number":1489,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_8b3f0bb3","line":1486,"updated":"2015-08-21 13:16:23.000000000","message":"need to add expected return value details\n\n{ \u0027replication_driver_data\u0027: \u0027driver-specific-stuff-for-db\u0027 }","commit_id":"3e00671340ed3cd82b3a320c835452c8b80b583f"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"2912dc94fd2714d9b67e5bb117b9e518cae2a155","unresolved":false,"context_lines":[{"line_number":1508,"context_line":""},{"line_number":1509,"context_line":"        :param context: security context"},{"line_number":1510,"context_line":"        :param volume: volume object returned by DB"},{"line_number":1511,"context_line":"        :param secondary: Specifies rep target to fail over to"},{"line_number":1512,"context_line":"        \"\"\""},{"line_number":1513,"context_line":""},{"line_number":1514,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_8b662beb","line":1511,"updated":"2015-08-21 13:16:23.000000000","message":"need to add expected return value details\n\n{\u0027host\u0027: \u0027secondary-configured-cinder-backend\u0027\n \u0027model_update\u0027: {\u0027update-all-the-provider-info-etc\u0027},\n \u0027replication_driver_data\u0027: \u0027driver-specific-stuff-for-db\u0027\n \u0027replication_status\u0027: \u0027replication-status-of-failedover-volume\u0027}","commit_id":"3e00671340ed3cd82b3a320c835452c8b80b583f"}],"cinder/volume/manager.py":[{"author":{"_account_id":11079,"name":"TaoBai","email":"baitao5@huawei.com","username":"TaoBai"},"change_message_id":"ab90878439fad60ce602798e4b67ebed367ab38c","unresolved":false,"context_lines":[{"line_number":2620,"context_line":"            rep_driver_data \u003d self.driver.replication_enable(context,"},{"line_number":2621,"context_line":"                                                             volume,"},{"line_number":2622,"context_line":"                                                             asynchronous,"},{"line_number":2623,"context_line":"                                                             replica_count)"},{"line_number":2624,"context_line":"        except exception.CinderException:"},{"line_number":2625,"context_line":"            err_msg \u003d (_(\"Enable replication for volume failed.\"))"},{"line_number":2626,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_153f6026","line":2623,"updated":"2015-07-17 08:10:59.000000000","message":"In your design,  one backend could have more than one replica device.\nAssume: one primary backend, two backends as replica, but the parameter \"replica_count\" is 1, how could driver know on which backend should the replica volume created.","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"ae6e1f5c884e9481371f2e322f46452351da05b3","unresolved":false,"context_lines":[{"line_number":2620,"context_line":"            rep_driver_data \u003d self.driver.replication_enable(context,"},{"line_number":2621,"context_line":"                                                             volume,"},{"line_number":2622,"context_line":"                                                             asynchronous,"},{"line_number":2623,"context_line":"                                                             replica_count)"},{"line_number":2624,"context_line":"        except exception.CinderException:"},{"line_number":2625,"context_line":"            err_msg \u003d (_(\"Enable replication for volume failed.\"))"},{"line_number":2626,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_e5887ec7","line":2623,"in_reply_to":"9a41bdd9_153f6026","updated":"2015-07-22 16:10:08.000000000","message":"It\u0027s the drivers choice, if a driver implementation wants to provide the ability to give a \"hint\" or specification that\u0027s fine as well.","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"6727d177ed495c8e45bb77dd088e3869abbdc9ac","unresolved":false,"context_lines":[{"line_number":2635,"context_line":"                          resource\u003dvolume)"},{"line_number":2636,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2637,"context_line":"        self.db.volume_update(context, volume[\u0027id\u0027],"},{"line_number":2638,"context_line":"                              {\u0027replication_status\u0027: \u0027enabled\u0027})"},{"line_number":2639,"context_line":""},{"line_number":2640,"context_line":"    def disable_volume_replication(self, context, volume):"},{"line_number":2641,"context_line":"        \"\"\"Disable replicaton on the specified volume."}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_54042014","line":2638,"updated":"2015-07-12 08:46:25.000000000","message":"How do we keep this state consistent? if something bad happens at the backend and the backend actually stops the replication - how do we communicate that to Cinder? what would  be the admin actions?","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"8b92c7922454e63455eb04ac8bc382c463cfc7d6","unresolved":false,"context_lines":[{"line_number":2635,"context_line":"                          resource\u003dvolume)"},{"line_number":2636,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2637,"context_line":"        self.db.volume_update(context, volume[\u0027id\u0027],"},{"line_number":2638,"context_line":"                              {\u0027replication_status\u0027: \u0027enabled\u0027})"},{"line_number":2639,"context_line":""},{"line_number":2640,"context_line":"    def disable_volume_replication(self, context, volume):"},{"line_number":2641,"context_line":"        \"\"\"Disable replicaton on the specified volume."}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_562aad7f","line":2638,"in_reply_to":"9a41bdd9_54042014","updated":"2015-07-13 14:54:00.000000000","message":"Well, this handles consistency within \"Cinder\u0027s perspective\" better than most things we have today :)\n\nBut yes, if something happens on the backend and it pukes having a method of updating this would probably be good.  So I\u0027d propose we report errors/issues in the stats update.  I\u0027ll take a look at that.  FTR one of the most displeasing thing for me in the original code was the periodic call out to check replication status so I\u0027m intentionally avoiding that.\n\nI think it would be fine and better to again push that checking into the driver, if the driver detects that rep is broken report it back up through the updates that we already have in place.","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"9d424cea6fe0d4f8d9468f93e0344c19546a0ab8","unresolved":false,"context_lines":[{"line_number":2635,"context_line":"                          resource\u003dvolume)"},{"line_number":2636,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2637,"context_line":"        self.db.volume_update(context, volume[\u0027id\u0027],"},{"line_number":2638,"context_line":"                              {\u0027replication_status\u0027: \u0027enabled\u0027})"},{"line_number":2639,"context_line":""},{"line_number":2640,"context_line":"    def disable_volume_replication(self, context, volume):"},{"line_number":2641,"context_line":"        \"\"\"Disable replicaton on the specified volume."}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_a5d9f358","line":2638,"in_reply_to":"9a41bdd9_562aad7f","updated":"2015-07-15 22:43:02.000000000","message":"So, are you picturing that the backend driver could fire up a periodic task or something that checks to see that replication for the expected volumes is in the expected state and then takes action (prints warning messages or changes the state of the volume) in the case of a problem.  It would then be up to the driver backend to decide how we implement that?","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"ae6e1f5c884e9481371f2e322f46452351da05b3","unresolved":false,"context_lines":[{"line_number":2635,"context_line":"                          resource\u003dvolume)"},{"line_number":2636,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2637,"context_line":"        self.db.volume_update(context, volume[\u0027id\u0027],"},{"line_number":2638,"context_line":"                              {\u0027replication_status\u0027: \u0027enabled\u0027})"},{"line_number":2639,"context_line":""},{"line_number":2640,"context_line":"    def disable_volume_replication(self, context, volume):"},{"line_number":2641,"context_line":"        \"\"\"Disable replicaton on the specified volume."}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_e5af1e28","line":2638,"in_reply_to":"9a41bdd9_a5d9f358","updated":"2015-07-22 16:10:08.000000000","message":"Periodic task, part of the stats update is what I had in mind here","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":11079,"name":"TaoBai","email":"baitao5@huawei.com","username":"TaoBai"},"change_message_id":"ab90878439fad60ce602798e4b67ebed367ab38c","unresolved":false,"context_lines":[{"line_number":2684,"context_line":"        if supported/configrued."},{"line_number":2685,"context_line":""},{"line_number":2686,"context_line":"        Currently we leave it up to the driver to figure out how/what"},{"line_number":2687,"context_line":"        to do here.  Rather than play the shell game witht he volume"},{"line_number":2688,"context_line":"        or doing things like ID swaps we let the driver figure out"},{"line_number":2689,"context_line":"        how/where to route things."},{"line_number":2690,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_dbc4cf60","line":2687,"updated":"2015-07-17 08:10:59.000000000","message":"witht he  --\u003e with the","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":11079,"name":"TaoBai","email":"baitao5@huawei.com","username":"TaoBai"},"change_message_id":"ab90878439fad60ce602798e4b67ebed367ab38c","unresolved":false,"context_lines":[{"line_number":2699,"context_line":"        try:"},{"line_number":2700,"context_line":"            volume_updates \u003d self.driver.replication_failover(context,"},{"line_number":2701,"context_line":"                                                              volume,"},{"line_number":2702,"context_line":"                                                              secondary)"},{"line_number":2703,"context_line":""},{"line_number":2704,"context_line":"            # volume_updates is a dict containing a report of relevant"},{"line_number":2705,"context_line":"            # items based on the backend and how it operates or what it needs"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_4aaf877d","line":2702,"updated":"2015-07-17 08:10:59.000000000","message":"For the async replication, there is a case that maybe the secondary volume data is not synced yet. \n\n1. What should driver do in this case? Personal understanding that the failover should not be allowed.\n\n2. If the expected behaviors is failover failed,  how could user know the failure ? How could user know when is the right time to do fail-over? \n\n3. Whether should add the \"data sync status checking\" in api before this action  avoid useless fail-over","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"b410ee137d481daf2614a845b4d176a655ec4e6e","unresolved":false,"context_lines":[{"line_number":2699,"context_line":"        try:"},{"line_number":2700,"context_line":"            volume_updates \u003d self.driver.replication_failover(context,"},{"line_number":2701,"context_line":"                                                              volume,"},{"line_number":2702,"context_line":"                                                              secondary)"},{"line_number":2703,"context_line":""},{"line_number":2704,"context_line":"            # volume_updates is a dict containing a report of relevant"},{"line_number":2705,"context_line":"            # items based on the backend and how it operates or what it needs"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_ec6b82b7","line":2702,"in_reply_to":"9a41bdd9_4aaf877d","updated":"2015-07-22 19:10:36.000000000","message":"Fair point, I\u0027m going propose that the failover takes place but the volume is not attached automatically (the secondary volume) and that it\u0027s status it changed to \"failover-pending\".\n\nI\u0027ll have to figure out a clean way of updating that status when it\u0027s done/in-sync.\n\nMy impression is that most people aren\u0027t interested in replication for the sake of having replication and saying \"fail over\", but instead want to have things do automatic fail over when something goes wrong.  We could certainly improve on this, or maybe see how things go if we keep moving forward and we can get to some of these important aspects.","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"6727d177ed495c8e45bb77dd088e3869abbdc9ac","unresolved":false,"context_lines":[{"line_number":2709,"context_line":"            # model_update and replication_driver_data are required"},{"line_number":2710,"context_line":""},{"line_number":2711,"context_line":"        except exception.CinderException:"},{"line_number":2712,"context_line":"            err_msg \u003d (_(\"Disable replication for volume failed.\"))"},{"line_number":2713,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":2714,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":2715,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_b1549e54","line":2712,"updated":"2015-07-12 08:46:25.000000000","message":"Disable replication for volume failed --\u003e Failover volume operation failed (or equivalent)","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"8b92c7922454e63455eb04ac8bc382c463cfc7d6","unresolved":false,"context_lines":[{"line_number":2709,"context_line":"            # model_update and replication_driver_data are required"},{"line_number":2710,"context_line":""},{"line_number":2711,"context_line":"        except exception.CinderException:"},{"line_number":2712,"context_line":"            err_msg \u003d (_(\"Disable replication for volume failed.\"))"},{"line_number":2713,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":2714,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":2715,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_9616f5ef","line":2712,"in_reply_to":"9a41bdd9_b1549e54","updated":"2015-07-13 14:54:00.000000000","message":"Ahh... yeah, my wording there is pretty terrible :)","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"6727d177ed495c8e45bb77dd088e3869abbdc9ac","unresolved":false,"context_lines":[{"line_number":2713,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":2714,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":2715,"context_line":"        try:"},{"line_number":2716,"context_line":"            volume \u003d self.db.volume_update("},{"line_number":2717,"context_line":"                context,"},{"line_number":2718,"context_line":"                volume[\u0027id\u0027],"},{"line_number":2719,"context_line":"                volume_updates[\u0027model_update\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_11d6aac5","line":2716,"updated":"2015-07-12 08:46:25.000000000","message":"why multiple update operations for the volume instead of one? why not merge the dictionaries into one? am I missing anything?","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"8b92c7922454e63455eb04ac8bc382c463cfc7d6","unresolved":false,"context_lines":[{"line_number":2713,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":2714,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":2715,"context_line":"        try:"},{"line_number":2716,"context_line":"            volume \u003d self.db.volume_update("},{"line_number":2717,"context_line":"                context,"},{"line_number":2718,"context_line":"                volume[\u0027id\u0027],"},{"line_number":2719,"context_line":"                volume_updates[\u0027model_update\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_1680a545","line":2716,"in_reply_to":"9a41bdd9_11d6aac5","updated":"2015-07-13 14:54:00.000000000","message":"Only because this was a POC to illustrate things, so being explicit and very clear seemed like a good thing to me.  Certainly can consolidate things fi this goes forward.","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1498,"context_line":"                self.update_service_capabilities(volume_stats)"},{"line_number":1499,"context_line":""},{"line_number":1500,"context_line":"                if volume_stats.get(\u0027replication_enabled\u0027, False):"},{"line_number":1501,"context_line":"                    # replciation_status provides a concise update of"},{"line_number":1502,"context_line":"                    # replicating volumes and any error conditions"},{"line_number":1503,"context_line":"                    # detected by the driver.  The intent is we don\u0027t"},{"line_number":1504,"context_line":"                    # expect/worry about updates so long as nothing"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_3fb89174","line":1501,"updated":"2015-07-23 07:45:43.000000000","message":"\"replication_status\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"                    # expect/worry about updates so long as nothing"},{"line_number":1505,"context_line":"                    # changes, but if something goes wrong this is a"},{"line_number":1506,"context_line":"                    # handy mechanism to update the manager and the db"},{"line_number":1507,"context_line":"                    # possibly let the admin/user be notified"},{"line_number":1508,"context_line":""},{"line_number":1509,"context_line":"                    # TODO(jdg): Refactor the check/update pieces to a"},{"line_number":1510,"context_line":"                    # helper method we can share"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_ffaea92c","line":1507,"updated":"2015-07-23 07:45:43.000000000","message":"\"to possibly\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6226f148e451021092201ed3c84256d4f1159e89","unresolved":false,"context_lines":[{"line_number":1511,"context_line":"                    # We want to leverage some of the same update model"},{"line_number":1512,"context_line":"                    # that we have in the targets update call"},{"line_number":1513,"context_line":""},{"line_number":1514,"context_line":"                    replication_updates \u003d self.driver.get_replication_updates()"},{"line_number":1515,"context_line":"                    for update in replication_updates:"},{"line_number":1516,"context_line":"                        pass"},{"line_number":1517,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_7a3cc02e","line":1514,"updated":"2015-07-29 21:16:34.000000000","message":"Maybe I\u0027m missing something, where is this method declared? or is that the TODO above?","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4c69aa4145c25d18ce081c0cf484ef6cbf92bb5d","unresolved":false,"context_lines":[{"line_number":1513,"context_line":""},{"line_number":1514,"context_line":"                    replication_updates \u003d self.driver.get_replication_updates()"},{"line_number":1515,"context_line":"                    for update in replication_updates:"},{"line_number":1516,"context_line":"                        pass"},{"line_number":1517,"context_line":""},{"line_number":1518,"context_line":"    def _append_volume_stats(self, vol_stats):"},{"line_number":1519,"context_line":"        pools \u003d vol_stats.get(\u0027pools\u0027, None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_4a732b4e","line":1516,"updated":"2015-08-03 15:19:24.000000000","message":"Looks like this is a TODO item?  You want to update db entries here instead of pass?","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":17405,"name":"Jacob Gregor","email":"jgregor@us.ibm.com","username":"jgregor"},"change_message_id":"e517ddcc4fad2f4b7b02a493518d6942ff76ecdf","unresolved":false,"context_lines":[{"line_number":2636,"context_line":""},{"line_number":2637,"context_line":"        If the volume was created on a replication_enabled host this method"},{"line_number":2638,"context_line":"        is used to enable replication for the volume.  Params like async"},{"line_number":2639,"context_line":"        and replica_count make assumptions about the devices capabilities."},{"line_number":2640,"context_line":"        If the device is not capable of meeting the specfied options"},{"line_number":2641,"context_line":"        it should return an error."},{"line_number":2642,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_6bc71445","line":2639,"updated":"2015-07-29 22:05:07.000000000","message":"\"devices\" -\u003e \"device\u0027s\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":17405,"name":"Jacob Gregor","email":"jgregor@us.ibm.com","username":"jgregor"},"change_message_id":"e517ddcc4fad2f4b7b02a493518d6942ff76ecdf","unresolved":false,"context_lines":[{"line_number":2637,"context_line":"        If the volume was created on a replication_enabled host this method"},{"line_number":2638,"context_line":"        is used to enable replication for the volume.  Params like async"},{"line_number":2639,"context_line":"        and replica_count make assumptions about the devices capabilities."},{"line_number":2640,"context_line":"        If the device is not capable of meeting the specfied options"},{"line_number":2641,"context_line":"        it should return an error."},{"line_number":2642,"context_line":""},{"line_number":2643,"context_line":"        In case of a backend having num_avail_secondaries \u003e replica_count"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_cbde6810","line":2640,"updated":"2015-07-29 22:05:07.000000000","message":"\"specfied\" -\u003e \"specified\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4c69aa4145c25d18ce081c0cf484ef6cbf92bb5d","unresolved":false,"context_lines":[{"line_number":2658,"context_line":"            raise exception.InvalidVolume()"},{"line_number":2659,"context_line":""},{"line_number":2660,"context_line":"        try:"},{"line_number":2661,"context_line":"            rep_driver_data \u003d self.driver.replication_enable(context,"},{"line_number":2662,"context_line":"                                                             volume,"},{"line_number":2663,"context_line":"                                                             asynchronous,"},{"line_number":2664,"context_line":"                                                             replica_count)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_0ae203d6","line":2661,"updated":"2015-08-03 15:19:24.000000000","message":"Can we call the driver function \"replication_volume\" as well?","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"178282dfa5f746b1e313c7ee5345f24051d17418","unresolved":false,"context_lines":[{"line_number":2661,"context_line":"            rep_driver_data \u003d self.driver.replication_enable(context,"},{"line_number":2662,"context_line":"                                                             volume,"},{"line_number":2663,"context_line":"                                                             asynchronous,"},{"line_number":2664,"context_line":"                                                             replica_count)"},{"line_number":2665,"context_line":"        except exception.CinderException:"},{"line_number":2666,"context_line":"            err_msg \u003d (_(\"Enable replication for volume failed.\"))"},{"line_number":2667,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_848aeabd","line":2664,"updated":"2015-07-28 12:30:50.000000000","message":"On the backend side the enable phase takes time, usually have a \"copying\" phase before the replication is really \"active\".\nHow do we reflect that in Cinder? for example, on IBM storage you have copying-inconsistent, consistent-synchronized - both reflected an \"enabled\" volume, but failover can be executed only if the volume is in \"consistent-synchronized\".","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6226f148e451021092201ed3c84256d4f1159e89","unresolved":false,"context_lines":[{"line_number":2661,"context_line":"            rep_driver_data \u003d self.driver.replication_enable(context,"},{"line_number":2662,"context_line":"                                                             volume,"},{"line_number":2663,"context_line":"                                                             asynchronous,"},{"line_number":2664,"context_line":"                                                             replica_count)"},{"line_number":2665,"context_line":"        except exception.CinderException:"},{"line_number":2666,"context_line":"            err_msg \u003d (_(\"Enable replication for volume failed.\"))"},{"line_number":2667,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_bab6c886","line":2664,"in_reply_to":"3a50d1a3_848aeabd","updated":"2015-07-29 21:16:34.000000000","message":"I agree with Ronen, we should have some mechanism to say that a volume is being replicated but isn\u0027t ready to failover yet. Would probably need to periodically recheck these volumes or something until they are ready.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"178282dfa5f746b1e313c7ee5345f24051d17418","unresolved":false,"context_lines":[{"line_number":2665,"context_line":"        except exception.CinderException:"},{"line_number":2666,"context_line":"            err_msg \u003d (_(\"Enable replication for volume failed.\"))"},{"line_number":2667,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":2668,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":2669,"context_line":"        try:"},{"line_number":2670,"context_line":"            if rep_driver_data:"},{"line_number":2671,"context_line":"                volume \u003d self.db.volume_update(context,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_28bf36ab","line":2668,"updated":"2015-07-28 12:30:50.000000000","message":"volume stays in replication_status \u003d \u0027enabling\u0027. How do we get it out of it? should it move to replication_status \u003d \u0027error\u0027?\ncalls to replicate_volume and disable_replicate will fail on valid status check.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6226f148e451021092201ed3c84256d4f1159e89","unresolved":false,"context_lines":[{"line_number":2665,"context_line":"        except exception.CinderException:"},{"line_number":2666,"context_line":"            err_msg \u003d (_(\"Enable replication for volume failed.\"))"},{"line_number":2667,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":2668,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":2669,"context_line":"        try:"},{"line_number":2670,"context_line":"            if rep_driver_data:"},{"line_number":2671,"context_line":"                volume \u003d self.db.volume_update(context,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_7a5b6054","line":2668,"in_reply_to":"3a50d1a3_28bf36ab","updated":"2015-07-29 21:16:34.000000000","message":"+1 for an error state that you can maybe disable your way out of","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"51df979040c20c2687b1df05b2615d757b8a11a2","unresolved":false,"context_lines":[{"line_number":2665,"context_line":"        except exception.CinderException:"},{"line_number":2666,"context_line":"            err_msg \u003d (_(\"Enable replication for volume failed.\"))"},{"line_number":2667,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":2668,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":2669,"context_line":"        try:"},{"line_number":2670,"context_line":"            if rep_driver_data:"},{"line_number":2671,"context_line":"                volume \u003d self.db.volume_update(context,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_4b41f8a7","line":2668,"in_reply_to":"3a50d1a3_7a5b6054","updated":"2015-07-29 22:06:38.000000000","message":"Yeah, I like the idea of making it clear when this fails with s recovery method.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6226f148e451021092201ed3c84256d4f1159e89","unresolved":false,"context_lines":[{"line_number":2674,"context_line":"        except exception.CinderException as ex:"},{"line_number":2675,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2676,"context_line":"                          resource\u003dvolume)"},{"line_number":2677,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2678,"context_line":"        self.db.volume_update(context, volume[\u0027id\u0027],"},{"line_number":2679,"context_line":"                              {\u0027replication_status\u0027: \u0027enabled\u0027})"},{"line_number":2680,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_f509c1dd","line":2677,"updated":"2015-07-29 21:16:34.000000000","message":"Just curious is ExportFailure really the right one? Why not just raise the first one we got?\n\nShould this also roll back the replication stuff? Seems like it could put us into an inconsistent state with the backend.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4c69aa4145c25d18ce081c0cf484ef6cbf92bb5d","unresolved":false,"context_lines":[{"line_number":2674,"context_line":"        except exception.CinderException as ex:"},{"line_number":2675,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2676,"context_line":"                          resource\u003dvolume)"},{"line_number":2677,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2678,"context_line":"        self.db.volume_update(context, volume[\u0027id\u0027],"},{"line_number":2679,"context_line":"                              {\u0027replication_status\u0027: \u0027enabled\u0027})"},{"line_number":2680,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_ea5f9773","line":2677,"in_reply_to":"3a50d1a3_f509c1dd","updated":"2015-08-03 15:19:24.000000000","message":"Not sure why it is ExportFailure.  Should it raise exception.VolumeBackendAPIException instead, or just raise?  Roll back will be great, but if we can\u0027t even update database, roll back could fail as well.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":17405,"name":"Jacob Gregor","email":"jgregor@us.ibm.com","username":"jgregor"},"change_message_id":"e517ddcc4fad2f4b7b02a493518d6942ff76ecdf","unresolved":false,"context_lines":[{"line_number":2682,"context_line":"        \"\"\"Disable replicaton on the specified volume."},{"line_number":2683,"context_line":""},{"line_number":2684,"context_line":"        If the specified volume is currently replication enabled,"},{"line_number":2685,"context_line":"        this method can be used to disable the replciation process"},{"line_number":2686,"context_line":"        on the backend.  This method assumes that we checked"},{"line_number":2687,"context_line":"        replication status in the API layer to ensure we should"},{"line_number":2688,"context_line":"        send this call to the driver."}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_8b8060c0","line":2685,"updated":"2015-07-29 22:05:07.000000000","message":"\"replciation\" -\u003e \"replication\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"4c69aa4145c25d18ce081c0cf484ef6cbf92bb5d","unresolved":false,"context_lines":[{"line_number":2693,"context_line":""},{"line_number":2694,"context_line":"        volume \u003d self.db.volume_get(context, volume[\u0027id\u0027])"},{"line_number":2695,"context_line":"        if volume[\u0027replication_status\u0027] !\u003d \u0027disabling\u0027:"},{"line_number":2696,"context_line":"            raise exception.InvalidVolume()"},{"line_number":2697,"context_line":""},{"line_number":2698,"context_line":"        try:"},{"line_number":2699,"context_line":"            rep_driver_data \u003d self.driver.replication_disable(context,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_ea30f709","line":2696,"updated":"2015-08-03 15:19:24.000000000","message":"InvalidVolume(reason\u003d_(\"xxxx\"))","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"178282dfa5f746b1e313c7ee5345f24051d17418","unresolved":false,"context_lines":[{"line_number":2701,"context_line":"        except exception.CinderException:"},{"line_number":2702,"context_line":"            err_msg \u003d (_(\"Disable replication for volume failed.\"))"},{"line_number":2703,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":2704,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":2705,"context_line":"        try:"},{"line_number":2706,"context_line":"            if rep_driver_data:"},{"line_number":2707,"context_line":"                volume \u003d self.db.volume_update(context,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_99ea5a73","line":2704,"updated":"2015-07-28 12:30:50.000000000","message":"volume stays in replication_status \u003d disabling, should revent or change to \u0027error\u0027","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":2719,"context_line":"        \"\"\"Force failover to a secondary replication target."},{"line_number":2720,"context_line":""},{"line_number":2721,"context_line":"        Forces the failover action of a replicated volume to one of its"},{"line_number":2722,"context_line":"        secondar/target devices.  By default the choice of target devices"},{"line_number":2723,"context_line":"        is left up to the driver.  Inparticular we expect one way"},{"line_number":2724,"context_line":"        replication here, but are providing a mechanism for \u0027n\u0027 way"},{"line_number":2725,"context_line":"        if supported/configrued."}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_ea0a6925","line":2722,"updated":"2015-07-23 07:45:43.000000000","message":"\"secondary\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":2720,"context_line":""},{"line_number":2721,"context_line":"        Forces the failover action of a replicated volume to one of its"},{"line_number":2722,"context_line":"        secondar/target devices.  By default the choice of target devices"},{"line_number":2723,"context_line":"        is left up to the driver.  Inparticular we expect one way"},{"line_number":2724,"context_line":"        replication here, but are providing a mechanism for \u0027n\u0027 way"},{"line_number":2725,"context_line":"        if supported/configrued."},{"line_number":2726,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_aa00e102","line":2723,"updated":"2015-07-23 07:45:43.000000000","message":"\"In particular\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":2722,"context_line":"        secondar/target devices.  By default the choice of target devices"},{"line_number":2723,"context_line":"        is left up to the driver.  Inparticular we expect one way"},{"line_number":2724,"context_line":"        replication here, but are providing a mechanism for \u0027n\u0027 way"},{"line_number":2725,"context_line":"        if supported/configrued."},{"line_number":2726,"context_line":""},{"line_number":2727,"context_line":"        Currently we leave it up to the driver to figure out how/what"},{"line_number":2728,"context_line":"        to do here.  Rather than doing things like ID swaps, we instead"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_65052a0f","line":2725,"updated":"2015-07-23 07:45:43.000000000","message":"\"configured\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"178282dfa5f746b1e313c7ee5345f24051d17418","unresolved":false,"context_lines":[{"line_number":2730,"context_line":""},{"line_number":2731,"context_line":"        In cases where we might want to drop a volume-service node and"},{"line_number":2732,"context_line":"        the replication target is a configured cinder backend, we\u0027ll"},{"line_number":2733,"context_line":"        just update the host column for the volume."},{"line_number":2734,"context_line":""},{"line_number":2735,"context_line":"        :param context: security context"},{"line_number":2736,"context_line":"        :param volume: volume object returned by DB"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_b4271bb5","line":2733,"updated":"2015-07-28 12:30:50.000000000","message":"for the case where we change the volume-service, this should happen at the api or rpc level (api.py / rpcapi.py) and be routed directly to the secondary cinder volume service.\nAt this point the \"primary\" volume-service may be down, and will not be able to respond.\nThe rpc code should allow routing the \"failover\" to an alternative host is specified by the volume driver.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"54b85e1e1f80bc2b66f36f93b438bb774a943c57","unresolved":false,"context_lines":[{"line_number":2730,"context_line":""},{"line_number":2731,"context_line":"        In cases where we might want to drop a volume-service node and"},{"line_number":2732,"context_line":"        the replication target is a configured cinder backend, we\u0027ll"},{"line_number":2733,"context_line":"        just update the host column for the volume."},{"line_number":2734,"context_line":""},{"line_number":2735,"context_line":"        :param context: security context"},{"line_number":2736,"context_line":"        :param volume: volume object returned by DB"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_9bffc7aa","line":2733,"in_reply_to":"3a50d1a3_19730e17","updated":"2015-08-02 18:54:45.000000000","message":"I don\u0027t think we must update the DB, but have some kind of \"backup\" route for executing the failover logic.\nThen the \"new primary\" will handle any DB updates.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7594a7941c3b6f01bf369117846a5e22da57c06d","unresolved":false,"context_lines":[{"line_number":2730,"context_line":""},{"line_number":2731,"context_line":"        In cases where we might want to drop a volume-service node and"},{"line_number":2732,"context_line":"        the replication target is a configured cinder backend, we\u0027ll"},{"line_number":2733,"context_line":"        just update the host column for the volume."},{"line_number":2734,"context_line":""},{"line_number":2735,"context_line":"        :param context: security context"},{"line_number":2736,"context_line":"        :param volume: volume object returned by DB"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_19730e17","line":2733,"in_reply_to":"3a50d1a3_55a5159f","updated":"2015-07-31 00:07:33.000000000","message":"maybe so, I\"ll have a look.  Traditionally I\u0027m pretty much of the opinion that DB updates can and should all be done in the manager.  But I\u0027ll look at making this work for you.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"6226f148e451021092201ed3c84256d4f1159e89","unresolved":false,"context_lines":[{"line_number":2730,"context_line":""},{"line_number":2731,"context_line":"        In cases where we might want to drop a volume-service node and"},{"line_number":2732,"context_line":"        the replication target is a configured cinder backend, we\u0027ll"},{"line_number":2733,"context_line":"        just update the host column for the volume."},{"line_number":2734,"context_line":""},{"line_number":2735,"context_line":"        :param context: security context"},{"line_number":2736,"context_line":"        :param volume: volume object returned by DB"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_55a5159f","line":2733,"in_reply_to":"3a50d1a3_b4271bb5","updated":"2015-07-29 21:16:34.000000000","message":"+1 for routing the failover (or some command) to the newly promoted primary, if the c-vol service is down the other array should get a heads up that it is now the primary. I know for Pure Storage arrays we do snapshot based replication so having the heads up that we need to create a volume from one of the replicated snapshots and put it on deck would be ideal.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"178282dfa5f746b1e313c7ee5345f24051d17418","unresolved":false,"context_lines":[{"line_number":2751,"context_line":"        except exception.CinderException:"},{"line_number":2752,"context_line":"            err_msg \u003d (_(\"Replication failover for volume failed.\"))"},{"line_number":2753,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":2754,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":2755,"context_line":""},{"line_number":2756,"context_line":"        # TODO(jdg): Come back and condense thes into a single update"},{"line_number":2757,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_f4bb630d","line":2754,"updated":"2015-07-28 12:30:50.000000000","message":"how do we reflect to the users (who executed the command) that the failover didn\u0027t succeed? we would need to change the replication_status or additional db field to reflect the fact that failover failed.\nFor example, since the replicated volume is not in a synced/consistent state, secondary backend not available, etc...\n\nOtherwise this is a silent failure.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7594a7941c3b6f01bf369117846a5e22da57c06d","unresolved":false,"context_lines":[{"line_number":2751,"context_line":"        except exception.CinderException:"},{"line_number":2752,"context_line":"            err_msg \u003d (_(\"Replication failover for volume failed.\"))"},{"line_number":2753,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":2754,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":2755,"context_line":""},{"line_number":2756,"context_line":"        # TODO(jdg): Come back and condense thes into a single update"},{"line_number":2757,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_194a2ead","line":2754,"in_reply_to":"3a50d1a3_f4bb630d","updated":"2015-07-31 00:07:33.000000000","message":"yeah... I think we should probably have a replication_state \u003d \"failover_unsuccesful\" or something.  Maybe a sub-state :)","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":2753,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"},{"line_number":2754,"context_line":"            raise exception.VolumeBackendAPIException(data\u003derr_msg)"},{"line_number":2755,"context_line":""},{"line_number":2756,"context_line":"        # TODO(jdg): Come back and condense thes into a single update"},{"line_number":2757,"context_line":"        try:"},{"line_number":2758,"context_line":"            volume \u003d self.db.volume_update("},{"line_number":2759,"context_line":"                context,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_a517b243","line":2756,"updated":"2015-07-23 07:45:43.000000000","message":"\"these\"?","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":2779,"context_line":"    def get_replication_targets(self, context):"},{"line_number":2780,"context_line":"        \"\"\"Provide a means to obtain replication targets for a device."},{"line_number":2781,"context_line":""},{"line_number":2782,"context_line":"        This method isused to query a backend to get it\u0027s current"},{"line_number":2783,"context_line":"        replciation config info.  Primarily this is intended to provide"},{"line_number":2784,"context_line":"        properly formatted info containing \"what\" targets are configured."},{"line_number":2785,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_a52ed289","line":2782,"updated":"2015-07-23 07:45:43.000000000","message":"\"is used\", \"its\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":2780,"context_line":"        \"\"\"Provide a means to obtain replication targets for a device."},{"line_number":2781,"context_line":""},{"line_number":2782,"context_line":"        This method isused to query a backend to get it\u0027s current"},{"line_number":2783,"context_line":"        replciation config info.  Primarily this is intended to provide"},{"line_number":2784,"context_line":"        properly formatted info containing \"what\" targets are configured."},{"line_number":2785,"context_line":""},{"line_number":2786,"context_line":"        In the case of no-targets configured, the driver should return"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_45502e0b","line":2783,"updated":"2015-07-23 07:45:43.000000000","message":"\"replication\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":2788,"context_line":"        update_replication_targets) with the values set to None."},{"line_number":2789,"context_line":""},{"line_number":2790,"context_line":"        This provides a handy mechanism for an admin to ensure he/she"},{"line_number":2791,"context_line":"        sends properl formatted data to teh backend when updating targets."},{"line_number":2792,"context_line":""},{"line_number":2793,"context_line":"        Example response:"},{"line_number":2794,"context_line":"        [{remote_targets:[{san_ip: xxx, san_login: xxx, san_password: xxxx,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_25596235","line":2791,"updated":"2015-07-23 07:45:43.000000000","message":"\"properly\", \"the\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"178282dfa5f746b1e313c7ee5345f24051d17418","unresolved":false,"context_lines":[{"line_number":2793,"context_line":"        Example response:"},{"line_number":2794,"context_line":"        [{remote_targets:[{san_ip: xxx, san_login: xxx, san_password: xxxx,"},{"line_number":2795,"context_line":"                           san_password: xxx, status: \u003cenabled|disabled\u003e},"},{"line_number":2796,"context_line":"                          ...{}],"},{"line_number":2797,"context_line":"         {cinder_hosts: [volume_backend_name,....]}]"},{"line_number":2798,"context_line":""},{"line_number":2799,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_59dfebd5","line":2796,"updated":"2015-07-28 12:30:50.000000000","message":"I am concerned of who has access to access information. Who can run those APIs? haven\u0027t seen the policy for these API commands.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"54b85e1e1f80bc2b66f36f93b438bb774a943c57","unresolved":false,"context_lines":[{"line_number":2793,"context_line":"        Example response:"},{"line_number":2794,"context_line":"        [{remote_targets:[{san_ip: xxx, san_login: xxx, san_password: xxxx,"},{"line_number":2795,"context_line":"                           san_password: xxx, status: \u003cenabled|disabled\u003e},"},{"line_number":2796,"context_line":"                          ...{}],"},{"line_number":2797,"context_line":"         {cinder_hosts: [volume_backend_name,....]}]"},{"line_number":2798,"context_line":""},{"line_number":2799,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_3b279364","line":2796,"in_reply_to":"3a50d1a3_39da8aea","updated":"2015-08-02 18:54:45.000000000","message":"I am just concerned about keeping password, however, there may be no better alternative.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"51df979040c20c2687b1df05b2615d757b8a11a2","unresolved":false,"context_lines":[{"line_number":2793,"context_line":"        Example response:"},{"line_number":2794,"context_line":"        [{remote_targets:[{san_ip: xxx, san_login: xxx, san_password: xxxx,"},{"line_number":2795,"context_line":"                           san_password: xxx, status: \u003cenabled|disabled\u003e},"},{"line_number":2796,"context_line":"                          ...{}],"},{"line_number":2797,"context_line":"         {cinder_hosts: [volume_backend_name,....]}]"},{"line_number":2798,"context_line":""},{"line_number":2799,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_8b9ce00e","line":2796,"in_reply_to":"3a50d1a3_59dfebd5","updated":"2015-07-29 22:06:38.000000000","message":"Agreed, this, for sure should be admin only.  Maybe the same for some of the other commands.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7594a7941c3b6f01bf369117846a5e22da57c06d","unresolved":false,"context_lines":[{"line_number":2793,"context_line":"        Example response:"},{"line_number":2794,"context_line":"        [{remote_targets:[{san_ip: xxx, san_login: xxx, san_password: xxxx,"},{"line_number":2795,"context_line":"                           san_password: xxx, status: \u003cenabled|disabled\u003e},"},{"line_number":2796,"context_line":"                          ...{}],"},{"line_number":2797,"context_line":"         {cinder_hosts: [volume_backend_name,....]}]"},{"line_number":2798,"context_line":""},{"line_number":2799,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_39da8aea","line":2796,"in_reply_to":"3a50d1a3_8b9ce00e","updated":"2015-07-31 00:07:33.000000000","message":"yes, I thought it was clear that these calls are ALL admin calls.  I can certainly remove this info though.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":2811,"context_line":"    def update_replication_targets(self, context, device_info, enable\u003dTrue):"},{"line_number":2812,"context_line":"        \"\"\"Provides a means to pass in a new secondary device to a backend."},{"line_number":2813,"context_line":""},{"line_number":2814,"context_line":"        While we can use config entries for this to setup replication tarets"},{"line_number":2815,"context_line":"        for a device, it may be handy to be more dynamic and provide a"},{"line_number":2816,"context_line":"        mechanism via the APi to eanble/disable devices dynamically."},{"line_number":2817,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_4577ce9f","line":2814,"updated":"2015-07-23 07:45:43.000000000","message":"\"targets\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":2813,"context_line":""},{"line_number":2814,"context_line":"        While we can use config entries for this to setup replication tarets"},{"line_number":2815,"context_line":"        for a device, it may be handy to be more dynamic and provide a"},{"line_number":2816,"context_line":"        mechanism via the APi to eanble/disable devices dynamically."},{"line_number":2817,"context_line":""},{"line_number":2818,"context_line":"        The backend device should also use this to determine if it shoudl set"},{"line_number":2819,"context_line":"        replication_enabled \u003d T/F as a string in it\u0027s capability reporting"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_657a0a8a","line":2816,"updated":"2015-07-23 07:45:43.000000000","message":"\"API\", \"enable\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":2815,"context_line":"        for a device, it may be handy to be more dynamic and provide a"},{"line_number":2816,"context_line":"        mechanism via the APi to eanble/disable devices dynamically."},{"line_number":2817,"context_line":""},{"line_number":2818,"context_line":"        The backend device should also use this to determine if it shoudl set"},{"line_number":2819,"context_line":"        replication_enabled \u003d T/F as a string in it\u0027s capability reporting"},{"line_number":2820,"context_line":""},{"line_number":2821,"context_line":"        This also means that if a volume is actively being replicated"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_257082a3","line":2818,"updated":"2015-07-23 07:45:43.000000000","message":"\"should\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":2819,"context_line":"        replication_enabled \u003d T/F as a string in it\u0027s capability reporting"},{"line_number":2820,"context_line":""},{"line_number":2821,"context_line":"        This also means that if a volume is actively being replicated"},{"line_number":2822,"context_line":"        on the backend and it\u0027s target is disabled, that the replication"},{"line_number":2823,"context_line":"        status needs to be updated to reflect that the voume is no longer"},{"line_number":2824,"context_line":"        being replicated and the driver should clean up the target as"},{"line_number":2825,"context_line":"        well."}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_65a1aaf7","line":2822,"updated":"2015-07-23 07:45:43.000000000","message":"\"its\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":2820,"context_line":""},{"line_number":2821,"context_line":"        This also means that if a volume is actively being replicated"},{"line_number":2822,"context_line":"        on the backend and it\u0027s target is disabled, that the replication"},{"line_number":2823,"context_line":"        status needs to be updated to reflect that the voume is no longer"},{"line_number":2824,"context_line":"        being replicated and the driver should clean up the target as"},{"line_number":2825,"context_line":"        well."},{"line_number":2826,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_25a7220c","line":2823,"updated":"2015-07-23 07:45:43.000000000","message":"\"volume\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":2826,"context_line":""},{"line_number":2827,"context_line":"        :param context: security context"},{"line_number":2828,"context_line":"        :param target_info: dict containing secondary device to add/remove"},{"line_number":2829,"context_line":"        :param enable: enables/disables replication to speified device"},{"line_number":2830,"context_line":""},{"line_number":2831,"context_line":"        :return volume_updates: We return a list of any volumes that"},{"line_number":2832,"context_line":"        will be impacted by the targets update call.  This may be that"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_6588ca71","line":2829,"updated":"2015-07-23 07:45:43.000000000","message":"\"specified\"","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"178282dfa5f746b1e313c7ee5345f24051d17418","unresolved":false,"context_lines":[{"line_number":2837,"context_line":"        \"\"\""},{"line_number":2838,"context_line":""},{"line_number":2839,"context_line":"        try:"},{"line_number":2840,"context_line":"            volume_updates \u003d self.driver.update_replication_targets("},{"line_number":2841,"context_line":"                context,"},{"line_number":2842,"context_line":"                device_info,"},{"line_number":2843,"context_line":"                enable)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_591a8bc7","line":2840,"updated":"2015-07-28 12:30:50.000000000","message":"if a backend does not have a repository to store this info? should there be a generic location (db?) to keep this?","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7594a7941c3b6f01bf369117846a5e22da57c06d","unresolved":false,"context_lines":[{"line_number":2837,"context_line":"        \"\"\""},{"line_number":2838,"context_line":""},{"line_number":2839,"context_line":"        try:"},{"line_number":2840,"context_line":"            volume_updates \u003d self.driver.update_replication_targets("},{"line_number":2841,"context_line":"                context,"},{"line_number":2842,"context_line":"                device_info,"},{"line_number":2843,"context_line":"                enable)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_d9f1266c","line":2840,"in_reply_to":"3a50d1a3_591a8bc7","updated":"2015-07-31 00:07:33.000000000","message":"This entire method was just an \"idea\" instead of getting any feedback on whether it was something anybody wanted to think about offering to be available or not it\u0027s instead turned into a full on review.\n\nyes, we would most certainly need some persistent store for this.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"54b85e1e1f80bc2b66f36f93b438bb774a943c57","unresolved":false,"context_lines":[{"line_number":2837,"context_line":"        \"\"\""},{"line_number":2838,"context_line":""},{"line_number":2839,"context_line":"        try:"},{"line_number":2840,"context_line":"            volume_updates \u003d self.driver.update_replication_targets("},{"line_number":2841,"context_line":"                context,"},{"line_number":2842,"context_line":"                device_info,"},{"line_number":2843,"context_line":"                enable)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_9b16e7f0","line":2840,"in_reply_to":"3a50d1a3_d9f1266c","updated":"2015-08-02 18:54:45.000000000","message":"I like the notion of having a dynamic setup/config rather than doing so as part of cinder.conf","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":14339,"name":"Philipp Marek","email":"philipp.marek@linbit.com","username":"pmarek"},"change_message_id":"c9596ccdca0e098b8f5d18da9ea3e0a1d962513c","unresolved":false,"context_lines":[{"line_number":2861,"context_line":"                updated_rep_status \u003d \\"},{"line_number":2862,"context_line":"                    v.get(\u0027replication_status\u0027, None)"},{"line_number":2863,"context_line":"                updated_rep_extstatus \u003d \\"},{"line_number":2864,"context_line":"                    v.get(\u0027replication_extended_status\u0027, None)"},{"line_number":2865,"context_line":""},{"line_number":2866,"context_line":"                if updated_model:"},{"line_number":2867,"context_line":"                    updates[\u0027model_update\u0027] \u003d updated_model"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_45ecae29","line":2864,"updated":"2015-07-23 07:45:43.000000000","message":"Haven\u0027t seen that anywhere, is that like \"initial sync 39% done\"?","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7594a7941c3b6f01bf369117846a5e22da57c06d","unresolved":false,"context_lines":[{"line_number":2861,"context_line":"                updated_rep_status \u003d \\"},{"line_number":2862,"context_line":"                    v.get(\u0027replication_status\u0027, None)"},{"line_number":2863,"context_line":"                updated_rep_extstatus \u003d \\"},{"line_number":2864,"context_line":"                    v.get(\u0027replication_extended_status\u0027, None)"},{"line_number":2865,"context_line":""},{"line_number":2866,"context_line":"                if updated_model:"},{"line_number":2867,"context_line":"                    updates[\u0027model_update\u0027] \u003d updated_model"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_d998461e","line":2864,"in_reply_to":"3a50d1a3_45ecae29","updated":"2015-07-31 00:07:33.000000000","message":"You\u0027ll have to ask Ronen","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"54b85e1e1f80bc2b66f36f93b438bb774a943c57","unresolved":false,"context_lines":[{"line_number":2861,"context_line":"                updated_rep_status \u003d \\"},{"line_number":2862,"context_line":"                    v.get(\u0027replication_status\u0027, None)"},{"line_number":2863,"context_line":"                updated_rep_extstatus \u003d \\"},{"line_number":2864,"context_line":"                    v.get(\u0027replication_extended_status\u0027, None)"},{"line_number":2865,"context_line":""},{"line_number":2866,"context_line":"                if updated_model:"},{"line_number":2867,"context_line":"                    updates[\u0027model_update\u0027] \u003d updated_model"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_7ba67bc2","line":2864,"in_reply_to":"3a50d1a3_d998461e","updated":"2015-08-02 18:54:45.000000000","message":"I have always looked at \u0027replication_extended_status\u0027 as the place where the driver keeps the detailed status of replication and any related actions.\nThis would be the driver mechanism to keep the OpenStack admin of what is happening at the backend - e.g., still coping, lost network connectivity to secondary....\nJust to make sure nothing fails silently.","commit_id":"eb4d14cd15105d8c6b8e3df0b7088908f62fc628"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"class VolumeManager(manager.SchedulerDependentManager):"},{"line_number":190,"context_line":"    \"\"\"Manages attachable block storage devices.\"\"\""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    RPC_API_VERSION \u003d \u00271.25\u0027"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    target \u003d messaging.Target(version\u003dRPC_API_VERSION)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_38a5d0b4","line":191,"updated":"2015-08-07 22:46:10.000000000","message":"RPC_API_VERSION should be bumped to \u00271.26\u0027","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"class VolumeManager(manager.SchedulerDependentManager):"},{"line_number":190,"context_line":"    \"\"\"Manages attachable block storage devices.\"\"\""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    RPC_API_VERSION \u003d \u00271.25\u0027"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    target \u003d messaging.Target(version\u003dRPC_API_VERSION)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_47d9e121","line":191,"in_reply_to":"1a4dcd0f_38a5d0b4","updated":"2015-08-13 19:26:44.000000000","message":"Yeah, the problem with these long running patches are people beat you to things like the version bumps, in fact since you\u0027re review it\u0027s now 1.27  :(","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"37ceb72e6ed0115cdfc269030816fb2599f6f718","unresolved":false,"context_lines":[{"line_number":1519,"context_line":""},{"line_number":1520,"context_line":"                    replication_updates \u003d self.driver.get_replication_updates()"},{"line_number":1521,"context_line":"                    for update in replication_updates:"},{"line_number":1522,"context_line":"                        pass"},{"line_number":1523,"context_line":""},{"line_number":1524,"context_line":"    def _append_volume_stats(self, vol_stats):"},{"line_number":1525,"context_line":"        pools \u003d vol_stats.get(\u0027pools\u0027, None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_96f16703","line":1522,"updated":"2015-08-07 16:07:28.000000000","message":"Is the goal here to update the volume stats structure returned with all replication status, or just updates for specific changes?\n\nI wonder if it is something we should do with this frequency as it takes a little more overhead to collect all of that info if there are a significant number of replications.","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":1519,"context_line":""},{"line_number":1520,"context_line":"                    replication_updates \u003d self.driver.get_replication_updates()"},{"line_number":1521,"context_line":"                    for update in replication_updates:"},{"line_number":1522,"context_line":"                        pass"},{"line_number":1523,"context_line":""},{"line_number":1524,"context_line":"    def _append_volume_stats(self, vol_stats):"},{"line_number":1525,"context_line":"        pools \u003d vol_stats.get(\u0027pools\u0027, None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_c78091c2","line":1522,"in_reply_to":"1a4dcd0f_96f16703","updated":"2015-08-13 19:26:44.000000000","message":"My intent was it was update/general info only.  The comment above might not be very clear.\n\nI\u0027d prefer to keep this simple like \"ok\" or \"error\" and not a whole ton more; but then provide another call if needed to get details.  Still need to work that out a bit.","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"37ceb72e6ed0115cdfc269030816fb2599f6f718","unresolved":false,"context_lines":[{"line_number":2753,"context_line":"        except exception.CinderException as ex:"},{"line_number":2754,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2755,"context_line":"                          resource\u003dvolume)"},{"line_number":2756,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2757,"context_line":"        self.db.volume_update(context, volume[\u0027id\u0027],"},{"line_number":2758,"context_line":"                              {\u0027replication_status\u0027: \u0027enabled\u0027})"},{"line_number":2759,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_76ccdb88","line":2756,"updated":"2015-08-07 16:07:28.000000000","message":"Fairly harmless, but six.text_type ends up being redundant here since CinderException will handle it internally.\n\nhttps://github.com/openstack/cinder/blob/master/cinder/exception.py#L85","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":2753,"context_line":"        except exception.CinderException as ex:"},{"line_number":2754,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2755,"context_line":"                          resource\u003dvolume)"},{"line_number":2756,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2757,"context_line":"        self.db.volume_update(context, volume[\u0027id\u0027],"},{"line_number":2758,"context_line":"                              {\u0027replication_status\u0027: \u0027enabled\u0027})"},{"line_number":2759,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_07c51909","line":2756,"in_reply_to":"1a4dcd0f_76ccdb88","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":2753,"context_line":"        except exception.CinderException as ex:"},{"line_number":2754,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2755,"context_line":"                          resource\u003dvolume)"},{"line_number":2756,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2757,"context_line":"        self.db.volume_update(context, volume[\u0027id\u0027],"},{"line_number":2758,"context_line":"                              {\u0027replication_status\u0027: \u0027enabled\u0027})"},{"line_number":2759,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_d8562cce","line":2756,"in_reply_to":"1a4dcd0f_76ccdb88","updated":"2015-08-07 22:46:10.000000000","message":"Should this be a VolumeBackendAPIException instead of ExportFailure?","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":2753,"context_line":"        except exception.CinderException as ex:"},{"line_number":2754,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2755,"context_line":"                          resource\u003dvolume)"},{"line_number":2756,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2757,"context_line":"        self.db.volume_update(context, volume[\u0027id\u0027],"},{"line_number":2758,"context_line":"                              {\u0027replication_status\u0027: \u0027enabled\u0027})"},{"line_number":2759,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_e7d34dd4","line":2756,"in_reply_to":"1a4dcd0f_d8562cce","updated":"2015-08-13 19:26:44.000000000","message":"Indeed, thanks! (copy paste strikes again :) )","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":7111,"name":"hadi esiely","email":"hadi.esiely-barrera@jhuapl.edu","username":"HEsiely"},"change_message_id":"f23c2e882472c3148b2577a66d40350a9362ff4f","unresolved":false,"context_lines":[{"line_number":2761,"context_line":"        \"\"\"Disable replicaton on the specified volume."},{"line_number":2762,"context_line":""},{"line_number":2763,"context_line":"        If the specified volume is currently replication enabled,"},{"line_number":2764,"context_line":"        this method can be used to disable the replciation process"},{"line_number":2765,"context_line":"        on the backend.  This method assumes that we checked"},{"line_number":2766,"context_line":"        replication status in the API layer to ensure we should"},{"line_number":2767,"context_line":"        send this call to the driver."}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_2041a063","line":2764,"updated":"2015-08-11 15:24:04.000000000","message":"replication","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":2761,"context_line":"        \"\"\"Disable replicaton on the specified volume."},{"line_number":2762,"context_line":""},{"line_number":2763,"context_line":"        If the specified volume is currently replication enabled,"},{"line_number":2764,"context_line":"        this method can be used to disable the replciation process"},{"line_number":2765,"context_line":"        on the backend.  This method assumes that we checked"},{"line_number":2766,"context_line":"        replication status in the API layer to ensure we should"},{"line_number":2767,"context_line":"        send this call to the driver."}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_c7e5f1a4","line":2764,"in_reply_to":"1a4dcd0f_2041a063","updated":"2015-08-13 19:26:44.000000000","message":"You missed the one above, but I\u0027ll give ya 2 for 1 :)","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"37ceb72e6ed0115cdfc269030816fb2599f6f718","unresolved":false,"context_lines":[{"line_number":2789,"context_line":"        except exception.CinderException as ex:"},{"line_number":2790,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2791,"context_line":"                          resource\u003dvolume)"},{"line_number":2792,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2793,"context_line":"        self.db.volume_update(context,"},{"line_number":2794,"context_line":"                              volume[\u0027id\u0027],"},{"line_number":2795,"context_line":"                              {\u0027replication_status\u0027: \u0027disabled\u0027})"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_169eb762","line":2792,"updated":"2015-08-07 16:07:28.000000000","message":"Same.","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":2789,"context_line":"        except exception.CinderException as ex:"},{"line_number":2790,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2791,"context_line":"                          resource\u003dvolume)"},{"line_number":2792,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2793,"context_line":"        self.db.volume_update(context,"},{"line_number":2794,"context_line":"                              volume[\u0027id\u0027],"},{"line_number":2795,"context_line":"                              {\u0027replication_status\u0027: \u0027disabled\u0027})"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_a7fd453d","line":2792,"in_reply_to":"1a4dcd0f_169eb762","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":2789,"context_line":"        except exception.CinderException as ex:"},{"line_number":2790,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2791,"context_line":"                          resource\u003dvolume)"},{"line_number":2792,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2793,"context_line":"        self.db.volume_update(context,"},{"line_number":2794,"context_line":"                              volume[\u0027id\u0027],"},{"line_number":2795,"context_line":"                              {\u0027replication_status\u0027: \u0027disabled\u0027})"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_180494c4","line":2792,"in_reply_to":"1a4dcd0f_169eb762","updated":"2015-08-07 22:46:10.000000000","message":"Same comments here.  Should this be a VolumeBackendAPIException instead of ExportFailure?","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":2789,"context_line":"        except exception.CinderException as ex:"},{"line_number":2790,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2791,"context_line":"                          resource\u003dvolume)"},{"line_number":2792,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2793,"context_line":"        self.db.volume_update(context,"},{"line_number":2794,"context_line":"                              volume[\u0027id\u0027],"},{"line_number":2795,"context_line":"                              {\u0027replication_status\u0027: \u0027disabled\u0027})"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_47fa4145","line":2792,"in_reply_to":"1a4dcd0f_180494c4","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":7111,"name":"hadi esiely","email":"hadi.esiely-barrera@jhuapl.edu","username":"HEsiely"},"change_message_id":"f23c2e882472c3148b2577a66d40350a9362ff4f","unresolved":false,"context_lines":[{"line_number":2798,"context_line":"        \"\"\"Force failover to a secondary replication target."},{"line_number":2799,"context_line":""},{"line_number":2800,"context_line":"        Forces the failover action of a replicated volume to one of its"},{"line_number":2801,"context_line":"        secondar/target devices.  By default the choice of target devices"},{"line_number":2802,"context_line":"        is left up to the driver.  Inparticular we expect one way"},{"line_number":2803,"context_line":"        replication here, but are providing a mechanism for \u0027n\u0027 way"},{"line_number":2804,"context_line":"        if supported/configrued."}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_54dfcd39","line":2801,"updated":"2015-08-11 15:24:04.000000000","message":"secondary","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":2798,"context_line":"        \"\"\"Force failover to a secondary replication target."},{"line_number":2799,"context_line":""},{"line_number":2800,"context_line":"        Forces the failover action of a replicated volume to one of its"},{"line_number":2801,"context_line":"        secondar/target devices.  By default the choice of target devices"},{"line_number":2802,"context_line":"        is left up to the driver.  Inparticular we expect one way"},{"line_number":2803,"context_line":"        replication here, but are providing a mechanism for \u0027n\u0027 way"},{"line_number":2804,"context_line":"        if supported/configrued."}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_8787e9b5","line":2801,"in_reply_to":"1a4dcd0f_54dfcd39","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":7111,"name":"hadi esiely","email":"hadi.esiely-barrera@jhuapl.edu","username":"HEsiely"},"change_message_id":"f23c2e882472c3148b2577a66d40350a9362ff4f","unresolved":false,"context_lines":[{"line_number":2799,"context_line":""},{"line_number":2800,"context_line":"        Forces the failover action of a replicated volume to one of its"},{"line_number":2801,"context_line":"        secondar/target devices.  By default the choice of target devices"},{"line_number":2802,"context_line":"        is left up to the driver.  Inparticular we expect one way"},{"line_number":2803,"context_line":"        replication here, but are providing a mechanism for \u0027n\u0027 way"},{"line_number":2804,"context_line":"        if supported/configrued."},{"line_number":2805,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_d4ebddda","line":2802,"updated":"2015-08-11 15:24:04.000000000","message":"In particular","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":2799,"context_line":""},{"line_number":2800,"context_line":"        Forces the failover action of a replicated volume to one of its"},{"line_number":2801,"context_line":"        secondar/target devices.  By default the choice of target devices"},{"line_number":2802,"context_line":"        is left up to the driver.  Inparticular we expect one way"},{"line_number":2803,"context_line":"        replication here, but are providing a mechanism for \u0027n\u0027 way"},{"line_number":2804,"context_line":"        if supported/configrued."},{"line_number":2805,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_a78465b1","line":2802,"in_reply_to":"1a4dcd0f_d4ebddda","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"37ceb72e6ed0115cdfc269030816fb2599f6f718","unresolved":false,"context_lines":[{"line_number":2853,"context_line":"        except exception.CinderException as ex:"},{"line_number":2854,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2855,"context_line":"                          resource\u003dvolume)"},{"line_number":2856,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2857,"context_line":""},{"line_number":2858,"context_line":"    def get_replication_targets(self, context):"},{"line_number":2859,"context_line":"        \"\"\"Provide a means to obtain replication targets for a device."}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_96972739","line":2856,"updated":"2015-08-07 16:07:28.000000000","message":"Same.","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":2853,"context_line":"        except exception.CinderException as ex:"},{"line_number":2854,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2855,"context_line":"                          resource\u003dvolume)"},{"line_number":2856,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2857,"context_line":""},{"line_number":2858,"context_line":"    def get_replication_targets(self, context):"},{"line_number":2859,"context_line":"        \"\"\"Provide a means to obtain replication targets for a device."}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_e7b82d78","line":2856,"in_reply_to":"1a4dcd0f_96972739","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":2853,"context_line":"        except exception.CinderException as ex:"},{"line_number":2854,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2855,"context_line":"                          resource\u003dvolume)"},{"line_number":2856,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2857,"context_line":""},{"line_number":2858,"context_line":"    def get_replication_targets(self, context):"},{"line_number":2859,"context_line":"        \"\"\"Provide a means to obtain replication targets for a device."}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_f829a838","line":2856,"in_reply_to":"1a4dcd0f_96972739","updated":"2015-08-07 22:46:10.000000000","message":"Same comment about ExportFailure.","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":2853,"context_line":"        except exception.CinderException as ex:"},{"line_number":2854,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2855,"context_line":"                          resource\u003dvolume)"},{"line_number":2856,"context_line":"            raise exception.ExportFailure(reason\u003dsix.text_type(ex))"},{"line_number":2857,"context_line":""},{"line_number":2858,"context_line":"    def get_replication_targets(self, context):"},{"line_number":2859,"context_line":"        \"\"\"Provide a means to obtain replication targets for a device."}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_a7ab051e","line":2856,"in_reply_to":"1a4dcd0f_f829a838","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":7111,"name":"hadi esiely","email":"hadi.esiely-barrera@jhuapl.edu","username":"HEsiely"},"change_message_id":"f23c2e882472c3148b2577a66d40350a9362ff4f","unresolved":false,"context_lines":[{"line_number":2866,"context_line":"        the data structure it expects with empty fields."},{"line_number":2867,"context_line":""},{"line_number":2868,"context_line":"        This provides a handy mechanism for an admin to ensure he/she"},{"line_number":2869,"context_line":"        sends properl formatted data to teh backend when updating targets."},{"line_number":2870,"context_line":""},{"line_number":2871,"context_line":"        Example response:"},{"line_number":2872,"context_line":"        [{remote_targets:[{san_ip: xxx, san_login: xxx, san_password: xxxx,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_94e315d9","line":2869,"updated":"2015-08-11 15:24:04.000000000","message":"properly formatted data to the backend","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":2866,"context_line":"        the data structure it expects with empty fields."},{"line_number":2867,"context_line":""},{"line_number":2868,"context_line":"        This provides a handy mechanism for an admin to ensure he/she"},{"line_number":2869,"context_line":"        sends properl formatted data to teh backend when updating targets."},{"line_number":2870,"context_line":""},{"line_number":2871,"context_line":"        Example response:"},{"line_number":2872,"context_line":"        [{remote_targets:[{san_ip: xxx, san_login: xxx, san_password: xxxx,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_2766152a","line":2869,"in_reply_to":"1a4dcd0f_94e315d9","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"81c8f6f3df2e4f240c7cd049f3b28a303d8ec2db","unresolved":false,"context_lines":[{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        # conditionally run replication status task"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"        # FIXME(jdg): This should go away or be handled differently"},{"line_number":390,"context_line":"        #  if/when we\u0027re ready for V2 replication"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        stats \u003d self.driver.get_volume_stats(refresh\u003dTrue)"},{"line_number":393,"context_line":"        if stats and stats.get(\u0027replication\u0027, False):"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_c55319e1","line":390,"range":{"start_line":389,"start_character":8,"end_line":390,"end_character":49},"updated":"2015-08-19 18:42:19.000000000","message":"Does this need to be done before this patchset can be merged?","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"2f6deca92ffa617fcfaf2f84fdec98750a09b5b1","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        # conditionally run replication status task"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"        # FIXME(jdg): This should go away or be handled differently"},{"line_number":390,"context_line":"        #  if/when we\u0027re ready for V2 replication"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        stats \u003d self.driver.get_volume_stats(refresh\u003dTrue)"},{"line_number":393,"context_line":"        if stats and stats.get(\u0027replication\u0027, False):"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_d5c71662","line":390,"in_reply_to":"fa1b9901_c55319e1","updated":"2015-08-20 16:28:53.000000000","message":"I wrote things so they can coexist and IBM can keeep things running if they want.  My plan was after this merges to mark the old stuff as deprecated.","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"81c8f6f3df2e4f240c7cd049f3b28a303d8ec2db","unresolved":false,"context_lines":[{"line_number":1517,"context_line":"                    # We want to leverage some of the same update model"},{"line_number":1518,"context_line":"                    # that we have in the targets update call"},{"line_number":1519,"context_line":""},{"line_number":1520,"context_line":"                    replication_updates \u003d self.driver.get_replication_updates()"},{"line_number":1521,"context_line":"                    for update in replication_updates:"},{"line_number":1522,"context_line":"                        pass"},{"line_number":1523,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_25ce9582","line":1520,"updated":"2015-08-19 18:42:19.000000000","message":"Is this something added in to the driver api for v2 replication? I didn\u0027t see it in the ReplicationV2VD class.","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"81c8f6f3df2e4f240c7cd049f3b28a303d8ec2db","unresolved":false,"context_lines":[{"line_number":2685,"context_line":"                                  model_update)"},{"line_number":2686,"context_line":""},{"line_number":2687,"context_line":"    # Replication V2 methods"},{"line_number":2688,"context_line":"    def enable_replication(self, context,"},{"line_number":2689,"context_line":"                           volume, asynchronous\u003dTrue,"},{"line_number":2690,"context_line":"                           replica_count\u003d1):"},{"line_number":2691,"context_line":"        \"\"\"Enable replication on a replication capable volume."},{"line_number":2692,"context_line":""},{"line_number":2693,"context_line":"        If the volume was created on a replication_enabled host this method"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_85b8c1c9","line":2690,"range":{"start_line":2688,"start_character":0,"end_line":2690,"end_character":44},"updated":"2015-08-19 18:42:19.000000000","message":"I don\u0027t think it needs the asnychronous or replica_count args anymore, right?","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d50049087901acd1453adad0f59c43eba2f552f4","unresolved":false,"context_lines":[{"line_number":2687,"context_line":"    # Replication V2 methods"},{"line_number":2688,"context_line":"    def enable_replication(self, context,"},{"line_number":2689,"context_line":"                           volume, asynchronous\u003dTrue,"},{"line_number":2690,"context_line":"                           replica_count\u003d1):"},{"line_number":2691,"context_line":"        \"\"\"Enable replication on a replication capable volume."},{"line_number":2692,"context_line":""},{"line_number":2693,"context_line":"        If the volume was created on a replication_enabled host this method"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_98d49cbd","line":2690,"in_reply_to":"fa1b9901_85b8c1c9","updated":"2015-08-20 01:29:14.000000000","message":"+1.  These are already removed from API.  So they should be removed from manager API as well.","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"81c8f6f3df2e4f240c7cd049f3b28a303d8ec2db","unresolved":false,"context_lines":[{"line_number":2714,"context_line":"            raise exception.InvalidVolume()"},{"line_number":2715,"context_line":""},{"line_number":2716,"context_line":"        try:"},{"line_number":2717,"context_line":"            rep_driver_data \u003d self.driver.replication_enable(context,"},{"line_number":2718,"context_line":"                                                             volume,"},{"line_number":2719,"context_line":"                                                             asynchronous,"},{"line_number":2720,"context_line":"                                                             replica_count)"},{"line_number":2721,"context_line":"        except exception.CinderException:"},{"line_number":2722,"context_line":"            err_msg \u003d (_(\"Enable replication for volume failed.\"))"},{"line_number":2723,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_05d4b1e9","line":2720,"range":{"start_line":2717,"start_character":0,"end_line":2720,"end_character":74},"updated":"2015-08-19 18:42:19.000000000","message":"This is out of sync with the driver bass class method definition.","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d50049087901acd1453adad0f59c43eba2f552f4","unresolved":false,"context_lines":[{"line_number":2717,"context_line":"            rep_driver_data \u003d self.driver.replication_enable(context,"},{"line_number":2718,"context_line":"                                                             volume,"},{"line_number":2719,"context_line":"                                                             asynchronous,"},{"line_number":2720,"context_line":"                                                             replica_count)"},{"line_number":2721,"context_line":"        except exception.CinderException:"},{"line_number":2722,"context_line":"            err_msg \u003d (_(\"Enable replication for volume failed.\"))"},{"line_number":2723,"context_line":"            LOG.exception(err_msg, resource\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_188f2ccd","line":2720,"in_reply_to":"fa1b9901_05d4b1e9","updated":"2015-08-20 01:29:14.000000000","message":"+1","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"81c8f6f3df2e4f240c7cd049f3b28a303d8ec2db","unresolved":false,"context_lines":[{"line_number":2799,"context_line":""},{"line_number":2800,"context_line":"            # volume_updates is a dict containing a report of relevant"},{"line_number":2801,"context_line":"            # items based on the backend and how it operates or what it needs"},{"line_number":2802,"context_line":"            # {\u0027host\u0027: \u0027secondary-configured-cinder-backend\u0027,"},{"line_number":2803,"context_line":"            #  \u0027model_update\u0027: {\u0027update-all-the-provider-info-etc\u0027},"},{"line_number":2804,"context_line":"            #  \u0027replication_driver_data\u0027: \u0027driver-specific-stuff-for-db\u0027}"},{"line_number":2805,"context_line":"            # model_update and replication_driver_data are required"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_a5514538","line":2802,"updated":"2015-08-19 18:42:19.000000000","message":"I assume we are expecting the host to come back as a valid cinder host string like \u0027foo@bar#baz\u0027 right?","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"75aa0724f52885626fcabb3a3968d2c13076c792","unresolved":false,"context_lines":[{"line_number":2819,"context_line":"            volume \u003d self.db.volume_update("},{"line_number":2820,"context_line":"                context,"},{"line_number":2821,"context_line":"                volume[\u0027id\u0027],"},{"line_number":2822,"context_line":"                volume_updates[\u0027replication_driver_data\u0027])"},{"line_number":2823,"context_line":""},{"line_number":2824,"context_line":"            if volume_updates.get(\u0027host\u0027, None):"},{"line_number":2825,"context_line":"                volume \u003d self.db.volume_update("}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_4e3f1a24","line":2822,"updated":"2015-08-20 02:34:21.000000000","message":"Should be {\u0027replication_driver_data\u0027: volume_updates[\u0027replication_driver_data\u0027]} \nunless if driver returns a dictionary already.","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"81c8f6f3df2e4f240c7cd049f3b28a303d8ec2db","unresolved":false,"context_lines":[{"line_number":2811,"context_line":""},{"line_number":2812,"context_line":"        # TODO(jdg): Come back and condense thes into a single update"},{"line_number":2813,"context_line":"        try:"},{"line_number":2814,"context_line":"            volume \u003d self.db.volume_update("},{"line_number":2815,"context_line":"                context,"},{"line_number":2816,"context_line":"                volume[\u0027id\u0027],"},{"line_number":2817,"context_line":"                volume_updates[\u0027model_update\u0027])"},{"line_number":2818,"context_line":""},{"line_number":2819,"context_line":"            volume \u003d self.db.volume_update("},{"line_number":2820,"context_line":"                context,"},{"line_number":2821,"context_line":"                volume[\u0027id\u0027],"},{"line_number":2822,"context_line":"                volume_updates[\u0027replication_driver_data\u0027])"},{"line_number":2823,"context_line":""},{"line_number":2824,"context_line":"            if volume_updates.get(\u0027host\u0027, None):"},{"line_number":2825,"context_line":"                volume \u003d self.db.volume_update("},{"line_number":2826,"context_line":"                    context,"},{"line_number":2827,"context_line":"                    volume[\u0027id\u0027],"},{"line_number":2828,"context_line":"                    {\u0027host\u0027: volume_updates[\u0027model_update\u0027][\u0027host\u0027]})"},{"line_number":2829,"context_line":""},{"line_number":2830,"context_line":"        except exception.CinderException as ex:"},{"line_number":2831,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_05b35199","line":2828,"range":{"start_line":2814,"start_character":12,"end_line":2828,"end_character":69},"updated":"2015-08-19 18:42:19.000000000","message":"This seems a little bit redundant... why not just put everything into the model update and do a single db update?","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"2f6deca92ffa617fcfaf2f84fdec98750a09b5b1","unresolved":false,"context_lines":[{"line_number":2825,"context_line":"                volume \u003d self.db.volume_update("},{"line_number":2826,"context_line":"                    context,"},{"line_number":2827,"context_line":"                    volume[\u0027id\u0027],"},{"line_number":2828,"context_line":"                    {\u0027host\u0027: volume_updates[\u0027model_update\u0027][\u0027host\u0027]})"},{"line_number":2829,"context_line":""},{"line_number":2830,"context_line":"        except exception.CinderException as ex:"},{"line_number":2831,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_b866194f","line":2828,"in_reply_to":"fa1b9901_05b35199","updated":"2015-08-20 16:28:53.000000000","message":"Did you notice my comment above :)","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"75aa0724f52885626fcabb3a3968d2c13076c792","unresolved":false,"context_lines":[{"line_number":2825,"context_line":"                volume \u003d self.db.volume_update("},{"line_number":2826,"context_line":"                    context,"},{"line_number":2827,"context_line":"                    volume[\u0027id\u0027],"},{"line_number":2828,"context_line":"                    {\u0027host\u0027: volume_updates[\u0027model_update\u0027][\u0027host\u0027]})"},{"line_number":2829,"context_line":""},{"line_number":2830,"context_line":"        except exception.CinderException as ex:"},{"line_number":2831,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_4ef87a7b","line":2828,"in_reply_to":"fa1b9901_05b35199","updated":"2015-08-20 02:34:21.000000000","message":"Just have the update on line 2817 updating everything is probably better.","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"75aa0724f52885626fcabb3a3968d2c13076c792","unresolved":false,"context_lines":[{"line_number":2826,"context_line":"                    context,"},{"line_number":2827,"context_line":"                    volume[\u0027id\u0027],"},{"line_number":2828,"context_line":"                    {\u0027host\u0027: volume_updates[\u0027model_update\u0027][\u0027host\u0027]})"},{"line_number":2829,"context_line":""},{"line_number":2830,"context_line":"        except exception.CinderException as ex:"},{"line_number":2831,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2832,"context_line":"                          resource\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_4ed15af9","line":2829,"updated":"2015-08-20 02:34:21.000000000","message":"After failover_replication, the replication_status of the volume remains as \u0027enabling_secondary\u0027.  Is this intended?","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"2f6deca92ffa617fcfaf2f84fdec98750a09b5b1","unresolved":false,"context_lines":[{"line_number":2826,"context_line":"                    context,"},{"line_number":2827,"context_line":"                    volume[\u0027id\u0027],"},{"line_number":2828,"context_line":"                    {\u0027host\u0027: volume_updates[\u0027model_update\u0027][\u0027host\u0027]})"},{"line_number":2829,"context_line":""},{"line_number":2830,"context_line":"        except exception.CinderException as ex:"},{"line_number":2831,"context_line":"            LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2832,"context_line":"                          resource\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_f84811b5","line":2829,"in_reply_to":"fa1b9901_4ed15af9","updated":"2015-08-20 16:28:53.000000000","message":"Nope","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"81c8f6f3df2e4f240c7cd049f3b28a303d8ec2db","unresolved":false,"context_lines":[{"line_number":2846,"context_line":"        sends properly formatted data to teh backend when updating targets."},{"line_number":2847,"context_line":""},{"line_number":2848,"context_line":"        Example response:"},{"line_number":2849,"context_line":"        [{remote_targets:[{san_ip: xxx, san_login: xxx, san_password: xxxx,"},{"line_number":2850,"context_line":"                           status: \u003cenabled|disabled\u003e},"},{"line_number":2851,"context_line":"                          ...{}],"},{"line_number":2852,"context_line":"         {cinder_hosts: [volume_backend_name,....]}]"},{"line_number":2853,"context_line":""},{"line_number":2854,"context_line":"         WARNING: Although this is intended as Admin only, passwords should"},{"line_number":2855,"context_line":"         be masked, but the structure is there to clearly describe what\u0027s"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_2013e35c","line":2852,"range":{"start_line":2849,"start_character":8,"end_line":2852,"end_character":52},"updated":"2015-08-19 18:42:19.000000000","message":"This structure isn\u0027t quite the same as whats described in the doc being added, we should probably make sure to make them all consistent.","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"2f6deca92ffa617fcfaf2f84fdec98750a09b5b1","unresolved":false,"context_lines":[{"line_number":2849,"context_line":"        [{remote_targets:[{san_ip: xxx, san_login: xxx, san_password: xxxx,"},{"line_number":2850,"context_line":"                           status: \u003cenabled|disabled\u003e},"},{"line_number":2851,"context_line":"                          ...{}],"},{"line_number":2852,"context_line":"         {cinder_hosts: [volume_backend_name,....]}]"},{"line_number":2853,"context_line":""},{"line_number":2854,"context_line":"         WARNING: Although this is intended as Admin only, passwords should"},{"line_number":2855,"context_line":"         be masked, but the structure is there to clearly describe what\u0027s"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_5811fd5b","line":2852,"in_reply_to":"fa1b9901_2013e35c","updated":"2015-08-20 16:28:53.000000000","message":"yeah, I\u0027m torn on the whole \"list of backends, vs single backend\"\n\nI need to code some stuff up for a final decision on that and then make sure everything is aligned.","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"2912dc94fd2714d9b67e5bb117b9e518cae2a155","unresolved":false,"context_lines":[{"line_number":2816,"context_line":""},{"line_number":2817,"context_line":"            # volume_updates is a dict containing a report of relevant"},{"line_number":2818,"context_line":"            # items based on the backend and how it operates or what it needs"},{"line_number":2819,"context_line":"            # {\u0027host\u0027: \u0027secondary-configured-cinder-backend\u0027,"},{"line_number":2820,"context_line":"            #  \u0027model_update\u0027: {\u0027update-all-the-provider-info-etc\u0027},"},{"line_number":2821,"context_line":"            #  \u0027replication_driver_data\u0027: \u0027driver-specific-stuff-for-db\u0027}"},{"line_number":2822,"context_line":"            # Where \u0027host\u0027 is a valid cinder host string like"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_2bf11f95","line":2819,"updated":"2015-08-21 13:16:23.000000000","message":"in the following code the \u0027host\u0027 key is ignored.\nonly model_update and replication_driver_data are referenced.\nCould \u0027host\u0027 be part of the model_update? in fact wouldn\u0027t this be the same for replication_driver_data? and we don\u0027t actually need to have this separation, just have model_update from the driver?","commit_id":"3e00671340ed3cd82b3a320c835452c8b80b583f"},{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"2912dc94fd2714d9b67e5bb117b9e518cae2a155","unresolved":false,"context_lines":[{"line_number":2852,"context_line":"                LOG.exception(_LE(\"Driver replication data update failed.\"),"},{"line_number":2853,"context_line":"                              resource\u003dvolume)"},{"line_number":2854,"context_line":"                raise exception.VolumeBackendAPIException(reason\u003dex)"},{"line_number":2855,"context_line":"        self.db.volume_update(context,"},{"line_number":2856,"context_line":"                              volume[\u0027id\u0027],"},{"line_number":2857,"context_line":"                              {\u0027replication_status\u0027: \u0027enabled\u0027})"},{"line_number":2858,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_6b239756","line":2855,"updated":"2015-08-21 13:16:23.000000000","message":"I think this is a leftover from a cut/paste.\nAs the most common case for failover is when something failed and you can\u0027t actually do replication, having \"replication status \u003d enabled\" following a failover doesn\u0027t make sense.\n\nEach driver may have his own way of handling this, I would leave the update of the replication_status to the driver, and making replication_status a mandatory return value for the driver.","commit_id":"3e00671340ed3cd82b3a320c835452c8b80b583f"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"e9fdec228fbe9b9baabe6c8c8c76b69ec0dd3321","unresolved":false,"context_lines":[{"line_number":2879,"context_line":"        \"\"\""},{"line_number":2880,"context_line":""},{"line_number":2881,"context_line":"        try:"},{"line_number":2882,"context_line":"            replication_targets \u003d self.driver.list_replication_targets(context)"},{"line_number":2883,"context_line":""},{"line_number":2884,"context_line":"        except exception.CinderException:"},{"line_number":2885,"context_line":"            err_msg \u003d (_(\"Get replication targets failed.\"))"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa1b9901_ea1a5ec5","line":2882,"range":{"start_line":2882,"start_character":46,"end_line":2882,"end_character":70},"updated":"2015-08-21 02:36:07.000000000","message":"Don\u0027t we need to pass the vref into this method now too?","commit_id":"3e00671340ed3cd82b3a320c835452c8b80b583f"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e91f301742e75ef69743774ecd595e53327e6abf","unresolved":false,"context_lines":[{"line_number":2887,"context_line":"        \"\"\""},{"line_number":2888,"context_line":""},{"line_number":2889,"context_line":"        try:"},{"line_number":2890,"context_line":"            replication_targets \u003d self.driver.list_replication_targets(context)"},{"line_number":2891,"context_line":""},{"line_number":2892,"context_line":"        except exception.CinderException:"},{"line_number":2893,"context_line":"            err_msg \u003d (_(\"Get replication targets failed.\"))"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa1b9901_9a7aed76","line":2890,"updated":"2015-08-21 15:48:02.000000000","message":"vref should be passed to the driver method as well.","commit_id":"3630893859fb94689ce1098b75037a8361ff9586"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@purestorage.com","username":"sdodsley"},"change_message_id":"4c419a62c7a3924f47c1d027dbcfa369ebae9d08","unresolved":false,"context_lines":[{"line_number":2900,"context_line":""},{"line_number":2901,"context_line":"        try:"},{"line_number":2902,"context_line":"            replication_targets \u003d self.driver.list_replication_targets(context)"},{"line_number":2903,"context_line":""},{"line_number":2904,"context_line":"        except exception.CinderException:"},{"line_number":2905,"context_line":"            err_msg \u003d (_(\"Get replication targets failed.\"))"},{"line_number":2906,"context_line":"            LOG.exception(err_msg)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_3dff1bac","line":2903,"updated":"2015-08-21 16:02:37.000000000","message":"Still seems to be missing vref here","commit_id":"3ce72ce2427937728ef5b97ef2d057854ee57e71"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"17af3d03064a1e7a3622d240aeea843285a458e6","unresolved":false,"context_lines":[{"line_number":2900,"context_line":""},{"line_number":2901,"context_line":"        try:"},{"line_number":2902,"context_line":"            replication_targets \u003d self.driver.list_replication_targets(context)"},{"line_number":2903,"context_line":""},{"line_number":2904,"context_line":"        except exception.CinderException:"},{"line_number":2905,"context_line":"            err_msg \u003d (_(\"Get replication targets failed.\"))"},{"line_number":2906,"context_line":"            LOG.exception(err_msg)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_e0ec9694","line":2903,"in_reply_to":"fa1b9901_3dff1bac","updated":"2015-08-21 16:29:59.000000000","message":"+1 :)","commit_id":"3ce72ce2427937728ef5b97ef2d057854ee57e71"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"07f2ce5cfab1227166c0454519ad8a04d3f4b7d9","unresolved":false,"context_lines":[{"line_number":2900,"context_line":""},{"line_number":2901,"context_line":"        try:"},{"line_number":2902,"context_line":"            replication_targets \u003d self.driver.list_replication_targets(context)"},{"line_number":2903,"context_line":""},{"line_number":2904,"context_line":"        except exception.CinderException:"},{"line_number":2905,"context_line":"            err_msg \u003d (_(\"Get replication targets failed.\"))"},{"line_number":2906,"context_line":"            LOG.exception(err_msg)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa1b9901_63f7308d","line":2903,"in_reply_to":"fa1b9901_e0ec9694","updated":"2015-08-21 16:45:36.000000000","message":"weird!!!","commit_id":"3ce72ce2427937728ef5b97ef2d057854ee57e71"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b326ac944fe3f9d297c6cd598dde28809c14efaa","unresolved":false,"context_lines":[{"line_number":2876,"context_line":"                              volume[\u0027id\u0027],"},{"line_number":2877,"context_line":"                              {\u0027replication_status\u0027: \u0027failed-over\u0027})"},{"line_number":2878,"context_line":""},{"line_number":2879,"context_line":"    def list_replication_targets(self, context, vref):"},{"line_number":2880,"context_line":"        \"\"\"Provide a means to obtain replication targets for a volume."},{"line_number":2881,"context_line":""},{"line_number":2882,"context_line":"        This method is used to query a backend to get the current"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_c9e09dfd","line":2879,"updated":"2015-08-21 17:34:15.000000000","message":"\"vref\" should be changed to \"volume\" to be in sync with the parameter name you used in rpcapi.py.  Otherwise I get a Type error when issuing rpc call.","commit_id":"d65438d5845696eb3fd79cd2e1edecfec2d1bcdd"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"fb962e0f91e40bf1a36422eb11860348299ddaf4","unresolved":false,"context_lines":[{"line_number":2876,"context_line":"                              volume[\u0027id\u0027],"},{"line_number":2877,"context_line":"                              {\u0027replication_status\u0027: \u0027failed-over\u0027})"},{"line_number":2878,"context_line":""},{"line_number":2879,"context_line":"    def list_replication_targets(self, context, vref):"},{"line_number":2880,"context_line":"        \"\"\"Provide a means to obtain replication targets for a volume."},{"line_number":2881,"context_line":""},{"line_number":2882,"context_line":"        This method is used to query a backend to get the current"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_5ea50cb3","line":2879,"in_reply_to":"fa1b9901_c9e09dfd","updated":"2015-08-22 15:19:06.000000000","message":"Done","commit_id":"d65438d5845696eb3fd79cd2e1edecfec2d1bcdd"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b326ac944fe3f9d297c6cd598dde28809c14efaa","unresolved":false,"context_lines":[{"line_number":2900,"context_line":""},{"line_number":2901,"context_line":"        try:"},{"line_number":2902,"context_line":"            replication_targets \u003d self.driver.list_replication_targets(context,"},{"line_number":2903,"context_line":"                                                                       vref)"},{"line_number":2904,"context_line":""},{"line_number":2905,"context_line":"        except exception.CinderException:"},{"line_number":2906,"context_line":"            err_msg \u003d (_(\"Get replication targets failed.\"))"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_09be95d4","line":2903,"updated":"2015-08-21 17:34:15.000000000","message":"If you rename the parameter, it should be changed to \"volume\" here as well.","commit_id":"d65438d5845696eb3fd79cd2e1edecfec2d1bcdd"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"fb962e0f91e40bf1a36422eb11860348299ddaf4","unresolved":false,"context_lines":[{"line_number":2900,"context_line":""},{"line_number":2901,"context_line":"        try:"},{"line_number":2902,"context_line":"            replication_targets \u003d self.driver.list_replication_targets(context,"},{"line_number":2903,"context_line":"                                                                       vref)"},{"line_number":2904,"context_line":""},{"line_number":2905,"context_line":"        except exception.CinderException:"},{"line_number":2906,"context_line":"            err_msg \u003d (_(\"Get replication targets failed.\"))"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_fea98091","line":2903,"in_reply_to":"fa1b9901_09be95d4","updated":"2015-08-22 15:19:06.000000000","message":"Done","commit_id":"d65438d5845696eb3fd79cd2e1edecfec2d1bcdd"}],"cinder/volume/rpcapi.py":[{"author":{"_account_id":4418,"name":"Ronen Kat","email":"ronenkat@il.ibm.com","username":"ronenkat"},"change_message_id":"6727d177ed495c8e45bb77dd088e3869abbdc9ac","unresolved":false,"context_lines":[{"line_number":286,"context_line":"                                    ctxt,"},{"line_number":287,"context_line":"                                    volume,"},{"line_number":288,"context_line":"                                    secondary\u003dNone):"},{"line_number":289,"context_line":"        new_host \u003d utils.extract_host(volume[\u0027host\u0027])"},{"line_number":290,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.24\u0027)"},{"line_number":291,"context_line":"        cctxt.cast(ctxt, \u0027failover_volume_replication\u0027,"},{"line_number":292,"context_line":"                   volume\u003dvolume,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_f1fd466f","line":289,"updated":"2015-07-12 08:46:25.000000000","message":"We are assuming that the volume service is running and is handling requests for both the source and target.\nThere will be some back-ends who will be running different driver instances for the source and target.","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"8b92c7922454e63455eb04ac8bc382c463cfc7d6","unresolved":false,"context_lines":[{"line_number":286,"context_line":"                                    ctxt,"},{"line_number":287,"context_line":"                                    volume,"},{"line_number":288,"context_line":"                                    secondary\u003dNone):"},{"line_number":289,"context_line":"        new_host \u003d utils.extract_host(volume[\u0027host\u0027])"},{"line_number":290,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.24\u0027)"},{"line_number":291,"context_line":"        cctxt.cast(ctxt, \u0027failover_volume_replication\u0027,"},{"line_number":292,"context_line":"                   volume\u003dvolume,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_d6479d1b","line":289,"in_reply_to":"9a41bdd9_f1fd466f","updated":"2015-07-13 14:54:00.000000000","message":"Actually I\u0027m not making that assumption here at all.  This failover will actually only have an updated host in the second case you describe.\n\nIf this is a single driver instance that knows/controls both Src and Tgt it is pretty much a noop.  If however there are two configured drivers involved the \"host\" column is what gets updated to address that.\n\nNot sure what I might be missing in your statement?","commit_id":"7a03f69cdac8c60930afc8790a19339468a89ce9"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        super(VolumeAPI, self).__init__()"},{"line_number":78,"context_line":"        target \u003d messaging.Target(topic\u003dCONF.volume_topic,"},{"line_number":79,"context_line":"                                  version\u003dself.BASE_RPC_API_VERSION)"},{"line_number":80,"context_line":"        serializer \u003d objects_base.CinderObjectSerializer()"},{"line_number":81,"context_line":"        self.client \u003d rpc.get_client(target, \u00271.25\u0027, serializer\u003dserializer)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def create_consistencygroup(self, ctxt, group, host):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_98e66415","line":80,"updated":"2015-08-07 22:46:10.000000000","message":"Should bump the version to 1.26.","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                         volume, asynchronous\u003dTrue,"},{"line_number":264,"context_line":"                         replica_count\u003d1):"},{"line_number":265,"context_line":"        new_host \u003d utils.extract_host(volume[\u0027host\u0027])"},{"line_number":266,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.24\u0027)"},{"line_number":267,"context_line":"        cctxt.cast(ctxt, \u0027replicate_volume\u0027,"},{"line_number":268,"context_line":"                   volume\u003dvolume,"},{"line_number":269,"context_line":"                   asynchronous\u003dasynchronous,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_78ed98ee","line":266,"updated":"2015-08-07 22:46:10.000000000","message":"Should bump version to 1.26","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                         volume, asynchronous\u003dTrue,"},{"line_number":264,"context_line":"                         replica_count\u003d1):"},{"line_number":265,"context_line":"        new_host \u003d utils.extract_host(volume[\u0027host\u0027])"},{"line_number":266,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.24\u0027)"},{"line_number":267,"context_line":"        cctxt.cast(ctxt, \u0027replicate_volume\u0027,"},{"line_number":268,"context_line":"                   volume\u003dvolume,"},{"line_number":269,"context_line":"                   asynchronous\u003dasynchronous,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_2734d5f9","line":266,"in_reply_to":"1a4dcd0f_78ed98ee","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def disable_volume_replication(self, ctxt, volume):"},{"line_number":273,"context_line":"        new_host \u003d utils.extract_host(volume[\u0027host\u0027])"},{"line_number":274,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.24\u0027)"},{"line_number":275,"context_line":"        cctxt.cast(ctxt, \u0027disable_volume_replication\u0027,"},{"line_number":276,"context_line":"                   volume\u003dvolume)"},{"line_number":277,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_38be30d5","line":274,"updated":"2015-08-07 22:46:10.000000000","message":"1.26","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def disable_volume_replication(self, ctxt, volume):"},{"line_number":273,"context_line":"        new_host \u003d utils.extract_host(volume[\u0027host\u0027])"},{"line_number":274,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.24\u0027)"},{"line_number":275,"context_line":"        cctxt.cast(ctxt, \u0027disable_volume_replication\u0027,"},{"line_number":276,"context_line":"                   volume\u003dvolume)"},{"line_number":277,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_c73891f1","line":274,"in_reply_to":"1a4dcd0f_38be30d5","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":280,"context_line":"                                    volume,"},{"line_number":281,"context_line":"                                    secondary\u003dNone):"},{"line_number":282,"context_line":"        new_host \u003d utils.extract_host(volume[\u0027host\u0027])"},{"line_number":283,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.24\u0027)"},{"line_number":284,"context_line":"        cctxt.cast(ctxt, \u0027failover_volume_replication\u0027,"},{"line_number":285,"context_line":"                   volume\u003dvolume,"},{"line_number":286,"context_line":"                   secondary\u003dsecondary)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_f8b768f3","line":283,"updated":"2015-08-07 22:46:10.000000000","message":"1.26","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":280,"context_line":"                                    volume,"},{"line_number":281,"context_line":"                                    secondary\u003dNone):"},{"line_number":282,"context_line":"        new_host \u003d utils.extract_host(volume[\u0027host\u0027])"},{"line_number":283,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.24\u0027)"},{"line_number":284,"context_line":"        cctxt.cast(ctxt, \u0027failover_volume_replication\u0027,"},{"line_number":285,"context_line":"                   volume\u003dvolume,"},{"line_number":286,"context_line":"                   secondary\u003dsecondary)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_e73d8dde","line":283,"in_reply_to":"1a4dcd0f_f8b768f3","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"b4384d10dcb382b1a7d363df595bf861ba2ad10d","unresolved":false,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def get_replication_targets(self, ctxt, host):"},{"line_number":289,"context_line":"        new_host \u003d utils.extract_host(host)"},{"line_number":290,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.24\u0027)"},{"line_number":291,"context_line":"        return cctxt.call(ctxt, \u0027get_replication_targets\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_b8ca406d","line":290,"updated":"2015-08-07 22:46:10.000000000","message":"1.26","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"4b859b09f3997826c6f565ff28d46a119308ec43","unresolved":false,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def get_replication_targets(self, ctxt, host):"},{"line_number":289,"context_line":"        new_host \u003d utils.extract_host(host)"},{"line_number":290,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.24\u0027)"},{"line_number":291,"context_line":"        return cctxt.call(ctxt, \u0027get_replication_targets\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_a720e5b1","line":290,"in_reply_to":"1a4dcd0f_b8ca406d","updated":"2015-08-13 19:26:44.000000000","message":"Done","commit_id":"57a95c05f72dc493882a743f8f9668feb0efdd97"},{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"c66b253ab3578ad23e0ba4efa901dacfdf81592a","unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    def enable_replication(self, ctxt,"},{"line_number":266,"context_line":"                           volume, asynchronous\u003dTrue,"},{"line_number":267,"context_line":"                           replica_count\u003d1):"},{"line_number":268,"context_line":"        new_host \u003d utils.extract_host(volume[\u0027host\u0027])"},{"line_number":269,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.27\u0027)"},{"line_number":270,"context_line":"        cctxt.cast(ctxt, \u0027enable_replication\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_db91b9f2","line":267,"updated":"2015-08-19 20:42:27.000000000","message":"Same here. Parameters are not consistent.","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d50049087901acd1453adad0f59c43eba2f552f4","unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    def enable_replication(self, ctxt,"},{"line_number":266,"context_line":"                           volume, asynchronous\u003dTrue,"},{"line_number":267,"context_line":"                           replica_count\u003d1):"},{"line_number":268,"context_line":"        new_host \u003d utils.extract_host(volume[\u0027host\u0027])"},{"line_number":269,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.27\u0027)"},{"line_number":270,"context_line":"        cctxt.cast(ctxt, \u0027enable_replication\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_18f88c48","line":267,"in_reply_to":"fa1b9901_db91b9f2","updated":"2015-08-20 01:29:14.000000000","message":"asynchronous and replica_count should be removed here as they are already removed from API.","commit_id":"d7056b2204be7a08fb0ea3b621018c99bfd39df9"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"65c4b7272da757b2242c4b6ad9cb081168a576f7","unresolved":false,"context_lines":[{"line_number":286,"context_line":"    def list_replication_targets(self, ctxt, volume):"},{"line_number":287,"context_line":"        new_host \u003d utils.extract_host(volume[\u0027host\u0027])"},{"line_number":288,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.27\u0027)"},{"line_number":289,"context_line":"        return cctxt.call(ctxt, \u0027list_replication_targets\u0027, volume\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_294d99c4","line":289,"updated":"2015-08-21 17:35:30.000000000","message":"The parameter name \"volume\" should be the same as the parameter name defined in manager.py:list_replication_targets.  Otherwise I\u0027m getting a Type error.","commit_id":"d65438d5845696eb3fd79cd2e1edecfec2d1bcdd"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"fb962e0f91e40bf1a36422eb11860348299ddaf4","unresolved":false,"context_lines":[{"line_number":286,"context_line":"    def list_replication_targets(self, ctxt, volume):"},{"line_number":287,"context_line":"        new_host \u003d utils.extract_host(volume[\u0027host\u0027])"},{"line_number":288,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.27\u0027)"},{"line_number":289,"context_line":"        return cctxt.call(ctxt, \u0027list_replication_targets\u0027, volume\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa1b9901_7e9ed064","line":289,"in_reply_to":"fa1b9901_294d99c4","updated":"2015-08-22 15:19:06.000000000","message":"Done","commit_id":"d65438d5845696eb3fd79cd2e1edecfec2d1bcdd"}],"cinder/volume/utils.py":[{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"2689c4037c96266ba2bab2e74907194d91ae3635","unresolved":false,"context_lines":[{"line_number":579,"context_line":"    \"{\u0027key-1\u0027\u003d\u0027val-1\u0027 \u0027key-2\u0027\u003d\u0027val-2\u0027...}\""},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"    :param config_string: Properly formatted string to convert to dict."},{"line_number":582,"context_line":"    :response: dict of string values"},{"line_number":583,"context_line":"    \"\"\""},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"    resultant_dict \u003d {}"}],"source_content_type":"text/x-python","patch_set":20,"id":"da20952f_4a0a568b","line":582,"updated":"2015-09-01 10:01:16.000000000","message":"response -\u003e returns","commit_id":"fe538dc63de2c9bab21416a4b6c920049442b4e9"}],"etc/cinder/policy.json":[{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"c9d1757791241991d0a77a9bf4954de886d238b7","unresolved":false,"context_lines":[{"line_number":65,"context_line":"\t\"volume:enable_replication\": \"rule:admin_api\","},{"line_number":66,"context_line":"\t\"volume:disable_replication\": \"rule:admin_api\","},{"line_number":67,"context_line":"\t\"volume:failover_replication\": \"rule:admin_api\","},{"line_number":68,"context_line":"\t\"volume:get_replication_targets\": \"rule:admin_api\","},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    \"backup:create\" : \"\","},{"line_number":71,"context_line":"    \"backup:delete\": \"\","}],"source_content_type":"application/json","patch_set":6,"id":"fa1b9901_444504b1","line":68,"updated":"2015-08-18 20:16:16.000000000","message":"Stupid tabs!!!","commit_id":"b31c9ec3d1d02efc25ca557693d76fc4421e2bd2"}]}
