)]}'
{"smaug/services/protection/protection_plugins/server/nova_backup_plugin.py":[{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"79a187dd32fbb6acc2fe61ddceb5048fb7da12b6","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                                                          \"security_groups\"),"},{"line_number":88,"context_line":"                               \"access_ip_v4\": getattr(server, \"access_ip_v4\"),"},{"line_number":89,"context_line":"                               \"access_ip_v6\": getattr(server, \"access_ip_v6\"),"},{"line_number":90,"context_line":"                               }"},{"line_number":91,"context_line":"            resource_definition[\"server_metadata\"] \u003d server_metadata"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"            snapshot_id \u003d self._nova_client.servers.create_image(server_id,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa0719c6_4c61e638","line":90,"updated":"2016-03-23 02:26:22.000000000","message":"shall we keep the fixed ip/subnet and the floating ip as well?","commit_id":"0d46f1f92f77f78b7268b25eb385f8587a2f061e"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"79a187dd32fbb6acc2fe61ddceb5048fb7da12b6","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        try:"},{"line_number":131,"context_line":"            image_info \u003d self._glance_client.images.get(snapshot_id)"},{"line_number":132,"context_line":"            while image_info[\u0027status\u0027] !\u003d \"active\":"},{"line_number":133,"context_line":"                sleep(30)"},{"line_number":134,"context_line":"                image_info \u003d self._glance_client.images.get(snapshot_id)"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa0719c6_822105a2","line":132,"updated":"2016-03-23 02:26:22.000000000","message":"image may turns to error and thus loop forever?\nShould give a timeout config instead of wait forever.","commit_id":"0d46f1f92f77f78b7268b25eb385f8587a2f061e"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"79a187dd32fbb6acc2fe61ddceb5048fb7da12b6","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            image_data \u003d self._glance_client.images.data(snapshot_id)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"            # TODO(luobin): support retry if failed"},{"line_number":139,"context_line":"            self._bank_plugin.create_object(key\u003dbackup_id,"},{"line_number":140,"context_line":"                                            value\u003dimage_data)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"            # update resource_definition backup_status"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa0719c6_a236c9e4","line":139,"updated":"2016-03-23 02:26:22.000000000","message":"Just a question: it will use multipart upload without setting more params?","commit_id":"0d46f1f92f77f78b7268b25eb385f8587a2f061e"}],"smaug/services/protection/protection_plugins/server/nova_protection_plugin.py":[{"author":{"_account_id":16206,"name":"chenhuayi","email":"chenhuayi@huawei.com","username":"chenhuayi2"},"change_message_id":"e312a7e5b6ae357b8a60a1420c3ea861dc00d07f","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    import BaseProtectionPlugin"},{"line_number":21,"context_line":"from smaug.services.protection.protection_plugins.server \\"},{"line_number":22,"context_line":"    import server_plugin_schemas"},{"line_number":23,"context_line":"from time import sleep"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"protection_opts \u003d ["},{"line_number":26,"context_line":"    cfg.IntOpt(\u0027protection_timeout\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba0121b8_fe707cde","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":22},"updated":"2016-03-30 08:41:29.000000000","message":"import from sys, put the first.","commit_id":"0812239287afe1960734175dc4d0f9a47eb16066"},{"author":{"_account_id":16206,"name":"chenhuayi","email":"chenhuayi@huawei.com","username":"chenhuayi2"},"change_message_id":"e312a7e5b6ae357b8a60a1420c3ea861dc00d07f","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            for child_node in child_nodes:"},{"line_number":90,"context_line":"                child_resource \u003d child_node.value"},{"line_number":91,"context_line":"                if child_resource.type \u003d\u003d constants.VOLUME_RESOURCE_TYPE:"},{"line_number":92,"context_line":"                    volume \u003d self._client.volumes.get(child_resource.id)"},{"line_number":93,"context_line":"                    attachments \u003d getattr(volume, \"attachments\")"},{"line_number":94,"context_line":"                    for attachment in attachments:"},{"line_number":95,"context_line":"                        if attachment[\"server_id\"] \u003d\u003d server_id:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba0121b8_3cd83d1d","line":92,"range":{"start_line":92,"start_character":29,"end_line":92,"end_character":41},"updated":"2016-03-30 08:41:29.000000000","message":"where is the \"\"self._client\" from?","commit_id":"0812239287afe1960734175dc4d0f9a47eb16066"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"bd6e0a1191cd8dd5a420ff6964ac9a4ce74893f1","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        # TODO(luobin)"},{"line_number":62,"context_line":"        pass"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def get_resource_stats(self, checkpoint, resource_id):"},{"line_number":65,"context_line":"        # Get the status of this resource"},{"line_number":66,"context_line":"        bank_section \u003d checkpoint.get_resource_bank_section(resource_id)"},{"line_number":67,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a1b2928_82b6973b","line":64,"updated":"2016-04-11 09:02:24.000000000","message":"make it in base plugin class","commit_id":"26d6cf2af36be397d42897f789bb55e84dbe1c41"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"bd6e0a1191cd8dd5a420ff6964ac9a4ce74893f1","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            status \u003d bank_section.get_object(\"status\")"},{"line_number":69,"context_line":"            return status"},{"line_number":70,"context_line":"        except Exception:"},{"line_number":71,"context_line":"            return \"undefined\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _glance_client(self, cntxt):"},{"line_number":74,"context_line":"        return ClientFactory.create_client(\"glance\", cntxt)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a1b2928_227ce371","line":71,"updated":"2016-04-11 09:02:24.000000000","message":"make it as constant.","commit_id":"26d6cf2af36be397d42897f789bb55e84dbe1c41"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"bd6e0a1191cd8dd5a420ff6964ac9a4ce74893f1","unresolved":false,"context_lines":[{"line_number":169,"context_line":"                if data \u003d\u003d \u0027\u0027:"},{"line_number":170,"context_line":"                    break"},{"line_number":171,"context_line":"                bank_section.create_object(\"data_\" + str(chunks), data)"},{"line_number":172,"context_line":"                chunks +\u003d 1"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            # update resource_definition backup_status"},{"line_number":175,"context_line":"            bank_section.update_object(\"status\","}],"source_content_type":"text/x-python","patch_set":6,"id":"7a1b2928_42e47f0c","line":172,"updated":"2016-04-11 09:02:24.000000000","message":"if we don\u0027t upload manifest to indicate it\u0027s a whole object, I have concern how to tell heat template to create one image with several chunks.  It won\u0027t be a standard heat template any more.","commit_id":"26d6cf2af36be397d42897f789bb55e84dbe1c41"},{"author":{"_account_id":16206,"name":"chenhuayi","email":"chenhuayi@huawei.com","username":"chenhuayi2"},"change_message_id":"2a5a3c1f2f8b68d29454cc0b673a037153964771","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            key_name \u003d getattr(server, \"key_name\")"},{"line_number":111,"context_line":"            security_groups \u003d getattr(server, \"security_groups\")"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"            server_metadata \u003d {\"availability_zone\": availability_zone,"},{"line_number":114,"context_line":"                               \"addresses\": addresses,"},{"line_number":115,"context_line":"                               \"flavor\": flavor,"},{"line_number":116,"context_line":"                               \"key_name\": key_name,"}],"source_content_type":"text/x-python","patch_set":11,"id":"bab6814e_d530f109","line":113,"updated":"2016-05-25 09:56:17.000000000","message":"Is \"networks\" info need to be saved?","commit_id":"0a5a2009307b42220c4552cb184ce6af57649c87"},{"author":{"_account_id":19345,"name":"smile-luobin","email":"luobin_smile@163.com","username":"smile-luobin"},"change_message_id":"c37322e97458a302a9c7ae400a16d3235ba191c4","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            key_name \u003d getattr(server, \"key_name\")"},{"line_number":111,"context_line":"            security_groups \u003d getattr(server, \"security_groups\")"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"            server_metadata \u003d {\"availability_zone\": availability_zone,"},{"line_number":114,"context_line":"                               \"addresses\": addresses,"},{"line_number":115,"context_line":"                               \"flavor\": flavor,"},{"line_number":116,"context_line":"                               \"key_name\": key_name,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9abb7d3a_98d43948","line":113,"in_reply_to":"bab6814e_d530f109","updated":"2016-05-27 06:59:25.000000000","message":"The \"networks\" info is saved in \"addresses\".","commit_id":"0a5a2009307b42220c4552cb184ce6af57649c87"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"55e75a942282f04921fbe4d89a835fb4f2f8e945","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            bank_section.create_object(\"status\","},{"line_number":91,"context_line":"                                       constants.RESOURCE_STATUS_PROTECTING)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"            for child_node in child_nodes:"},{"line_number":94,"context_line":"                child_resource \u003d child_node.value"},{"line_number":95,"context_line":"                if child_resource.type \u003d\u003d constants.VOLUME_RESOURCE_TYPE:"},{"line_number":96,"context_line":"                    volume \u003d cinder_client.volumes.get(child_resource.id)"},{"line_number":97,"context_line":"                    attachments \u003d getattr(volume, \"attachments\")"},{"line_number":98,"context_line":"                    for attachment in attachments:"},{"line_number":99,"context_line":"                        if attachment[\"server_id\"] \u003d\u003d server_id:"},{"line_number":100,"context_line":"                            attach_metadata[child_resource.id] \u003d attachment["},{"line_number":101,"context_line":"                                \"device\"]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            resource_definition[\"attach_metadata\"] \u003d attach_metadata"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9abb7d3a_25b153e2","line":101,"range":{"start_line":93,"start_character":0,"end_line":101,"end_character":41},"updated":"2016-05-30 13:01:09.000000000","message":"According to the API you can get this information from the nova client.","commit_id":"f0c9671fd7d467ee4eba0012c0681ff0a10d1842"},{"author":{"_account_id":19345,"name":"smile-luobin","email":"luobin_smile@163.com","username":"smile-luobin"},"change_message_id":"cb4178d2bfed007b836926e034aadcbb5b70a679","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            bank_section.create_object(\"status\","},{"line_number":91,"context_line":"                                       constants.RESOURCE_STATUS_PROTECTING)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"            for child_node in child_nodes:"},{"line_number":94,"context_line":"                child_resource \u003d child_node.value"},{"line_number":95,"context_line":"                if child_resource.type \u003d\u003d constants.VOLUME_RESOURCE_TYPE:"},{"line_number":96,"context_line":"                    volume \u003d cinder_client.volumes.get(child_resource.id)"},{"line_number":97,"context_line":"                    attachments \u003d getattr(volume, \"attachments\")"},{"line_number":98,"context_line":"                    for attachment in attachments:"},{"line_number":99,"context_line":"                        if attachment[\"server_id\"] \u003d\u003d server_id:"},{"line_number":100,"context_line":"                            attach_metadata[child_resource.id] \u003d attachment["},{"line_number":101,"context_line":"                                \"device\"]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            resource_definition[\"attach_metadata\"] \u003d attach_metadata"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9abb7d3a_011fc35f","line":101,"range":{"start_line":93,"start_character":0,"end_line":101,"end_character":41},"in_reply_to":"9abb7d3a_25b153e2","updated":"2016-05-31 07:03:06.000000000","message":"Of course, we can use nova client to get this information. But \"nova volume-list\" will be removed after Nova 13.0.0 released. So I think it better to use cinder client to get this information.","commit_id":"f0c9671fd7d467ee4eba0012c0681ff0a10d1842"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"08b89d16fde1931939175b917e5394d8033e9217","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def _add_to_threadpool(self, func, *args, **kwargs):"},{"line_number":49,"context_line":"        self._tp.spawn_n(func, *args, **kwargs)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_options_schema(self):"},{"line_number":52,"context_line":"        return server_plugin_schemas.OPTIONS_SCHEMA"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def get_restore_schema(self):"},{"line_number":55,"context_line":"        return server_plugin_schemas.RESTORE_SCHEMA"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def get_saved_info_schema(self):"},{"line_number":58,"context_line":"        return server_plugin_schemas.SAVED_INFO_SCHEMA"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def get_saved_info(self, metadata_store, resource):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3aaa91ec_f5731c4c","line":57,"range":{"start_line":51,"start_character":7,"end_line":57,"end_character":36},"updated":"2016-06-30 08:37:28.000000000","message":"Need add a parameter \u0027resources_type\u0027 for these three method.","commit_id":"5c6fe227790f9048d7575418c4be0794a33a9f89"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"71d6c84cc2f1f3ccb2dc083e6fd86ec8fe2ee59a","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def _add_to_threadpool(self, func, *args, **kwargs):"},{"line_number":49,"context_line":"        self._tp.spawn_n(func, *args, **kwargs)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def get_options_schema(self):"},{"line_number":52,"context_line":"        return server_plugin_schemas.OPTIONS_SCHEMA"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def get_restore_schema(self):"},{"line_number":55,"context_line":"        return server_plugin_schemas.RESTORE_SCHEMA"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def get_saved_info_schema(self):"},{"line_number":58,"context_line":"        return server_plugin_schemas.SAVED_INFO_SCHEMA"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def get_saved_info(self, metadata_store, resource):"}],"source_content_type":"text/x-python","patch_set":15,"id":"1aa78d24_e9aac218","line":57,"range":{"start_line":51,"start_character":7,"end_line":57,"end_character":36},"in_reply_to":"3aaa91ec_f5731c4c","updated":"2016-07-04 01:40:17.000000000","message":"Why resources_type is necessary here? Do you mean that the task flow enhancement patch has merged already? If this is the case, the whole nova patch won\u0027t work, right?","commit_id":"5c6fe227790f9048d7575418c4be0794a33a9f89"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"580d592b752dabb2c66f9c17df57e0e5b35ea050","unresolved":false,"context_lines":[{"line_number":125,"context_line":"                        floating_ips.append(addr)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"            flavor \u003d getattr(server, \"flavor\")[\"id\"]"},{"line_number":128,"context_line":"            key_name \u003d getattr(server, \"key_name\")"},{"line_number":129,"context_line":"            security_groups \u003d getattr(server, \"security_groups\")"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"            server_metadata \u003d {\"availability_zone\": availability_zone,"},{"line_number":132,"context_line":"                               \"networks\": networks,"}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa78d24_f47ed768","line":129,"range":{"start_line":128,"start_character":0,"end_line":129,"end_character":64},"updated":"2016-07-11 01:57:53.000000000","message":"When I test server protection flow, I find that the server maybe don\u0027t have the attribute \"security_groups\". So I think that we need to consider this situation. \n\nkey_name \u003d getattr(server, \"key_name\", None)\nsecurity_groups \u003d getattr(server, \"security_groups\", None)","commit_id":"514029fdcc9bf21d5652aa738091d136effb85cd"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"4ec34ada39c377db247d52112c4b0bcc9f64fc38","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                               }"},{"line_number":138,"context_line":"            resource_definition[\"server_metadata\"] \u003d server_metadata"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"            snapshot_id \u003d nova_client.servers.create_image("},{"line_number":141,"context_line":"                server_id, \"snapshot_%s\" % server_id)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"            resource_definition[\"snapshot_id\"] \u003d snapshot_id"},{"line_number":144,"context_line":"            image \u003d glance_client.images.get(snapshot_id)"},{"line_number":145,"context_line":"            snapshot_metadata \u003d {"},{"line_number":146,"context_line":"                \"disk_format\": image.disk_format,"},{"line_number":147,"context_line":"                \"container_format\": image.container_format,"},{"line_number":148,"context_line":"                \"name\": \"snapshot_%s@%s\" % (checkpoint.id, server_id)"},{"line_number":149,"context_line":"            }"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"            if getattr(image, \"kernel_id\", None) is not None:"},{"line_number":152,"context_line":"                kernel \u003d glance_client.images.get(image.kernel_id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"1aa78d24_4f8b9668","line":149,"range":{"start_line":140,"start_character":0,"end_line":149,"end_character":13},"updated":"2016-07-12 06:28:17.000000000","message":"As discussing with luobin, the image may have not been created  successfully before getting its attribute value.","commit_id":"b3c96a106f7dedb49486cfd52cdee13965882a52"}],"smaug/services/protection/protection_plugins/server/server_plugin_schemas.py":[{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"4bec862a330394e6629170f9221f26cafc38bb77","unresolved":false,"context_lines":[{"line_number":14,"context_line":"    \"title\": \"Server Protection Options\","},{"line_number":15,"context_line":"    \"type\": \"object\","},{"line_number":16,"context_line":"    \"properties\": {"},{"line_number":17,"context_line":"        \"backup_name\": {"},{"line_number":18,"context_line":"            \"type\": \"string\","},{"line_number":19,"context_line":"            \"title\": \"Backup Name\","},{"line_number":20,"context_line":"            \"description\": \"The name of the backup.\","},{"line_number":21,"context_line":"            \"default\": None"},{"line_number":22,"context_line":"        }"},{"line_number":23,"context_line":"    },"},{"line_number":24,"context_line":"    \"required\": []"},{"line_number":25,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":14,"id":"9abb7d3a_ee7c4d74","line":22,"range":{"start_line":17,"start_character":8,"end_line":22,"end_character":9},"updated":"2016-05-30 12:07:37.000000000","message":"What is that for?","commit_id":"f0c9671fd7d467ee4eba0012c0681ff0a10d1842"}]}
