)]}'
{"karbor/tests/fullstack/test_checkpoints.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"0417cfe64cc001573df5da23e907c3c20b565d23","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        plan.create(self.provider_id_os, [volume, ])"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        checkpoint \u003d objects.Checkpoint()"},{"line_number":31,"context_line":"        checkpoint.create(self.provider_id, plan.id, timeout\u003d3000)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        search_opts \u003d {\"volume_id\": volume.id}"},{"line_number":34,"context_line":"        backups \u003d self.cinder_client.backups.list(search_opts\u003dsearch_opts)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_70685488","line":31,"range":{"start_line":31,"start_character":61,"end_line":31,"end_character":65},"updated":"2017-03-08 12:24:03.000000000","message":"why 3000? 900 isn\u0027t enough?","commit_id":"004b5fab1848a8a8962d281ded3542ee47350a99"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"d3d07c64002dbb2e90b66be6e964a230e335b075","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        plan.create(self.provider_id_os, [volume, ])"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        checkpoint \u003d objects.Checkpoint()"},{"line_number":31,"context_line":"        checkpoint.create(self.provider_id, plan.id, timeout\u003d3000)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        search_opts \u003d {\"volume_id\": volume.id}"},{"line_number":34,"context_line":"        backups \u003d self.cinder_client.backups.list(search_opts\u003dsearch_opts)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_ddc65d48","line":31,"range":{"start_line":31,"start_character":61,"end_line":31,"end_character":65},"in_reply_to":"9a30ddce_70685488","updated":"2017-03-09 02:15:06.000000000","message":"sorry, just try, When it failed the first time, I thought it was a timeout reason, but it wasn\u0027t actually.","commit_id":"004b5fab1848a8a8962d281ded3542ee47350a99"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"0417cfe64cc001573df5da23e907c3c20b565d23","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        backups \u003d self.cinder_client.backups.list(search_opts\u003dsearch_opts)"},{"line_number":35,"context_line":"        self.assertEqual(1, len(backups))"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        # checkpoint must be delete before volume.close,"},{"line_number":38,"context_line":"        # because checkpoint has the snapshot of the volume"},{"line_number":39,"context_line":"        checkpoint.close()"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def test_checkpoint_delete(self):"},{"line_number":42,"context_line":"        volume \u003d self.store(objects.Volume())"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_506d1097","line":39,"range":{"start_line":37,"start_character":0,"end_line":39,"end_character":26},"updated":"2017-03-08 12:24:03.000000000","message":"checkpoint doesn\u0027t have the volume\u0027s snapshot, it has the volume\u0027s backup","commit_id":"004b5fab1848a8a8962d281ded3542ee47350a99"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"d3d07c64002dbb2e90b66be6e964a230e335b075","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        backups \u003d self.cinder_client.backups.list(search_opts\u003dsearch_opts)"},{"line_number":35,"context_line":"        self.assertEqual(1, len(backups))"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        # checkpoint must be delete before volume.close,"},{"line_number":38,"context_line":"        # because checkpoint has the snapshot of the volume"},{"line_number":39,"context_line":"        checkpoint.close()"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def test_checkpoint_delete(self):"},{"line_number":42,"context_line":"        volume \u003d self.store(objects.Volume())"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_dd501d61","line":39,"range":{"start_line":37,"start_character":0,"end_line":39,"end_character":26},"in_reply_to":"9a30ddce_506d1097","updated":"2017-03-09 02:15:06.000000000","message":"Got it.","commit_id":"004b5fab1848a8a8962d281ded3542ee47350a99"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"0417cfe64cc001573df5da23e907c3c20b565d23","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        # because checkpoint has the snapshot of the volume"},{"line_number":94,"context_line":"        checkpoint.close()"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def test_checkpoint_for_server_attached_volume0(self):"},{"line_number":97,"context_line":"        \"\"\"Test checkpoint for server with attached volume"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        Test checkpoint for server which has attached one volume,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_f0b7e4f2","line":96,"range":{"start_line":96,"start_character":44,"end_line":96,"end_character":51},"updated":"2017-03-08 12:24:03.000000000","message":"volume0 is not a valid name for a test.\nName should describe what is being tested.","commit_id":"004b5fab1848a8a8962d281ded3542ee47350a99"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"d3d07c64002dbb2e90b66be6e964a230e335b075","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        # because checkpoint has the snapshot of the volume"},{"line_number":94,"context_line":"        checkpoint.close()"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def test_checkpoint_for_server_attached_volume0(self):"},{"line_number":97,"context_line":"        \"\"\"Test checkpoint for server with attached volume"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        Test checkpoint for server which has attached one volume,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_fd4fa1ba","line":96,"range":{"start_line":96,"start_character":44,"end_line":96,"end_character":51},"in_reply_to":"9a30ddce_f0b7e4f2","updated":"2017-03-09 02:15:06.000000000","message":"Got it.","commit_id":"004b5fab1848a8a8962d281ded3542ee47350a99"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"0417cfe64cc001573df5da23e907c3c20b565d23","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        # because checkpoint has the snapshot of the volume"},{"line_number":124,"context_line":"        checkpoint.close()"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def test_checkpoint_for_server_attached_volume1(self):"},{"line_number":127,"context_line":"        \"\"\"Test checkpoint for server with attached volume"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        Test checkpoint for server which has attached one volume,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_30ca5c6f","line":126,"range":{"start_line":126,"start_character":44,"end_line":126,"end_character":51},"updated":"2017-03-08 12:24:03.000000000","message":"ditto","commit_id":"004b5fab1848a8a8962d281ded3542ee47350a99"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"d3d07c64002dbb2e90b66be6e964a230e335b075","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        # because checkpoint has the snapshot of the volume"},{"line_number":124,"context_line":"        checkpoint.close()"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def test_checkpoint_for_server_attached_volume1(self):"},{"line_number":127,"context_line":"        \"\"\"Test checkpoint for server with attached volume"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        Test checkpoint for server which has attached one volume,"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_3dc85922","line":126,"range":{"start_line":126,"start_character":44,"end_line":126,"end_character":51},"in_reply_to":"9a30ddce_30ca5c6f","updated":"2017-03-09 02:15:06.000000000","message":"Got it.","commit_id":"004b5fab1848a8a8962d281ded3542ee47350a99"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"3765846afa24c29db5d799e704a6f99281a6c947","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                         checkpoint_item.status)"},{"line_number":82,"context_line":"        self.assertEqual(checkpoint.id, checkpoint_item.id)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    # def test_server_attached_volume_only_protect_server(self):"},{"line_number":85,"context_line":"    #     \"\"\"Test checkpoint for server with attached volume"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    #     Test checkpoint for server which has attached one volume,"},{"line_number":88,"context_line":"    #     but only add server in protect source"},{"line_number":89,"context_line":"    #     \"\"\""},{"line_number":90,"context_line":"    #     volume \u003d self.store(objects.Volume())"},{"line_number":91,"context_line":"    #     volume.create(1)"},{"line_number":92,"context_line":"    #     server \u003d self.store(objects.Server())"},{"line_number":93,"context_line":"    #     server.create()"},{"line_number":94,"context_line":"    #     server.attach_volume(volume.id)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    #     plan \u003d self.store(objects.Plan())"},{"line_number":97,"context_line":"    #     plan.create(self.provider_id, [server, ])"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    #     checkpoint \u003d self.store(objects.Checkpoint())"},{"line_number":100,"context_line":"    #     checkpoint.create(self.provider_id, plan.id, timeout\u003d1800)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    #     items \u003d self.karbor_client.checkpoints.list(self.provider_id)"},{"line_number":103,"context_line":"    #     ids \u003d [item.id for item in items]"},{"line_number":104,"context_line":"    #     self.assertTrue(checkpoint.id in ids)"},{"line_number":105,"context_line":"    #     search_opts \u003d {\"volume_id\": volume.id}"},{"line_number":106,"context_line":"    #     backups \u003d self.cinder_client.backups.list(search_opts\u003dsearch_opts)"},{"line_number":107,"context_line":"    #     self.assertEqual(1, len(backups))"},{"line_number":108,"context_line":"    #     server.detach_volume(volume.id)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    # def test_server_attached_volume_protect_both(self):"},{"line_number":111,"context_line":"    #     \"\"\"Test checkpoint for server with attached volume"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    #     Test checkpoint for server which has attached one volume,"},{"line_number":114,"context_line":"    #     and add server and volume both in protect source"},{"line_number":115,"context_line":"    #     \"\"\""},{"line_number":116,"context_line":"    #     volume \u003d self.store(objects.Volume())"},{"line_number":117,"context_line":"    #     volume.create(1)"},{"line_number":118,"context_line":"    #     server \u003d self.store(objects.Server())"},{"line_number":119,"context_line":"    #     server.create()"},{"line_number":120,"context_line":"    #     server.attach_volume(volume.id)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    #     plan \u003d self.store(objects.Plan())"},{"line_number":123,"context_line":"    #     plan.create(self.provider_id, [server, volume])"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    #     checkpoint \u003d self.store(objects.Checkpoint())"},{"line_number":126,"context_line":"    #     checkpoint.create(self.provider_id, plan.id, timeout\u003d1800)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    #     items \u003d self.karbor_client.checkpoints.list(self.provider_id)"},{"line_number":129,"context_line":"    #     ids \u003d [item.id for item in items]"},{"line_number":130,"context_line":"    #     self.assertTrue(checkpoint.id in ids)"},{"line_number":131,"context_line":"    #     search_opts \u003d {\"volume_id\": volume.id}"},{"line_number":132,"context_line":"    #     backups \u003d self.cinder_client.backups.list(search_opts\u003dsearch_opts)"},{"line_number":133,"context_line":"    #     self.assertEqual(1, len(backups))"},{"line_number":134,"context_line":"    #     server.detach_volume(volume.id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a1ced50_7fabcfd6","line":134,"range":{"start_line":84,"start_character":0,"end_line":134,"end_character":41},"updated":"2017-03-19 08:34:14.000000000","message":"What are we going to do about this?","commit_id":"8b6c80963402995aad2fff39d56190bac1139595"}],"karbor/tests/fullstack/test_protectables.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"0417cfe64cc001573df5da23e907c3c20b565d23","unresolved":false,"context_lines":[{"line_number":17,"context_line":"class ProtectablesTest(karbor_base.KarborBaseTest):"},{"line_number":18,"context_line":"    \"\"\"Test Protectables operation \"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    CUR_PROTECTABLE_TYPE \u003d [\"OS::Cinder::Volume\","},{"line_number":21,"context_line":"                            \"OS::Glance::Image\","},{"line_number":22,"context_line":"                            \"OS::Keystone::Project\","},{"line_number":23,"context_line":"                            \"OS::Nova::Server\"]"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def test_protectables_list(self):"},{"line_number":26,"context_line":"        items \u003d self.karbor_client.protectables.list()"},{"line_number":27,"context_line":"        query_types \u003d [item.protectable_type for item in items]"},{"line_number":28,"context_line":"        self.assertItemsEqual(self.CUR_PROTECTABLE_TYPE, query_types)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def test_protectables_get(self):"},{"line_number":31,"context_line":"        protectable_type \u003d \u0027OS::Keystone::Project\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_b0b9eccd","line":28,"range":{"start_line":20,"start_character":0,"end_line":28,"end_character":69},"updated":"2017-03-08 12:24:03.000000000","message":"1. CUR -\u003e CURRENT. Make it readable\n2. Why not use RESOURCE_TYPES from karbor.common.constants?","commit_id":"004b5fab1848a8a8962d281ded3542ee47350a99"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"d3d07c64002dbb2e90b66be6e964a230e335b075","unresolved":false,"context_lines":[{"line_number":17,"context_line":"class ProtectablesTest(karbor_base.KarborBaseTest):"},{"line_number":18,"context_line":"    \"\"\"Test Protectables operation \"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    CUR_PROTECTABLE_TYPE \u003d [\"OS::Cinder::Volume\","},{"line_number":21,"context_line":"                            \"OS::Glance::Image\","},{"line_number":22,"context_line":"                            \"OS::Keystone::Project\","},{"line_number":23,"context_line":"                            \"OS::Nova::Server\"]"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def test_protectables_list(self):"},{"line_number":26,"context_line":"        items \u003d self.karbor_client.protectables.list()"},{"line_number":27,"context_line":"        query_types \u003d [item.protectable_type for item in items]"},{"line_number":28,"context_line":"        self.assertItemsEqual(self.CUR_PROTECTABLE_TYPE, query_types)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def test_protectables_get(self):"},{"line_number":31,"context_line":"        protectable_type \u003d \u0027OS::Keystone::Project\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_3d05b979","line":28,"range":{"start_line":20,"start_character":0,"end_line":28,"end_character":69},"in_reply_to":"9a30ddce_b0b9eccd","updated":"2017-03-09 02:15:06.000000000","message":"Oh, Yeah, you are right.","commit_id":"004b5fab1848a8a8962d281ded3542ee47350a99"}],"karbor/tests/fullstack/test_restores.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"0417cfe64cc001573df5da23e907c3c20b565d23","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from karbor.tests.fullstack import karbor_base"},{"line_number":19,"context_line":"from karbor.tests.fullstack import karbor_objects as objects"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"ALLOWED \u003d {"},{"line_number":22,"context_line":"    \"volume_deletable_status\": [\"available\", \"error\"],"},{"line_number":23,"context_line":"    \"server_deletable_status\": [\"available\", \"running\"]"},{"line_number":24,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_50c5103a","line":21,"range":{"start_line":21,"start_character":0,"end_line":21,"end_character":7},"updated":"2017-03-08 12:24:03.000000000","message":"Not a descriptive name","commit_id":"004b5fab1848a8a8962d281ded3542ee47350a99"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"d3d07c64002dbb2e90b66be6e964a230e335b075","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from karbor.tests.fullstack import karbor_base"},{"line_number":19,"context_line":"from karbor.tests.fullstack import karbor_objects as objects"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"ALLOWED \u003d {"},{"line_number":22,"context_line":"    \"volume_deletable_status\": [\"available\", \"error\"],"},{"line_number":23,"context_line":"    \"server_deletable_status\": [\"available\", \"running\"]"},{"line_number":24,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_dd22dd00","line":21,"range":{"start_line":21,"start_character":0,"end_line":21,"end_character":7},"in_reply_to":"9a30ddce_50c5103a","updated":"2017-03-09 02:15:06.000000000","message":"OK, Got it.","commit_id":"004b5fab1848a8a8962d281ded3542ee47350a99"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"0417cfe64cc001573df5da23e907c3c20b565d23","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        \"password\": \"password\","},{"line_number":34,"context_line":"    }"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def _store(self, resources_status):"},{"line_number":37,"context_line":"        if not isinstance(resources_status, dict):"},{"line_number":38,"context_line":"            return"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        for resource, status in resources_status.items():"},{"line_number":41,"context_line":"            resource_type, resource_id \u003d resource.split(\"#\")"},{"line_number":42,"context_line":"            if resource_type is None:"},{"line_number":43,"context_line":"                continue"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"            types \u003d resource_type.split(\"::\")"},{"line_number":46,"context_line":"            if len(types) \u003c 3:"},{"line_number":47,"context_line":"                continue"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"            try:"},{"line_number":50,"context_line":"                obj_class \u003d importutils.import_class("},{"line_number":51,"context_line":"                    \"karbor.tests.fullstack.karbor_objects.%s\" % types[2])"},{"line_number":52,"context_line":"            except Exception:"},{"line_number":53,"context_line":"                continue"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"            deletable_str \u003d \"%s_deletable_status\" % types[2].lower()"},{"line_number":56,"context_line":"            deletable_list \u003d eval(deletable_str, ALLOWED)"},{"line_number":57,"context_line":"            if callable(obj_class) and status in deletable_list:"},{"line_number":58,"context_line":"                obj \u003d obj_class()"},{"line_number":59,"context_line":"                obj.id \u003d resource_id"},{"line_number":60,"context_line":"                self.store(obj)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @staticmethod"},{"line_number":63,"context_line":"    def get_restore_target(endpoint):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_d05ae082","line":60,"range":{"start_line":36,"start_character":0,"end_line":60,"end_character":31},"updated":"2017-03-08 12:24:03.000000000","message":"1. Why \u0027store\u0027 them and not just delete?\n2. How about move all of this to Restore.close() in karbor_objects.py?","commit_id":"004b5fab1848a8a8962d281ded3542ee47350a99"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"d3d07c64002dbb2e90b66be6e964a230e335b075","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        \"password\": \"password\","},{"line_number":34,"context_line":"    }"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def _store(self, resources_status):"},{"line_number":37,"context_line":"        if not isinstance(resources_status, dict):"},{"line_number":38,"context_line":"            return"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        for resource, status in resources_status.items():"},{"line_number":41,"context_line":"            resource_type, resource_id \u003d resource.split(\"#\")"},{"line_number":42,"context_line":"            if resource_type is None:"},{"line_number":43,"context_line":"                continue"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"            types \u003d resource_type.split(\"::\")"},{"line_number":46,"context_line":"            if len(types) \u003c 3:"},{"line_number":47,"context_line":"                continue"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"            try:"},{"line_number":50,"context_line":"                obj_class \u003d importutils.import_class("},{"line_number":51,"context_line":"                    \"karbor.tests.fullstack.karbor_objects.%s\" % types[2])"},{"line_number":52,"context_line":"            except Exception:"},{"line_number":53,"context_line":"                continue"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"            deletable_str \u003d \"%s_deletable_status\" % types[2].lower()"},{"line_number":56,"context_line":"            deletable_list \u003d eval(deletable_str, ALLOWED)"},{"line_number":57,"context_line":"            if callable(obj_class) and status in deletable_list:"},{"line_number":58,"context_line":"                obj \u003d obj_class()"},{"line_number":59,"context_line":"                obj.id \u003d resource_id"},{"line_number":60,"context_line":"                self.store(obj)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @staticmethod"},{"line_number":63,"context_line":"    def get_restore_target(endpoint):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a30ddce_7d5bb187","line":60,"range":{"start_line":36,"start_character":0,"end_line":60,"end_character":31},"in_reply_to":"9a30ddce_d05ae082","updated":"2017-03-09 02:15:06.000000000","message":"1. store them, they will be delete by \"self.tearDown\" automatically.\n2. the line 60 \"self.store(obj)\" is just doing this.","commit_id":"004b5fab1848a8a8962d281ded3542ee47350a99"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"3765846afa24c29db5d799e704a6f99281a6c947","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        \"password\": \"password\","},{"line_number":34,"context_line":"    }"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def _store(self, resources_status):"},{"line_number":37,"context_line":"        if not isinstance(resources_status, dict):"},{"line_number":38,"context_line":"            return"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        for resource, status in resources_status.items():"},{"line_number":41,"context_line":"            resource_type, resource_id \u003d resource.split(\"#\")"},{"line_number":42,"context_line":"            if resource_type is None:"},{"line_number":43,"context_line":"                continue"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"            types \u003d resource_type.split(\"::\")"},{"line_number":46,"context_line":"            if len(types) \u003c 3:"},{"line_number":47,"context_line":"                continue"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"            try:"},{"line_number":50,"context_line":"                obj_class \u003d importutils.import_class("},{"line_number":51,"context_line":"                    \"karbor.tests.fullstack.karbor_objects.%s\" % types[2])"},{"line_number":52,"context_line":"            except Exception:"},{"line_number":53,"context_line":"                continue"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"            deletable_str \u003d \"%s_deletable_status\" % types[2].lower()"},{"line_number":56,"context_line":"            deletable_list \u003d eval(deletable_str, DELETABLE_STATUS)"},{"line_number":57,"context_line":"            if callable(obj_class) and status in deletable_list:"},{"line_number":58,"context_line":"                obj \u003d obj_class()"},{"line_number":59,"context_line":"                obj.id \u003d resource_id"},{"line_number":60,"context_line":"                self.store(obj)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @staticmethod"},{"line_number":63,"context_line":"    def get_restore_target(endpoint):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a1ced50_df820352","line":60,"range":{"start_line":36,"start_character":0,"end_line":60,"end_character":31},"updated":"2017-03-19 08:34:14.000000000","message":"I understand your rationale here, but it is much better to just delete the resources in the end each test, or move this logic to the \u0027close()\u0027 method of the restore object in karbor_objects.py","commit_id":"8b6c80963402995aad2fff39d56190bac1139595"}]}
