)]}'
{"cinder/objects/backup.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"6a756999124769c5343c0a453576c0df48d36006","unresolved":false,"context_lines":[{"line_number":212,"context_line":""},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"@base.CinderObjectRegistry.register"},{"line_number":215,"context_line":"class BackupDevice(base.CinderObject, base.CinderObjectDictCompat,"},{"line_number":216,"context_line":"                   base.CinderComparableObject):"},{"line_number":217,"context_line":"    # Version 1.0: Initial version"},{"line_number":218,"context_line":"    VERSION \u003d \u00271.0\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_5deda7b6","line":215,"range":{"start_line":215,"start_character":6,"end_line":215,"end_character":18},"updated":"2016-06-15 09:20:46.000000000","message":"BackupDeviceInfo would probably be a better name.","commit_id":"3398bdf341b5e290ab71b07468b7ec79af673e0b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"6a756999124769c5343c0a453576c0df48d36006","unresolved":false,"context_lines":[{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    @property"},{"line_number":227,"context_line":"    def is_snapshot(self):"},{"line_number":228,"context_line":"        return self.snapshot is not None"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    @property"},{"line_number":231,"context_line":"    def device_obj(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_9d4c2f9f","line":228,"range":{"start_line":228,"start_character":15,"end_line":228,"end_character":40},"updated":"2016-06-15 09:20:46.000000000","message":"And a better check would be:\n\n if self.obj_attr_is_set(\u0027snapshot\u0027):","commit_id":"3398bdf341b5e290ab71b07468b7ec79af673e0b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"6a756999124769c5343c0a453576c0df48d36006","unresolved":false,"context_lines":[{"line_number":223,"context_line":"    }"},{"line_number":224,"context_line":"    obj_extra_fields \u003d [\u0027is_snapshot\u0027, \u0027device_obj\u0027]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    @property"},{"line_number":227,"context_line":"    def is_snapshot(self):"},{"line_number":228,"context_line":"        return self.snapshot is not None"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    @property"},{"line_number":231,"context_line":"    def device_obj(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_7d4ce3c8","line":228,"range":{"start_line":226,"start_character":0,"end_line":228,"end_character":40},"updated":"2016-06-15 09:20:46.000000000","message":"Just to detect problems early - can we make that raise ProgrammingError if both snapshot and volume are set?","commit_id":"3398bdf341b5e290ab71b07468b7ec79af673e0b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"6a756999124769c5343c0a453576c0df48d36006","unresolved":false,"context_lines":[{"line_number":241,"context_line":"                    expected_attrs\u003dexpected_attrs)"},{"line_number":242,"context_line":"            else:"},{"line_number":243,"context_line":"                backup_device.snapshot \u003d primitive[\u0027backup_device\u0027]"},{"line_number":244,"context_line":"            backup_device.volume \u003d None"},{"line_number":245,"context_line":"        else:"},{"line_number":246,"context_line":"            backup_device.snapshot \u003d None"},{"line_number":247,"context_line":"            backup_device.volume \u003d objects.Volume._from_db_object("}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_7d9183f1","line":244,"range":{"start_line":244,"start_character":12,"end_line":244,"end_character":39},"updated":"2016-06-15 09:20:46.000000000","message":"Hm, do we need this one if we\u0027ll do is_snapshot through obj_attr_is_set?","commit_id":"3398bdf341b5e290ab71b07468b7ec79af673e0b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"6a756999124769c5343c0a453576c0df48d36006","unresolved":false,"context_lines":[{"line_number":243,"context_line":"                backup_device.snapshot \u003d primitive[\u0027backup_device\u0027]"},{"line_number":244,"context_line":"            backup_device.volume \u003d None"},{"line_number":245,"context_line":"        else:"},{"line_number":246,"context_line":"            backup_device.snapshot \u003d None"},{"line_number":247,"context_line":"            backup_device.volume \u003d objects.Volume._from_db_object("},{"line_number":248,"context_line":"                context, objects.Volume(), primitive[\u0027backup_device\u0027],"},{"line_number":249,"context_line":"                expected_attrs\u003dexpected_attrs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_5d8e47d1","line":246,"range":{"start_line":246,"start_character":12,"end_line":246,"end_character":41},"updated":"2016-06-15 09:20:46.000000000","message":"Ditto.","commit_id":"3398bdf341b5e290ab71b07468b7ec79af673e0b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"6a756999124769c5343c0a453576c0df48d36006","unresolved":false,"context_lines":[{"line_number":244,"context_line":"            backup_device.volume \u003d None"},{"line_number":245,"context_line":"        else:"},{"line_number":246,"context_line":"            backup_device.snapshot \u003d None"},{"line_number":247,"context_line":"            backup_device.volume \u003d objects.Volume._from_db_object("},{"line_number":248,"context_line":"                context, objects.Volume(), primitive[\u0027backup_device\u0027],"},{"line_number":249,"context_line":"                expected_attrs\u003dexpected_attrs)"},{"line_number":250,"context_line":"        backup_device.secure_enabled \u003d primitive[\u0027secure_enabled\u0027]"},{"line_number":251,"context_line":"        return backup_device"},{"line_number":252,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_3d0a5b28","line":249,"range":{"start_line":247,"start_character":0,"end_line":249,"end_character":46},"updated":"2016-06-15 09:20:46.000000000","message":"Can we have same safety code checking if primitive[\u0027backup_device\u0027] is a dict here?","commit_id":"3398bdf341b5e290ab71b07468b7ec79af673e0b"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"1e392f4c2268b32c7385fb576d94d8df9c49eb19","unresolved":false,"context_lines":[{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    @classmethod"},{"line_number":238,"context_line":"    def from_primitive(cls, primitive, context, expected_attrs\u003dNone):"},{"line_number":239,"context_line":"        backup_device \u003d BackupDeviceInfo()"},{"line_number":240,"context_line":"        if primitive[\u0027is_snapshot\u0027]:"},{"line_number":241,"context_line":"            if isinstance(primitive[\u0027backup_device\u0027], objects.Snapshot):"},{"line_number":242,"context_line":"                backup_device.snapshot \u003d primitive[\u0027backup_device\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_f5ff8831","line":239,"range":{"start_line":239,"start_character":0,"end_line":239,"end_character":8},"updated":"2016-07-27 05:52:14.000000000","message":"This method will not be needed once we began early 0. Please could you add a FIXME comment like below:\n\n\n # FIXME(bluex): This should go away in early O as we stop\n # supporting backward compatibility with M.","commit_id":"87dfaf75e319bfa2ea24e17f212d09117ddac8e6"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"1e392f4c2268b32c7385fb576d94d8df9c49eb19","unresolved":false,"context_lines":[{"line_number":255,"context_line":"        return backup_device"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    def to_primitive(self, context):"},{"line_number":258,"context_line":"        backup_device \u003d (db.snapshot_get(context, self.snapshot.id)"},{"line_number":259,"context_line":"                         if self.is_snapshot"},{"line_number":260,"context_line":"                         else db.volume_get(context, self.volume.id))"},{"line_number":261,"context_line":"        primitive \u003d {\u0027backup_device\u0027: backup_device,"}],"source_content_type":"text/x-python","patch_set":6,"id":"dada55a8_35f6405d","line":258,"range":{"start_line":258,"start_character":0,"end_line":258,"end_character":8},"updated":"2016-07-27 05:52:14.000000000","message":"ditto","commit_id":"87dfaf75e319bfa2ea24e17f212d09117ddac8e6"}],"cinder/objects/snapshot.py":[{"author":{"_account_id":17275,"name":"Nate Potter","email":"nathaniel.potter@intel.com","username":"npotter"},"change_message_id":"4430201bfbcc405498484363e2a2f6c1d2c7c540","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"@base.CinderObjectRegistry.register"},{"line_number":31,"context_line":"class Snapshot(base.CinderPersistentObject, base.CinderObject,"},{"line_number":32,"context_line":"               base.CinderObjectDictCompat, base.CinderComparableObject):"},{"line_number":33,"context_line":"    # Version 1.0: Initial version"},{"line_number":34,"context_line":"    # Version 1.1: Changed \u0027status\u0027 field to use SnapshotStatusField"},{"line_number":35,"context_line":"    VERSION \u003d \u00271.1\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_1a179b52","line":32,"updated":"2016-07-27 19:34:46.000000000","message":"I\u0027m not sure of this, but does adding a new inheriting class necessitate bumping up the version or not? I suppose no fields are being changed or anything.","commit_id":"87dfaf75e319bfa2ea24e17f212d09117ddac8e6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"0161faabf1865567d7aa6874aa1a78df04bf220e","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"@base.CinderObjectRegistry.register"},{"line_number":31,"context_line":"class Snapshot(base.CinderPersistentObject, base.CinderObject,"},{"line_number":32,"context_line":"               base.CinderObjectDictCompat, base.CinderComparableObject):"},{"line_number":33,"context_line":"    # Version 1.0: Initial version"},{"line_number":34,"context_line":"    # Version 1.1: Changed \u0027status\u0027 field to use SnapshotStatusField"},{"line_number":35,"context_line":"    VERSION \u003d \u00271.1\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ac06dbe_af1830d4","line":32,"range":{"start_line":32,"start_character":42,"end_line":32,"end_character":71},"updated":"2016-08-23 11:31:34.000000000","message":"For reference - this is okay to be added without a version bump.","commit_id":"124c69ea2f3320989a6f7cedbba8c8e9e9149d1a"}],"cinder/tests/unit/backup/test_backup.py":[{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"cb6ba8a8a04b0a177ed6beba947f27eeab1d664f","unresolved":false,"context_lines":[{"line_number":1355,"context_line":"        self.assertEqual(fields.BackupStatus.ERROR, backup[\u0027status\u0027])"},{"line_number":1356,"context_line":""},{"line_number":1357,"context_line":""},{"line_number":1358,"context_line":"class BackupDeviceInfoTestCase(BaseBackupTest):"},{"line_number":1359,"context_line":"    def setUp(self):"},{"line_number":1360,"context_line":"        super(BackupDeviceInfoTestCase, self).setUp()"},{"line_number":1361,"context_line":"        vol_size \u003d 1"},{"line_number":1362,"context_line":"        self.vol_id \u003d self._create_volume_db_entry("},{"line_number":1363,"context_line":"            status\u003d\u0027available\u0027, size\u003dvol_size)"},{"line_number":1364,"context_line":"        self.snap \u003d self._create_snapshot_db_entry("},{"line_number":1365,"context_line":"            status\u003dfields.BackupStatus.AVAILABLE, volume_id\u003dself.vol_id)"},{"line_number":1366,"context_line":"        self.backup_device_dict \u003d {\u0027secure_enabled\u0027: False,"},{"line_number":1367,"context_line":"                                   \u0027is_snapshot\u0027: False, }"},{"line_number":1368,"context_line":""},{"line_number":1369,"context_line":"    def test_from_primitive_with_volume(self):"},{"line_number":1370,"context_line":"        vol \u003d objects.Volume.get_by_id(self.ctxt, self.vol_id)"},{"line_number":1371,"context_line":"        self.backup_device_dict[\u0027backup_device\u0027] \u003d vol"},{"line_number":1372,"context_line":"        backup_device_info \u003d objects.BackupDeviceInfo.from_primitive("},{"line_number":1373,"context_line":"            self.backup_device_dict, self.ctxt)"},{"line_number":1374,"context_line":"        self.assertFalse(backup_device_info.is_snapshot)"},{"line_number":1375,"context_line":"        self.assertEqual(self.backup_device_dict[\u0027secure_enabled\u0027],"},{"line_number":1376,"context_line":"                         backup_device_info.secure_enabled)"},{"line_number":1377,"context_line":"        self.assertEqual(vol, backup_device_info.volume)"},{"line_number":1378,"context_line":""},{"line_number":1379,"context_line":"        vol_db \u003d db.volume_get(self.ctxt, self.vol_id)"},{"line_number":1380,"context_line":"        self.backup_device_dict[\u0027backup_device\u0027] \u003d vol_db._as_dict()"},{"line_number":1381,"context_line":"        backup_device_info \u003d objects.BackupDeviceInfo.from_primitive("},{"line_number":1382,"context_line":"            self.backup_device_dict, self.ctxt)"},{"line_number":1383,"context_line":"        vol \u003d objects.Volume._from_db_object(self.ctxt, objects.Volume(),"},{"line_number":1384,"context_line":"                                             vol_db)"},{"line_number":1385,"context_line":"        self.assertEqual(vol, backup_device_info.volume)"},{"line_number":1386,"context_line":""},{"line_number":1387,"context_line":"    def test_from_primitive_with_snapshot(self):"},{"line_number":1388,"context_line":"        snap \u003d self.snap"},{"line_number":1389,"context_line":"        self.backup_device_dict[\u0027is_snapshot\u0027] \u003d True"},{"line_number":1390,"context_line":"        self.backup_device_dict[\u0027backup_device\u0027] \u003d snap"},{"line_number":1391,"context_line":"        backup_device_info \u003d objects.BackupDeviceInfo.from_primitive("},{"line_number":1392,"context_line":"            self.backup_device_dict, self.ctxt, expected_attrs\u003d[\u0027metadata\u0027])"},{"line_number":1393,"context_line":"        self.assertTrue(backup_device_info.is_snapshot)"},{"line_number":1394,"context_line":"        self.assertEqual(self.backup_device_dict[\u0027secure_enabled\u0027],"},{"line_number":1395,"context_line":"                         backup_device_info.secure_enabled)"},{"line_number":1396,"context_line":"        self.assertEqual(snap, backup_device_info.snapshot)"},{"line_number":1397,"context_line":""},{"line_number":1398,"context_line":"        snap_db \u003d db.snapshot_get(self.ctxt, snap.id)"},{"line_number":1399,"context_line":"        self.backup_device_dict[\u0027backup_device\u0027] \u003d snap_db._as_dict()"},{"line_number":1400,"context_line":"        backup_device_info \u003d objects.BackupDeviceInfo.from_primitive("},{"line_number":1401,"context_line":"            self.backup_device_dict, self.ctxt, expected_attrs\u003d[\u0027metadata\u0027])"},{"line_number":1402,"context_line":"        self.assertEqual(snap, backup_device_info.snapshot)"},{"line_number":1403,"context_line":""},{"line_number":1404,"context_line":"    def test_to_primitive_with_volume(self):"},{"line_number":1405,"context_line":"        vol \u003d objects.Volume.get_by_id(self.ctxt, self.vol_id)"},{"line_number":1406,"context_line":"        vol_db \u003d db.volume_get(self.ctxt, self.vol_id)"},{"line_number":1407,"context_line":"        self.backup_device_dict[\u0027backup_device\u0027] \u003d vol_db"},{"line_number":1408,"context_line":"        backup_device_info \u003d objects.BackupDeviceInfo()"},{"line_number":1409,"context_line":"        backup_device_info.volume \u003d vol"},{"line_number":1410,"context_line":"        backup_device_info.secure_enabled \u003d ("},{"line_number":1411,"context_line":"            self.backup_device_dict[\u0027secure_enabled\u0027])"},{"line_number":1412,"context_line":""},{"line_number":1413,"context_line":"        backup_device_ret_dict \u003d backup_device_info.to_primitive(self.ctxt)"},{"line_number":1414,"context_line":"        self.assertEqual(self.backup_device_dict[\u0027secure_enabled\u0027],"},{"line_number":1415,"context_line":"                         backup_device_ret_dict[\u0027secure_enabled\u0027])"},{"line_number":1416,"context_line":"        self.assertFalse(backup_device_ret_dict[\u0027is_snapshot\u0027])"},{"line_number":1417,"context_line":"        self.assertEqual(self.backup_device_dict[\u0027backup_device\u0027]._as_dict(),"},{"line_number":1418,"context_line":"                         backup_device_ret_dict[\u0027backup_device\u0027]._as_dict())"},{"line_number":1419,"context_line":""},{"line_number":1420,"context_line":"    def test_to_primitive_with_snapshot(self):"},{"line_number":1421,"context_line":"        snap \u003d self.snap"},{"line_number":1422,"context_line":"        snap_db \u003d db.snapshot_get(self.ctxt, snap.id)"},{"line_number":1423,"context_line":"        self.backup_device_dict[\u0027backup_device\u0027] \u003d snap_db"},{"line_number":1424,"context_line":"        backup_device_info \u003d objects.BackupDeviceInfo()"},{"line_number":1425,"context_line":"        backup_device_info.snapshot \u003d snap"},{"line_number":1426,"context_line":"        backup_device_info.secure_enabled \u003d ("},{"line_number":1427,"context_line":"            self.backup_device_dict[\u0027secure_enabled\u0027])"},{"line_number":1428,"context_line":""},{"line_number":1429,"context_line":"        backup_device_ret_dict \u003d backup_device_info.to_primitive(self.ctxt)"},{"line_number":1430,"context_line":"        self.assertEqual(self.backup_device_dict[\u0027secure_enabled\u0027],"},{"line_number":1431,"context_line":"                         backup_device_ret_dict[\u0027secure_enabled\u0027])"},{"line_number":1432,"context_line":"        self.assertTrue(backup_device_ret_dict[\u0027is_snapshot\u0027])"},{"line_number":1433,"context_line":"        # NOTE(sborkows): since volume in sqlalchemy snapshot is a sqlalchemy"},{"line_number":1434,"context_line":"        # object too, to compare snapshots we need to convert their volumes to"},{"line_number":1435,"context_line":"        # dicts."},{"line_number":1436,"context_line":"        snap_actual_dict \u003d self.backup_device_dict[\u0027backup_device\u0027]._as_dict()"},{"line_number":1437,"context_line":"        snap_ref_dict \u003d backup_device_ret_dict[\u0027backup_device\u0027]._as_dict()"},{"line_number":1438,"context_line":"        snap_actual_dict[\u0027volume\u0027] \u003d snap_actual_dict[\u0027volume\u0027]._as_dict()"},{"line_number":1439,"context_line":"        snap_ref_dict[\u0027volume\u0027] \u003d snap_ref_dict[\u0027volume\u0027]._as_dict()"},{"line_number":1440,"context_line":"        self.assertEqual(snap_actual_dict, snap_ref_dict)"},{"line_number":1441,"context_line":""},{"line_number":1442,"context_line":"    def test_is_snapshot_both_volume_and_snapshot_raises_error(self):"},{"line_number":1443,"context_line":"        snap \u003d self.snap"},{"line_number":1444,"context_line":"        vol \u003d objects.Volume.get_by_id(self.ctxt, self.vol_id)"},{"line_number":1445,"context_line":"        backup_device_info \u003d objects.BackupDeviceInfo()"},{"line_number":1446,"context_line":"        backup_device_info.snapshot \u003d snap"},{"line_number":1447,"context_line":"        backup_device_info.volume \u003d vol"},{"line_number":1448,"context_line":"        backup_device_info.secure_enabled \u003d ("},{"line_number":1449,"context_line":"            self.backup_device_dict[\u0027secure_enabled\u0027])"},{"line_number":1450,"context_line":"        self.assertRaises(exception.ProgrammingError, getattr,"},{"line_number":1451,"context_line":"                          backup_device_info, \u0027is_snapshot\u0027)"},{"line_number":1452,"context_line":""},{"line_number":1453,"context_line":"    def test_is_snapshot_neither_volume_nor_snapshot_raises_error(self):"},{"line_number":1454,"context_line":"        backup_device_info \u003d objects.BackupDeviceInfo()"},{"line_number":1455,"context_line":"        backup_device_info.secure_enabled \u003d ("},{"line_number":1456,"context_line":"            self.backup_device_dict[\u0027secure_enabled\u0027])"},{"line_number":1457,"context_line":"        self.assertRaises(exception.ProgrammingError, getattr,"},{"line_number":1458,"context_line":"                          backup_device_info, \u0027is_snapshot\u0027)"},{"line_number":1459,"context_line":""},{"line_number":1460,"context_line":"    def test_device_obj_with_volume(self):"},{"line_number":1461,"context_line":"        vol \u003d objects.Volume.get_by_id(self.ctxt, self.vol_id)"},{"line_number":1462,"context_line":"        backup_device_info \u003d objects.BackupDeviceInfo()"},{"line_number":1463,"context_line":"        backup_device_info.volume \u003d vol"},{"line_number":1464,"context_line":"        backup_device_info.secure_enabled \u003d ("},{"line_number":1465,"context_line":"            self.backup_device_dict[\u0027secure_enabled\u0027])"},{"line_number":1466,"context_line":"        backup_device_obj \u003d backup_device_info.device_obj"},{"line_number":1467,"context_line":"        self.assertIsInstance(backup_device_obj, objects.Volume)"},{"line_number":1468,"context_line":"        self.assertEqual(vol, backup_device_obj)"},{"line_number":1469,"context_line":""},{"line_number":1470,"context_line":"    def test_device_obj_with_snapshot(self):"},{"line_number":1471,"context_line":"        snap \u003d self.snap"},{"line_number":1472,"context_line":"        backup_device_info \u003d objects.BackupDeviceInfo()"},{"line_number":1473,"context_line":"        backup_device_info.snapshot \u003d snap"},{"line_number":1474,"context_line":"        backup_device_info.secure_enabled \u003d ("},{"line_number":1475,"context_line":"            self.backup_device_dict[\u0027secure_enabled\u0027])"},{"line_number":1476,"context_line":"        backup_device_obj \u003d backup_device_info.device_obj"},{"line_number":1477,"context_line":"        self.assertIsInstance(backup_device_obj, objects.Snapshot)"},{"line_number":1478,"context_line":"        self.assertEqual(snap, backup_device_obj)"},{"line_number":1479,"context_line":""},{"line_number":1480,"context_line":""},{"line_number":1481,"context_line":"@ddt.ddt"}],"source_content_type":"text/x-python","patch_set":10,"id":"3ac371cc_0c236d57","line":1478,"range":{"start_line":1358,"start_character":0,"end_line":1478,"end_character":49},"updated":"2016-08-17 08:56:13.000000000","message":"-1\n\nThis should be moved to cinder/tests/unit/objects/test_backup.py","commit_id":"491cee013ce4e1817031072509b685b6d0e47096"}],"cinder/tests/unit/test_volume_rpcapi.py":[{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"c1cf0ec39df81ef38483e101802950cf989f013b","unresolved":false,"context_lines":[{"line_number":520,"context_line":"                              rpc_method\u003d\u0027call\u0027,"},{"line_number":521,"context_line":"                              backup\u003dself.fake_backup_obj,"},{"line_number":522,"context_line":"                              volume\u003dself.fake_volume_obj,"},{"line_number":523,"context_line":"                              version\u003d\u00272.3\u0027)"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027,"},{"line_number":526,"context_line":"                return_value\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_22bc7f05","line":523,"range":{"start_line":523,"start_character":42,"end_line":523,"end_character":44},"updated":"2016-08-04 15:06:27.000000000","message":"This should be 2.5","commit_id":"06f485e7c0cd1d33d6af3c9cf81d29ee7a30d50a"}],"cinder/volume/manager.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"6a756999124769c5343c0a453576c0df48d36006","unresolved":false,"context_lines":[{"line_number":3465,"context_line":"        backup_device_dict \u003d {\u0027backup_device\u0027: backup_device,"},{"line_number":3466,"context_line":"                              \u0027secure_enabled\u0027: secure_enabled,"},{"line_number":3467,"context_line":"                              \u0027is_snapshot\u0027: is_snapshot, }"},{"line_number":3468,"context_line":"        return objects.BackupDevice.from_primitive(backup_device_dict, ctxt)"},{"line_number":3469,"context_line":""},{"line_number":3470,"context_line":"    def secure_file_operations_enabled(self, ctxt, volume):"},{"line_number":3471,"context_line":"        secure_enabled \u003d self.driver.secure_file_operations_enabled()"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aa08908_c801d36f","line":3468,"range":{"start_line":3468,"start_character":0,"end_line":3468,"end_character":76},"updated":"2016-06-15 09:20:46.000000000","message":"The result should be based on the version pin we\u0027re running with currently. This is volume RPC API, so something like this is needed to decide if we\u0027re returning dict or object:\n\n rpcapi \u003d volume_rpcapi.VolumeAPI()\n version \u003d rpcapi._determine_rpc_version_cap()\n #convert version to tuple using versionutils\n if version \u003c \"sth\":\n     return backup_device_dict\n else:\n     return objects.BackupDevice.from_primitive(backup_device_dict, ctxt)","commit_id":"3398bdf341b5e290ab71b07468b7ec79af673e0b"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"b7efe8b4b446f62156cfec3b777ab9d090e2dc48","unresolved":false,"context_lines":[{"line_number":3412,"context_line":"        LOG.debug(\"Obtained capabilities list: %s.\", capabilities)"},{"line_number":3413,"context_line":"        return capabilities"},{"line_number":3414,"context_line":""},{"line_number":3415,"context_line":"    def get_backup_device(self, ctxt, backup, want_objects\u003dFalse):"},{"line_number":3416,"context_line":"        (backup_device, is_snapshot) \u003d ("},{"line_number":3417,"context_line":"            self.driver.get_backup_device(ctxt, backup))"},{"line_number":3418,"context_line":"        secure_enabled \u003d self.driver.secure_file_operations_enabled()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_d84b392a","line":3415,"updated":"2016-07-28 05:30:22.000000000","message":"I am wondering whether we can do like: If upgrading to n, return dict, or else return object. This logic can be easily removed in O release. \n\n\nhttps://github.com/openstack/cinder/blob/master/cinder/service.py#L212\n\nWith the parameter want_objects, it becomes useless in O release but can\u0027t be removed.","commit_id":"87dfaf75e319bfa2ea24e17f212d09117ddac8e6"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"7e4176d94d02707bb7dcb46e7f93138028e5c788","unresolved":false,"context_lines":[{"line_number":3412,"context_line":"        LOG.debug(\"Obtained capabilities list: %s.\", capabilities)"},{"line_number":3413,"context_line":"        return capabilities"},{"line_number":3414,"context_line":""},{"line_number":3415,"context_line":"    def get_backup_device(self, ctxt, backup, want_objects\u003dFalse):"},{"line_number":3416,"context_line":"        (backup_device, is_snapshot) \u003d ("},{"line_number":3417,"context_line":"            self.driver.get_backup_device(ctxt, backup))"},{"line_number":3418,"context_line":"        secure_enabled \u003d self.driver.secure_file_operations_enabled()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_46ebc3b0","line":3415,"in_reply_to":"bacf61ea_d84b392a","updated":"2016-07-28 19:16:18.000000000","message":"HI Lisa,\n\nI believe it is not possible to know the what version( supporting dict or obj) of backup manager makes the call to the volume manager.\n\nThis is how nova handles it. IMO, this approach seems to be right one for now.","commit_id":"87dfaf75e319bfa2ea24e17f212d09117ddac8e6"},{"author":{"_account_id":17275,"name":"Nate Potter","email":"nathaniel.potter@intel.com","username":"npotter"},"change_message_id":"4430201bfbcc405498484363e2a2f6c1d2c7c540","unresolved":false,"context_lines":[{"line_number":3419,"context_line":"        backup_device_dict \u003d {\u0027backup_device\u0027: backup_device,"},{"line_number":3420,"context_line":"                              \u0027secure_enabled\u0027: secure_enabled,"},{"line_number":3421,"context_line":"                              \u0027is_snapshot\u0027: is_snapshot, }"},{"line_number":3422,"context_line":"        return (objects.BackupDeviceInfo.from_primitive(backup_device_dict,"},{"line_number":3423,"context_line":"                                                        ctxt)"},{"line_number":3424,"context_line":"                if want_objects else backup_device_dict)"},{"line_number":3425,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_a09c606a","line":3422,"range":{"start_line":3422,"start_character":41,"end_line":3422,"end_character":55},"updated":"2016-07-27 19:34:46.000000000","message":"If from_primitive is going to be removed in O, putting a TODO here saying this logic will change might be good.","commit_id":"87dfaf75e319bfa2ea24e17f212d09117ddac8e6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"538e76b0e0fc25d70ee025899a06a2893be6ac92","unresolved":false,"context_lines":[{"line_number":4263,"context_line":"        LOG.debug(\"Obtained capabilities list: %s.\", capabilities)"},{"line_number":4264,"context_line":"        return capabilities"},{"line_number":4265,"context_line":""},{"line_number":4266,"context_line":"    def get_backup_device(self, ctxt, backup, want_objects\u003dFalse):"},{"line_number":4267,"context_line":"        (backup_device, is_snapshot) \u003d ("},{"line_number":4268,"context_line":"            self.driver.get_backup_device(ctxt, backup))"},{"line_number":4269,"context_line":"        secure_enabled \u003d self.driver.secure_file_operations_enabled()"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a95cdbc_81794c32","line":4266,"range":{"start_line":4266,"start_character":44,"end_line":4266,"end_character":64},"updated":"2016-10-04 19:56:03.000000000","message":"Aren\u0027t we missing want_objects in volume.rpcapi?","commit_id":"78144eac21e71f7076fa2f5c093027a034dacb40"}],"cinder/volume/rpcapi.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"7b5dc391fb86b4756b2c8a0592eb3d268372b34d","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        return cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def get_backup_device(self, ctxt, backup, volume):"},{"line_number":294,"context_line":"        cctxt \u003d self._get_cctxt(volume.host, \u00272.0\u0027)"},{"line_number":295,"context_line":"        return cctxt.call(ctxt, \u0027get_backup_device\u0027, backup\u003dbackup)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    def secure_file_operations_enabled(self, ctxt, volume):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_2db82675","line":294,"range":{"start_line":294,"start_character":44,"end_line":294,"end_character":50},"updated":"2016-06-16 11:28:40.000000000","message":"You should use can_send_version to determine if you\u0027re sending the message as 2.0 or 2.2.","commit_id":"361066995fc880106756773b704e3437198b0247"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"7b5dc391fb86b4756b2c8a0592eb3d268372b34d","unresolved":false,"context_lines":[{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def get_backup_device(self, ctxt, backup, volume):"},{"line_number":294,"context_line":"        cctxt \u003d self._get_cctxt(volume.host, \u00272.0\u0027)"},{"line_number":295,"context_line":"        return cctxt.call(ctxt, \u0027get_backup_device\u0027, backup\u003dbackup)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    def secure_file_operations_enabled(self, ctxt, volume):"},{"line_number":298,"context_line":"        cctxt \u003d self._get_cctxt(volume.host, \u00272.0\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_4d11325d","line":295,"range":{"start_line":295,"start_character":15,"end_line":295,"end_character":67},"updated":"2016-06-16 11:28:40.000000000","message":"You may get a dict here from older service. Please convert it to object using from_primitive in that case.","commit_id":"361066995fc880106756773b704e3437198b0247"},{"author":{"_account_id":19213,"name":"Szymon Borkowski","email":"szymon.borkowski@intel.com","username":"sborkows"},"change_message_id":"c77583d650a6e23d414b2bf67b0ad8dcd83468fb","unresolved":false,"context_lines":[{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def get_backup_device(self, ctxt, backup, volume):"},{"line_number":294,"context_line":"        cctxt \u003d self._get_cctxt(volume.host, \u00272.0\u0027)"},{"line_number":295,"context_line":"        return cctxt.call(ctxt, \u0027get_backup_device\u0027, backup\u003dbackup)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    def secure_file_operations_enabled(self, ctxt, volume):"},{"line_number":298,"context_line":"        cctxt \u003d self._get_cctxt(volume.host, \u00272.0\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7aa08908_94bdde69","line":295,"range":{"start_line":295,"start_character":15,"end_line":295,"end_character":67},"in_reply_to":"7aa08908_4d11325d","updated":"2016-06-16 13:36:33.000000000","message":"There is actually a problem when older backup service makes a RPC call to a newer volume service, because we cannot specify the version of the first one inside the second one.","commit_id":"361066995fc880106756773b704e3437198b0247"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"af7c43be9e46ffa0c072975da8a5b3eaac1c20e0","unresolved":false,"context_lines":[{"line_number":304,"context_line":"            return cctxt.call(ctxt, \u0027get_backup_device\u0027, backup\u003dbackup,"},{"line_number":305,"context_line":"                              want_objects\u003dTrue)"},{"line_number":306,"context_line":"        else:"},{"line_number":307,"context_line":"            cctxt \u003d self._get_cctxt(volume.host, \u00272.0\u0027)"},{"line_number":308,"context_line":"            return cctxt.call(ctxt, \u0027get_backup_device\u0027, backup\u003dbackup)"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def secure_file_operations_enabled(self, ctxt, volume):"},{"line_number":311,"context_line":"        cctxt \u003d self._get_cctxt(volume.host, \u00272.0\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1aa78d24_fcf5ccec","line":308,"range":{"start_line":307,"start_character":0,"end_line":308,"end_character":71},"updated":"2016-07-06 15:41:39.000000000","message":"In this case we\u0027re receiving a dict, right? You need to convert it to object here, otherwise manager can explode:\n\n AttributeError: \u0027dict\u0027 object has no attribute \u0027device_obj\u0027","commit_id":"5088f33a7621bdf4796913335a6a8a12840d9ee4"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"c1cf0ec39df81ef38483e101802950cf989f013b","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        return cctxt.call(ctxt, \u0027get_capabilities\u0027, discover\u003ddiscover)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def get_backup_device(self, ctxt, backup, volume):"},{"line_number":326,"context_line":"        if self.client.can_send_version(\u00272.3\u0027):"},{"line_number":327,"context_line":"            cctxt \u003d self._get_cctxt(volume.host, \u00272.3\u0027)"},{"line_number":328,"context_line":"            return cctxt.call(ctxt, \u0027get_backup_device\u0027, backup\u003dbackup,"},{"line_number":329,"context_line":"                              want_objects\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_82f56bee","line":326,"range":{"start_line":326,"start_character":43,"end_line":326,"end_character":44},"updated":"2016-08-04 15:06:27.000000000","message":"This should be 2.5","commit_id":"06f485e7c0cd1d33d6af3c9cf81d29ee7a30d50a"},{"author":{"_account_id":20140,"name":"Karthik Prabhu Vinod","email":"karthik.prabhu.vinod@intel.com","username":"kprabhuv"},"change_message_id":"c1cf0ec39df81ef38483e101802950cf989f013b","unresolved":false,"context_lines":[{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def get_backup_device(self, ctxt, backup, volume):"},{"line_number":326,"context_line":"        if self.client.can_send_version(\u00272.3\u0027):"},{"line_number":327,"context_line":"            cctxt \u003d self._get_cctxt(volume.host, \u00272.3\u0027)"},{"line_number":328,"context_line":"            return cctxt.call(ctxt, \u0027get_backup_device\u0027, backup\u003dbackup,"},{"line_number":329,"context_line":"                              want_objects\u003dTrue)"},{"line_number":330,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_c2dbe37a","line":327,"range":{"start_line":327,"start_character":51,"end_line":327,"end_character":52},"updated":"2016-08-04 15:06:27.000000000","message":"Ditto","commit_id":"06f485e7c0cd1d33d6af3c9cf81d29ee7a30d50a"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"507b408bfa7421b57f3592feda75edf16a3cfb99","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    def get_backup_device(self, ctxt, backup, volume):"},{"line_number":298,"context_line":"        cctxt \u003d self._get_cctxt(volume.host, (\u00273.2\u0027, \u00273.0\u0027))"},{"line_number":299,"context_line":"        backup_dict \u003d cctxt.call(ctxt, \u0027get_backup_device\u0027, backup\u003dbackup,"},{"line_number":300,"context_line":"                                 want_objects\u003dTrue)"},{"line_number":301,"context_line":"        return backup_dict"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def secure_file_operations_enabled(self, ctxt, volume):"}],"source_content_type":"text/x-python","patch_set":21,"id":"9a629dbe_c87dfbb2","line":300,"range":{"start_line":299,"start_character":0,"end_line":300,"end_character":51},"updated":"2016-11-08 13:54:30.000000000","message":"I think you should send want_objects only in case you have version set to 3.2. In current case it may happen that older c-vol will get parameter it doesn\u0027t expect. And in that case you should try to convert it from dictionary into an object.","commit_id":"8fa4095f2f3dbbe1f13897d6024f8afa745fe59d"}]}
