)]}'
{"cinder/tests/unit/test_replication.py":[{"author":{"_account_id":16917,"name":"Alex O\u0027Rourke","email":"alex.orourke@hpe.com","username":"aorourke"},"change_message_id":"0d4606a9d08be44a461230b2ec60d4357efb856d","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from oslo_utils import importutils"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from cinder import context"},{"line_number":23,"context_line":"from cinder import db"},{"line_number":24,"context_line":"from cinder import exception"},{"line_number":25,"context_line":"from cinder import objects"},{"line_number":26,"context_line":"from cinder import test"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a29b11f_7337cce3","line":23,"updated":"2015-10-26 15:07:01.000000000","message":"should be removed","commit_id":"eadc7a8a63dbfe068be859b6cea88759d5659334"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"e566de3d0e54817179002044632051f69525258e","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            \u0027replication_status\u0027: \u0027inactive\u0027}"},{"line_number":65,"context_line":"        self.manager.promote_replica(self.adm_ctxt, vol.id, volume\u003dvol)"},{"line_number":66,"context_line":"        vol_after \u003d objects.Volume.get_by_id(self.ctxt, vol.id)"},{"line_number":67,"context_line":"        self.assertEqual(\u0027inactive\u0027, vol_after[\u0027replication_status\u0027])"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def test_promote_replica_fail(self):"},{"line_number":70,"context_line":"        \"\"\"Test promote replication when promote fails.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_79279764","line":67,"updated":"2015-11-17 21:45:53.000000000","message":"You might consider changing this to vol_after.replication_status.  It is a small one line change, but I know it is not part of this patch to switch over everything to use dot notation.","commit_id":"fc6a1dca6e13d971a0481124553e2171521f9fdd"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"8627e762612fde9d676a9b646577431dd17ab074","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                          self.adm_ctxt,"},{"line_number":56,"context_line":"                          vol.id)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_promote_replica(self):"},{"line_number":59,"context_line":"        \"\"\"Test promote replication.\"\"\""},{"line_number":60,"context_line":"        vol \u003d test_utils.create_volume(self.ctxt,"},{"line_number":61,"context_line":"                                       status\u003d\u0027available\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_fc0c80ed","line":58,"range":{"start_line":58,"start_character":33,"end_line":58,"end_character":35},"updated":"2015-12-21 05:48:07.000000000","message":"I do not think replication V1 methods, like promote_replica and reenable_replication, will have too much support or even new implementation for it. There is no need to convert them into VOs.\n\nIt is enough to convert replication V2 methods, enable, disable, failover and list targets.","commit_id":"2b4ed8bca4b84e8da154f72d7930067a5de5fbd0"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"8627e762612fde9d676a9b646577431dd17ab074","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                          self.adm_ctxt,"},{"line_number":78,"context_line":"                          vol.id)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def test_reenable_replication(self):"},{"line_number":81,"context_line":"        \"\"\"Test reenable replication.\"\"\""},{"line_number":82,"context_line":"        vol \u003d test_utils.create_volume(self.ctxt,"},{"line_number":83,"context_line":"                                       status\u003d\u0027available\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_9cfe9cac","line":80,"range":{"start_line":80,"start_character":38,"end_line":80,"end_character":40},"updated":"2015-12-21 05:48:07.000000000","message":"The same to the above.","commit_id":"2b4ed8bca4b84e8da154f72d7930067a5de5fbd0"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"544d0cc5b3c40873f01490af075e8d6a0d544814","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    def test_enable_replication_uninitialized_driver("},{"line_number":127,"context_line":"            self, mock_require_driver_init):"},{"line_number":128,"context_line":"        vol \u003d test_utils.create_volume("},{"line_number":129,"context_line":"                self.ctxt, replication_status\u003d\u0027enabling\u0027)"},{"line_number":130,"context_line":"        mock_require_driver_init.side_effect \u003d exception.DriverNotInitialized"},{"line_number":131,"context_line":"        self.assertRaises(exception.DriverNotInitialized,"},{"line_number":132,"context_line":"                          self.manager.enable_replication, self.ctxt, vol)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_d23906f4","line":129,"updated":"2016-01-07 18:27:08.000000000","message":"It doesn\u0027t look like it, but this line is causing PEP8 issue.","commit_id":"a03a89740a0b0b2408b9bb27795c4ae45d2e7ac1"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"add72e7cdf852c815b907b0bb561edb8cbcd2c38","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    def test_enable_replication_uninitialized_driver("},{"line_number":127,"context_line":"            self, mock_require_driver_init):"},{"line_number":128,"context_line":"        vol \u003d test_utils.create_volume("},{"line_number":129,"context_line":"                self.ctxt, replication_status\u003d\u0027enabling\u0027)"},{"line_number":130,"context_line":"        mock_require_driver_init.side_effect \u003d exception.DriverNotInitialized"},{"line_number":131,"context_line":"        self.assertRaises(exception.DriverNotInitialized,"},{"line_number":132,"context_line":"                          self.manager.enable_replication, self.ctxt, vol)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_fa5daa15","line":129,"in_reply_to":"fa69d971_d23906f4","updated":"2016-01-08 17:04:40.000000000","message":"Fixed","commit_id":"a03a89740a0b0b2408b9bb27795c4ae45d2e7ac1"}],"cinder/tests/unit/test_volume_rpcapi.py":[{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"8627e762612fde9d676a9b646577431dd17ab074","unresolved":false,"context_lines":[{"line_number":525,"context_line":""},{"line_number":526,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027,"},{"line_number":527,"context_line":"                return_value\u003dTrue)"},{"line_number":528,"context_line":"    def test_promote_replica(self, can_send_version):"},{"line_number":529,"context_line":"        self._test_volume_api(\u0027promote_replica\u0027,"},{"line_number":530,"context_line":"                              rpc_method\u003d\u0027cast\u0027,"},{"line_number":531,"context_line":"                              volume\u003dself.fake_volume_obj,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_3c0768cb","line":528,"range":{"start_line":528,"start_character":51,"end_line":528,"end_character":53},"updated":"2015-12-21 05:48:07.000000000","message":"I do not think replication V1 methods, like promote_replica and reenable_replication, will have too much support or even new implementation for it. There is no need to convert them into VOs.\n\nIt is enough to convert replication V2 methods, enable, disable, failover and list targets.","commit_id":"2b4ed8bca4b84e8da154f72d7930067a5de5fbd0"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"8627e762612fde9d676a9b646577431dd17ab074","unresolved":false,"context_lines":[{"line_number":543,"context_line":""},{"line_number":544,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027,"},{"line_number":545,"context_line":"                return_value\u003dTrue)"},{"line_number":546,"context_line":"    def test_reenable_replication(self, can_send_version):"},{"line_number":547,"context_line":"        self._test_volume_api(\u0027reenable_replication\u0027,"},{"line_number":548,"context_line":"                              rpc_method\u003d\u0027cast\u0027,"},{"line_number":549,"context_line":"                              volume\u003dself.fake_volume_obj,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_3c2e8843","line":546,"range":{"start_line":546,"start_character":56,"end_line":546,"end_character":58},"updated":"2015-12-21 05:48:07.000000000","message":"The same to the above.","commit_id":"2b4ed8bca4b84e8da154f72d7930067a5de5fbd0"}],"cinder/volume/api.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c50e2945d1d4d7c936f0a4cd3c3a67e746679ff7","unresolved":false,"context_lines":[{"line_number":1714,"context_line":"        # secondaries that includes an ID/Name that can be"},{"line_number":1715,"context_line":"        # used as a handle"},{"line_number":1716,"context_line":"        valid_failover_status \u003d [\u0027enabled\u0027]"},{"line_number":1717,"context_line":"        rep_status \u003d volume.replication_status"},{"line_number":1718,"context_line":""},{"line_number":1719,"context_line":"        if rep_status not in valid_failover_status:"},{"line_number":1720,"context_line":"            msg \u003d (_(\"Invalid status to failover replication. \""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_946366b1","line":1717,"updated":"2015-11-24 20:31:54.000000000","message":"Ah, clever, we don\u0027t need \u0027na\u0027…","commit_id":"f06d503eaa81a794b31fc21c8d34ec7d3327cf4c"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"544d0cc5b3c40873f01490af075e8d6a0d544814","unresolved":false,"context_lines":[{"line_number":1625,"context_line":"        # volume-type and config files."},{"line_number":1626,"context_line":""},{"line_number":1627,"context_line":"        # Get a fresh object and check status"},{"line_number":1628,"context_line":"        volume \u003d objects.Volume.get_by_id(ctxt, volume.id)"},{"line_number":1629,"context_line":""},{"line_number":1630,"context_line":"        # NOTE(jdg): Set a valid status as a var to minimize errors via typos"},{"line_number":1631,"context_line":"        # also, use a list, we may want to add to it some day"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_4d4a5757","line":1628,"range":{"start_line":1628,"start_character":0,"end_line":1628,"end_character":58},"updated":"2016-01-07 18:27:08.000000000","message":"Looks like volume is an object already, so you can simply call volume.refresh instead.","commit_id":"a03a89740a0b0b2408b9bb27795c4ae45d2e7ac1"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"add72e7cdf852c815b907b0bb561edb8cbcd2c38","unresolved":false,"context_lines":[{"line_number":1625,"context_line":"        # volume-type and config files."},{"line_number":1626,"context_line":""},{"line_number":1627,"context_line":"        # Get a fresh object and check status"},{"line_number":1628,"context_line":"        volume \u003d objects.Volume.get_by_id(ctxt, volume.id)"},{"line_number":1629,"context_line":""},{"line_number":1630,"context_line":"        # NOTE(jdg): Set a valid status as a var to minimize errors via typos"},{"line_number":1631,"context_line":"        # also, use a list, we may want to add to it some day"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_7a5a1a2c","line":1628,"range":{"start_line":1628,"start_character":0,"end_line":1628,"end_character":58},"in_reply_to":"fa69d971_4d4a5757","updated":"2016-01-08 17:04:40.000000000","message":"Done","commit_id":"a03a89740a0b0b2408b9bb27795c4ae45d2e7ac1"},{"author":{"_account_id":16793,"name":"Liucheng Jiang","email":"jiangliucheng@huawei.com","username":"Jiangliucheng"},"change_message_id":"fc68df56cc138b21dab8227e3609c88bda210114","unresolved":false,"context_lines":[{"line_number":1624,"context_line":"        # and replica count are to be set via the"},{"line_number":1625,"context_line":"        # volume-type and config files."},{"line_number":1626,"context_line":""},{"line_number":1627,"context_line":"        # Get a fresh object and check status"},{"line_number":1628,"context_line":"        volume.refresh()"},{"line_number":1629,"context_line":""},{"line_number":1630,"context_line":"        # NOTE(jdg): Set a valid status as a var to minimize errors via typos"},{"line_number":1631,"context_line":"        # also, use a list, we may want to add to it some day"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_fcb82313","line":1628,"range":{"start_line":1627,"start_character":0,"end_line":1628,"end_character":24},"updated":"2016-01-11 03:35:27.000000000","message":"Why need refresh, but disable/failover/* does not?","commit_id":"e741fd9d1308a27f06e87ddfa097228343c5888f"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"379cdb9f60349a4464c6e5286d4c7414db782adb","unresolved":false,"context_lines":[{"line_number":1624,"context_line":"        # and replica count are to be set via the"},{"line_number":1625,"context_line":"        # volume-type and config files."},{"line_number":1626,"context_line":""},{"line_number":1627,"context_line":"        # Get a fresh object and check status"},{"line_number":1628,"context_line":"        volume.refresh()"},{"line_number":1629,"context_line":""},{"line_number":1630,"context_line":"        # NOTE(jdg): Set a valid status as a var to minimize errors via typos"},{"line_number":1631,"context_line":"        # also, use a list, we may want to add to it some day"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa69d971_0432605e","line":1628,"range":{"start_line":1627,"start_character":0,"end_line":1628,"end_character":24},"in_reply_to":"fa69d971_fcb82313","updated":"2016-01-11 15:18:59.000000000","message":"I believe it was done to get the latest volume info to make sure replication can be performed.  That said, this patch only updates the code to use versionedobjects.  Whether to use refresh of not is not in scope of this patch.","commit_id":"e741fd9d1308a27f06e87ddfa097228343c5888f"}],"cinder/volume/manager.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"e566de3d0e54817179002044632051f69525258e","unresolved":false,"context_lines":[{"line_number":3116,"context_line":"                volume.save()"},{"line_number":3117,"context_line":""},{"line_number":3118,"context_line":"    # Replication V2 methods"},{"line_number":3119,"context_line":"    def enable_replication(self, context, volume_id, volume\u003dNone):"},{"line_number":3120,"context_line":"        \"\"\"Enable replication on a replication capable volume."},{"line_number":3121,"context_line":""},{"line_number":3122,"context_line":"        If the volume was created on a replication_enabled host this method"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_595bb354","line":3119,"updated":"2015-11-17 21:45:53.000000000","message":"This is a change in the signature.  You would break backwards compat.  Below you should check if volume is an instance of objects.Volume.  If not, you should so a lookup.","commit_id":"fc6a1dca6e13d971a0481124553e2171521f9fdd"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"e566de3d0e54817179002044632051f69525258e","unresolved":false,"context_lines":[{"line_number":3166,"context_line":"        volume.replication_status \u003d \u0027enabled\u0027"},{"line_number":3167,"context_line":"        volume.save()"},{"line_number":3168,"context_line":""},{"line_number":3169,"context_line":"    def disable_replication(self, context, volume_id, volume\u003dNone):"},{"line_number":3170,"context_line":"        \"\"\"Disable replication on the specified volume."},{"line_number":3171,"context_line":""},{"line_number":3172,"context_line":"        If the specified volume is currently replication enabled,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_19552b1c","line":3169,"updated":"2015-11-17 21:45:53.000000000","message":"Ditto","commit_id":"fc6a1dca6e13d971a0481124553e2171521f9fdd"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"e566de3d0e54817179002044632051f69525258e","unresolved":false,"context_lines":[{"line_number":3217,"context_line":"        volume.replication_status \u003d \u0027disabled\u0027"},{"line_number":3218,"context_line":"        volume.save()"},{"line_number":3219,"context_line":""},{"line_number":3220,"context_line":"    def failover_replication(self, context, volume_id, secondary\u003dNone,"},{"line_number":3221,"context_line":"                             volume\u003dNone):"},{"line_number":3222,"context_line":"        \"\"\"Force failover to a secondary replication target."},{"line_number":3223,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_b932df0e","line":3220,"updated":"2015-11-17 21:45:53.000000000","message":"Ditto","commit_id":"fc6a1dca6e13d971a0481124553e2171521f9fdd"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"e566de3d0e54817179002044632051f69525258e","unresolved":false,"context_lines":[{"line_number":3306,"context_line":"        volume.replication_status \u003d \u0027failed-over\u0027"},{"line_number":3307,"context_line":"        volume.save()"},{"line_number":3308,"context_line":""},{"line_number":3309,"context_line":"    def list_replication_targets(self, context, volume_id, volume\u003dNone):"},{"line_number":3310,"context_line":"        \"\"\"Provide a means to obtain replication targets for a volume."},{"line_number":3311,"context_line":""},{"line_number":3312,"context_line":"        This method is used to query a backend to get the current"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_3927cfcb","line":3309,"updated":"2015-11-17 21:45:53.000000000","message":"Ditto","commit_id":"fc6a1dca6e13d971a0481124553e2171521f9fdd"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"8b67d06f29306567a8c8465a2375f2a179d79a3d","unresolved":false,"context_lines":[{"line_number":3307,"context_line":"        volume.replication_status \u003d \u0027failed-over\u0027"},{"line_number":3308,"context_line":"        volume.save()"},{"line_number":3309,"context_line":""},{"line_number":3310,"context_line":"    def list_replication_targets(self, context, volume_id, volume\u003dNone):"},{"line_number":3311,"context_line":"        \"\"\"Provide a means to obtain replication targets for a volume."},{"line_number":3312,"context_line":""},{"line_number":3313,"context_line":"        This method is used to query a backend to get the current"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_5b893dc8","line":3310,"updated":"2015-11-18 15:54:22.000000000","message":"You changes the interface here by changing volume into volume_id, which would break backwards compat.  You should handle list_replication_targets as you did failover_replication.","commit_id":"3c97efe8af272a11661360f42c983d01b18ea360"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"9d8e8fd07c5f56e2c204289e5ed926e7ca76af47","unresolved":false,"context_lines":[{"line_number":3307,"context_line":"        volume.replication_status \u003d \u0027failed-over\u0027"},{"line_number":3308,"context_line":"        volume.save()"},{"line_number":3309,"context_line":""},{"line_number":3310,"context_line":"    def list_replication_targets(self, context, volume_id, volume\u003dNone):"},{"line_number":3311,"context_line":"        \"\"\"Provide a means to obtain replication targets for a volume."},{"line_number":3312,"context_line":""},{"line_number":3313,"context_line":"        This method is used to query a backend to get the current"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_a1bcbadc","line":3310,"in_reply_to":"ba8a016a_5b893dc8","updated":"2015-11-18 17:12:36.000000000","message":"Done","commit_id":"3c97efe8af272a11661360f42c983d01b18ea360"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c50e2945d1d4d7c936f0a4cd3c3a67e746679ff7","unresolved":false,"context_lines":[{"line_number":2262,"context_line":""},{"line_number":2263,"context_line":"    def promote_replica(self, ctxt, volume_id, volume\u003dNone):"},{"line_number":2264,"context_line":"        \"\"\"Promote volume replica secondary to be the primary volume.\"\"\""},{"line_number":2265,"context_line":"        # FIXME(thangp): Remove this in v2.0 of RPC API."},{"line_number":2266,"context_line":"        if volume is None:"},{"line_number":2267,"context_line":"            # For older clients, mimic the old behavior and look up the volume"},{"line_number":2268,"context_line":"            # by its volume_id."}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_94bfe6cf","line":2265,"updated":"2015-11-24 20:31:54.000000000","message":"You should probably add your own nick here, but since Thang already +1\u0027d it… ;)","commit_id":"f06d503eaa81a794b31fc21c8d34ec7d3327cf4c"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"8627e762612fde9d676a9b646577431dd17ab074","unresolved":false,"context_lines":[{"line_number":2260,"context_line":"                 resource\u003dvol_ref)"},{"line_number":2261,"context_line":"        return vol_ref[\u0027id\u0027]"},{"line_number":2262,"context_line":""},{"line_number":2263,"context_line":"    def promote_replica(self, ctxt, volume_id, volume\u003dNone):"},{"line_number":2264,"context_line":"        \"\"\"Promote volume replica secondary to be the primary volume.\"\"\""},{"line_number":2265,"context_line":"        # FIXME(bluex): Remove this in v2.0 of RPC API."},{"line_number":2266,"context_line":"        if volume is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_1c5b8cf7","line":2263,"range":{"start_line":2263,"start_character":58,"end_line":2263,"end_character":60},"updated":"2015-12-21 05:48:07.000000000","message":"I do not think replication V1 methods, like promote_replica and reenable_replication, will have too much support or even new implementation for it. There is no need to convert them into VOs.\n\nIt is enough to convert replication V2 methods, enable, disable, failover and list targets.","commit_id":"2b4ed8bca4b84e8da154f72d7930067a5de5fbd0"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"8627e762612fde9d676a9b646577431dd17ab074","unresolved":false,"context_lines":[{"line_number":2296,"context_line":"        LOG.info(_LI(\"Promote volume replica completed successfully.\"),"},{"line_number":2297,"context_line":"                 resource\u003dvolume)"},{"line_number":2298,"context_line":""},{"line_number":2299,"context_line":"    def reenable_replication(self, ctxt, volume_id, volume\u003dNone):"},{"line_number":2300,"context_line":"        \"\"\"Re-enable replication of secondary volume with primary volumes.\"\"\""},{"line_number":2301,"context_line":"        # FIXME(bluex): Remove this in v2.0 of RPC API."},{"line_number":2302,"context_line":"        if volume is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_bc74b867","line":2299,"range":{"start_line":2299,"start_character":63,"end_line":2299,"end_character":65},"updated":"2015-12-21 05:48:07.000000000","message":"The same to the above.","commit_id":"2b4ed8bca4b84e8da154f72d7930067a5de5fbd0"},{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"0988648f16ef7a53acd0e81b51944eb2910e3153","unresolved":false,"context_lines":[{"line_number":3210,"context_line":"                LOG.error(_LE(\"Can\u0027t enable replication because the \""},{"line_number":3211,"context_line":"                              \"driver isn\u0027t initialized\"))"},{"line_number":3212,"context_line":""},{"line_number":3213,"context_line":"        # FIXME(bluex): Remove this in v2.0 of RPC API."},{"line_number":3214,"context_line":"        if not isinstance(volume, objects.Volume):"},{"line_number":3215,"context_line":"            # For older clients, mimic the old behavior and look up the volume"},{"line_number":3216,"context_line":"            # object."},{"line_number":3217,"context_line":"            volume \u003d objects.Volume.get_by_id(context, volume[\u0027id\u0027])"},{"line_number":3218,"context_line":""},{"line_number":3219,"context_line":"        if volume.replication_status !\u003d \u0027enabling\u0027:"},{"line_number":3220,"context_line":"            msg \u003d (_(\"Unable to enable replication due to invalid \""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa69d971_3756dfce","line":3217,"range":{"start_line":3213,"start_character":1,"end_line":3217,"end_character":68},"updated":"2016-01-05 03:07:57.000000000","message":"Why not extract this to a function like:\n\ndef get_volume_object(self, volume):\n  if not isinstance(volume, objects.Volume):\n      return objects.Volume.get_by_id(context, volume[\u0027id\u0027])\n  return volume\n\nThat will no need to remove this even in v2.0 IMO.","commit_id":"3b766deb3bc2bd98c8af1faa836e022186225614"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"e47ad18bee932c104d7e9ceba86fcb2f559ff3a8","unresolved":false,"context_lines":[{"line_number":3210,"context_line":"                LOG.error(_LE(\"Can\u0027t enable replication because the \""},{"line_number":3211,"context_line":"                              \"driver isn\u0027t initialized\"))"},{"line_number":3212,"context_line":""},{"line_number":3213,"context_line":"        # FIXME(bluex): Remove this in v2.0 of RPC API."},{"line_number":3214,"context_line":"        if not isinstance(volume, objects.Volume):"},{"line_number":3215,"context_line":"            # For older clients, mimic the old behavior and look up the volume"},{"line_number":3216,"context_line":"            # object."},{"line_number":3217,"context_line":"            volume \u003d objects.Volume.get_by_id(context, volume[\u0027id\u0027])"},{"line_number":3218,"context_line":""},{"line_number":3219,"context_line":"        if volume.replication_status !\u003d \u0027enabling\u0027:"},{"line_number":3220,"context_line":"            msg \u003d (_(\"Unable to enable replication due to invalid \""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa69d971_3de79512","line":3217,"range":{"start_line":3213,"start_character":1,"end_line":3217,"end_character":68},"in_reply_to":"fa69d971_3756dfce","updated":"2016-01-05 11:17:54.000000000","message":"Extracting this code won\u0027t change the fact that it will become useless in v2.0 when only volume versioned objects will be passed to this function.","commit_id":"3b766deb3bc2bd98c8af1faa836e022186225614"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"544d0cc5b3c40873f01490af075e8d6a0d544814","unresolved":false,"context_lines":[{"line_number":3442,"context_line":"             \u0027targets\u0027:[\u003ctarget-device-id\u003e,...]\u0027"},{"line_number":3443,"context_line":""},{"line_number":3444,"context_line":"        \"\"\""},{"line_number":3445,"context_line":"        # FIXME(bluex): Remove this in v2.0 of RPC API."},{"line_number":3446,"context_line":"        if not isinstance(volume, objects.Volume):"},{"line_number":3447,"context_line":"            # For older clients, mimic the old behavior and look up the volume"},{"line_number":3448,"context_line":"            # object."},{"line_number":3449,"context_line":"            volume \u003d objects.Volume.get_by_id(context, volume[\u0027id\u0027])"},{"line_number":3450,"context_line":""},{"line_number":3451,"context_line":"        # NOTE(hemna) We intentionally don\u0027t enforce the driver being"},{"line_number":3452,"context_line":"        # initialized here.  because the primary might actually be down,"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_6deddbee","line":3449,"range":{"start_line":3445,"start_character":0,"end_line":3449,"end_character":68},"updated":"2016-01-07 18:27:08.000000000","message":"To do the same you should do volume.refresh() in else clause here - you\u0027ve removed unconditional line that was doing this in 3448. Am I wrong here?","commit_id":"a03a89740a0b0b2408b9bb27795c4ae45d2e7ac1"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"add72e7cdf852c815b907b0bb561edb8cbcd2c38","unresolved":false,"context_lines":[{"line_number":3442,"context_line":"             \u0027targets\u0027:[\u003ctarget-device-id\u003e,...]\u0027"},{"line_number":3443,"context_line":""},{"line_number":3444,"context_line":"        \"\"\""},{"line_number":3445,"context_line":"        # FIXME(bluex): Remove this in v2.0 of RPC API."},{"line_number":3446,"context_line":"        if not isinstance(volume, objects.Volume):"},{"line_number":3447,"context_line":"            # For older clients, mimic the old behavior and look up the volume"},{"line_number":3448,"context_line":"            # object."},{"line_number":3449,"context_line":"            volume \u003d objects.Volume.get_by_id(context, volume[\u0027id\u0027])"},{"line_number":3450,"context_line":""},{"line_number":3451,"context_line":"        # NOTE(hemna) We intentionally don\u0027t enforce the driver being"},{"line_number":3452,"context_line":"        # initialized here.  because the primary might actually be down,"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_a43717af","line":3449,"range":{"start_line":3445,"start_character":0,"end_line":3449,"end_character":68},"in_reply_to":"fa69d971_6deddbee","updated":"2016-01-08 17:04:40.000000000","message":"Fixed","commit_id":"a03a89740a0b0b2408b9bb27795c4ae45d2e7ac1"}],"cinder/volume/rpcapi.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"e566de3d0e54817179002044632051f69525258e","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        msg_args \u003d {\u0027volume_id\u0027: volume.id}"},{"line_number":355,"context_line":"        version \u003d \u00271.38\u0027"},{"line_number":356,"context_line":"        if self.client.can_send_version(version):"},{"line_number":357,"context_line":"            msg_args[\u0027volume\u0027] \u003d volume"},{"line_number":358,"context_line":"        else:"},{"line_number":359,"context_line":"            version \u003d \u00271.27\u0027"},{"line_number":360,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_9916fb53","line":357,"updated":"2015-11-17 21:45:53.000000000","message":"Volume is already sent in the old rpcapi, so there is nothing to do here.","commit_id":"fc6a1dca6e13d971a0481124553e2171521f9fdd"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"e566de3d0e54817179002044632051f69525258e","unresolved":false,"context_lines":[{"line_number":366,"context_line":"        msg_args \u003d {\u0027volume_id\u0027: volume.id}"},{"line_number":367,"context_line":"        version \u003d \u00271.38\u0027"},{"line_number":368,"context_line":"        if self.client.can_send_version(version):"},{"line_number":369,"context_line":"            msg_args[\u0027volume\u0027] \u003d volume"},{"line_number":370,"context_line":"        else:"},{"line_number":371,"context_line":"            version \u003d \u00271.27\u0027"},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_59097330","line":369,"updated":"2015-11-17 21:45:53.000000000","message":"Ditto","commit_id":"fc6a1dca6e13d971a0481124553e2171521f9fdd"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"e566de3d0e54817179002044632051f69525258e","unresolved":false,"context_lines":[{"line_number":379,"context_line":"                    \u0027secondary\u0027: secondary}"},{"line_number":380,"context_line":"        version \u003d \u00271.38\u0027"},{"line_number":381,"context_line":"        if self.client.can_send_version(version):"},{"line_number":382,"context_line":"            msg_args[\u0027volume\u0027] \u003d volume"},{"line_number":383,"context_line":"        else:"},{"line_number":384,"context_line":"            version \u003d \u00271.27\u0027"},{"line_number":385,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_1903eb10","line":382,"updated":"2015-11-17 21:45:53.000000000","message":"Ditto","commit_id":"fc6a1dca6e13d971a0481124553e2171521f9fdd"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"e566de3d0e54817179002044632051f69525258e","unresolved":false,"context_lines":[{"line_number":391,"context_line":"        msg_args \u003d {\u0027volume_id\u0027: volume.id}"},{"line_number":392,"context_line":"        version \u003d \u00271.38\u0027"},{"line_number":393,"context_line":"        if self.client.can_send_version(version):"},{"line_number":394,"context_line":"            msg_args[\u0027volume\u0027] \u003d volume"},{"line_number":395,"context_line":"        else:"},{"line_number":396,"context_line":"            version \u003d \u00271.27\u0027"},{"line_number":397,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_ab03660c","line":394,"updated":"2015-11-17 21:45:53.000000000","message":"Ditto","commit_id":"fc6a1dca6e13d971a0481124553e2171521f9fdd"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"8b67d06f29306567a8c8465a2375f2a179d79a3d","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        msg_args \u003d {\u0027volume_id\u0027: volume.id}"},{"line_number":319,"context_line":"        version \u003d \u00271.38\u0027"},{"line_number":320,"context_line":"        if self.client.can_send_version(version):"},{"line_number":321,"context_line":"            msg_args[\u0027volume\u0027] \u003d volume"},{"line_number":322,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_46f964c6","line":319,"updated":"2015-11-18 15:54:22.000000000","message":"It is better to do:\n\nmsg_args \u003d {\u0027volume_id\u0027: volume.id}\nif self.client.can_send_version(\u00271.38\u0027):\n    msg_args[\u0027volume\u0027] \u003d volume\n    version \u003d \u00271.38\u0027\nelse:\n    version \u003d \u00271.17\u0027\n\nAs we support older release versions, this if/else statement will evolve to something like:\n\nif self.client.can_send_version(\u00271.39\u0027):\n     msg_args[\u0027volume\u0027] \u003d volume\n     msg_args[\u0027foo\u0027] \u003d bar\n     version \u003d \u00271.39\u0027\nelif self.client.can_send_version(\u00271.38\u0027):\n    msg_args[\u0027volume\u0027] \u003d volume\n    version \u003d \u00271.38\u0027\nelse:\n    version \u003d \u00271.17\u0027\n\nI imagine we only need to handle this on a release basis.  This means if changes are made within a release, we just up the existing if self.client.can_send_version() statement.  An elif will be added to handle the previous release.","commit_id":"3c97efe8af272a11661360f42c983d01b18ea360"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"9d8e8fd07c5f56e2c204289e5ed926e7ca76af47","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        msg_args \u003d {\u0027volume_id\u0027: volume.id}"},{"line_number":319,"context_line":"        version \u003d \u00271.38\u0027"},{"line_number":320,"context_line":"        if self.client.can_send_version(version):"},{"line_number":321,"context_line":"            msg_args[\u0027volume\u0027] \u003d volume"},{"line_number":322,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_a1a35ab1","line":319,"in_reply_to":"ba8a016a_46f964c6","updated":"2015-11-18 17:12:36.000000000","message":"Ok.","commit_id":"3c97efe8af272a11661360f42c983d01b18ea360"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"6fd6af9681f84952d65eb6758f0dfc67a87de00c","unresolved":false,"context_lines":[{"line_number":350,"context_line":""},{"line_number":351,"context_line":"    def enable_replication(self, ctxt, volume):"},{"line_number":352,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":353,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.38\u0027)"},{"line_number":354,"context_line":"        cctxt.cast(ctxt, \u0027enable_replication\u0027, volume\u003dvolume)"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"    def disable_replication(self, ctxt, volume):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a8ffd7b_ef5f2b3f","line":353,"updated":"2015-11-26 06:26:50.000000000","message":"Is it possible to use constant instead of multiple \u00271.38\u0027, for example \u0027RPC_API_VERSION\u0027?","commit_id":"bc3722d426514599329e961bcf1bc99bcc8ff676"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"8cb2b2b73f7ac703fcdfe981547e09df6c09f22a","unresolved":false,"context_lines":[{"line_number":350,"context_line":""},{"line_number":351,"context_line":"    def enable_replication(self, ctxt, volume):"},{"line_number":352,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":353,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.38\u0027)"},{"line_number":354,"context_line":"        cctxt.cast(ctxt, \u0027enable_replication\u0027, volume\u003dvolume)"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"    def disable_replication(self, ctxt, volume):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a8ffd7b_f7492bb8","line":353,"in_reply_to":"9a8ffd7b_ef5f2b3f","updated":"2015-11-26 13:28:13.000000000","message":"No because the version will change as methods change.  Each method may have a different version and parameters.","commit_id":"bc3722d426514599329e961bcf1bc99bcc8ff676"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"8627e762612fde9d676a9b646577431dd17ab074","unresolved":false,"context_lines":[{"line_number":312,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.15\u0027)"},{"line_number":313,"context_line":"        cctxt.cast(ctxt, \u0027manage_existing\u0027, volume_id\u003dvolume[\u0027id\u0027], ref\u003dref)"},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"    def promote_replica(self, ctxt, volume):"},{"line_number":316,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        msg_args \u003d {\u0027volume_id\u0027: volume.id}"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_dc718477","line":315,"range":{"start_line":315,"start_character":42,"end_line":315,"end_character":44},"updated":"2015-12-21 05:48:07.000000000","message":"I do not think replication V1 methods, like promote_replica and reenable_replication, will have too much support or even new implementation for it. There is no need to convert them into VOs.\n\nIt is enough to convert replication V2 methods, enable, disable, failover and list targets.","commit_id":"2b4ed8bca4b84e8da154f72d7930067a5de5fbd0"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"8627e762612fde9d676a9b646577431dd17ab074","unresolved":false,"context_lines":[{"line_number":325,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003dversion)"},{"line_number":326,"context_line":"        cctxt.cast(ctxt, \u0027promote_replica\u0027, **msg_args)"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    def reenable_replication(self, ctxt, volume):"},{"line_number":329,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        msg_args \u003d {\u0027volume_id\u0027: volume.id}"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a7e1126_7c6ad082","line":328,"range":{"start_line":328,"start_character":47,"end_line":328,"end_character":49},"updated":"2015-12-21 05:48:07.000000000","message":"The same to the above.","commit_id":"2b4ed8bca4b84e8da154f72d7930067a5de5fbd0"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"544d0cc5b3c40873f01490af075e8d6a0d544814","unresolved":false,"context_lines":[{"line_number":355,"context_line":"                   new_volume\u003dnew_volume,"},{"line_number":356,"context_line":"                   volume_status\u003doriginal_volume_status)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    def enable_replication(self, ctxt, volume):"},{"line_number":359,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":360,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.39\u0027)"},{"line_number":361,"context_line":"        cctxt.cast(ctxt, \u0027enable_replication\u0027, volume\u003dvolume)"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def disable_replication(self, ctxt, volume):"},{"line_number":364,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":365,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.39\u0027)"},{"line_number":366,"context_line":"        cctxt.cast(ctxt, \u0027disable_replication\u0027,"},{"line_number":367,"context_line":"                   volume\u003dvolume)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    def failover_replication(self, ctxt, volume, secondary\u003dNone):"},{"line_number":370,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":371,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.39\u0027)"},{"line_number":372,"context_line":"        cctxt.cast(ctxt, \u0027failover_replication\u0027,"},{"line_number":373,"context_line":"                   volume\u003dvolume,"},{"line_number":374,"context_line":"                   secondary\u003dsecondary)"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    def list_replication_targets(self, ctxt, volume):"},{"line_number":377,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":378,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.39\u0027)"},{"line_number":379,"context_line":"        return cctxt.call(ctxt, \u0027list_replication_targets\u0027, volume\u003dvolume)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    def manage_existing_snapshot(self, ctxt, snapshot, ref, host):"},{"line_number":382,"context_line":"        cctxt \u003d self.client.prepare(server\u003dhost, version\u003d\u00271.28\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_2d2fe3f7","line":379,"range":{"start_line":358,"start_character":0,"end_line":379,"end_character":74},"updated":"2016-01-07 18:27:08.000000000","message":"Shouldn\u0027t you convert the volume object to dict here before sending if version cap is forbidding 1.39? You can do that using jsonutils.to_primitive().","commit_id":"a03a89740a0b0b2408b9bb27795c4ae45d2e7ac1"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"add72e7cdf852c815b907b0bb561edb8cbcd2c38","unresolved":false,"context_lines":[{"line_number":355,"context_line":"                   new_volume\u003dnew_volume,"},{"line_number":356,"context_line":"                   volume_status\u003doriginal_volume_status)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    def enable_replication(self, ctxt, volume):"},{"line_number":359,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":360,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.39\u0027)"},{"line_number":361,"context_line":"        cctxt.cast(ctxt, \u0027enable_replication\u0027, volume\u003dvolume)"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def disable_replication(self, ctxt, volume):"},{"line_number":364,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":365,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.39\u0027)"},{"line_number":366,"context_line":"        cctxt.cast(ctxt, \u0027disable_replication\u0027,"},{"line_number":367,"context_line":"                   volume\u003dvolume)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    def failover_replication(self, ctxt, volume, secondary\u003dNone):"},{"line_number":370,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":371,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.39\u0027)"},{"line_number":372,"context_line":"        cctxt.cast(ctxt, \u0027failover_replication\u0027,"},{"line_number":373,"context_line":"                   volume\u003dvolume,"},{"line_number":374,"context_line":"                   secondary\u003dsecondary)"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    def list_replication_targets(self, ctxt, volume):"},{"line_number":377,"context_line":"        new_host \u003d utils.extract_host(volume.host)"},{"line_number":378,"context_line":"        cctxt \u003d self.client.prepare(server\u003dnew_host, version\u003d\u00271.39\u0027)"},{"line_number":379,"context_line":"        return cctxt.call(ctxt, \u0027list_replication_targets\u0027, volume\u003dvolume)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    def manage_existing_snapshot(self, ctxt, snapshot, ref, host):"},{"line_number":382,"context_line":"        cctxt \u003d self.client.prepare(server\u003dhost, version\u003d\u00271.28\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_7a23faa7","line":379,"range":{"start_line":358,"start_character":0,"end_line":379,"end_character":74},"in_reply_to":"fa69d971_2d2fe3f7","updated":"2016-01-08 17:04:40.000000000","message":"Citing Thang Pham:\n\"Volume is already sent in the old rpcapi, so there is nothing to do here.\"","commit_id":"a03a89740a0b0b2408b9bb27795c4ae45d2e7ac1"}]}
