)]}'
{"smaug/services/protection/protection_plugins/base_protection_plugin.py":[{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"c3404afc4a744a880ef58d6ae75a65729a6c9481","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                for key, value in context.parameters.items():"},{"line_number":57,"context_line":"                    if not key.startswith(\u0027OS::\u0027):"},{"line_number":58,"context_line":"                        parameters[key] \u003d value.get(\u0027value\u0027, None)"},{"line_number":59,"context_line":"                parameters.update(context.parameters.get(resource.type, {}))"},{"line_number":60,"context_line":"                res_params \u003d resource.type + \u0027#\u0027 + str(resource.id)"},{"line_number":61,"context_line":"                parameters.update(context.parameters.get(res_params, {}))"},{"line_number":62,"context_line":"                inject \u003d parameters"}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_309d215a","line":59,"updated":"2016-05-30 06:36:45.000000000","message":"if no resource.type exists in parameters, shall we update the parameters dict to empty {}?","commit_id":"3fc403cc62261cdf5c4086c8b8ed79c13c6a9810"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"984e1576a4b3d1867ecb7bf96dcef46d179a5dad","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                    if not key.startswith(\u0027OS::\u0027):"},{"line_number":58,"context_line":"                        parameters[key] \u003d value.get(\u0027value\u0027, None)"},{"line_number":59,"context_line":"                parameters.update(context.parameters.get(resource.type, {}))"},{"line_number":60,"context_line":"                res_params \u003d resource.type + \u0027#\u0027 + str(resource.id)"},{"line_number":61,"context_line":"                parameters.update(context.parameters.get(res_params, {}))"},{"line_number":62,"context_line":"                inject \u003d parameters"},{"line_number":63,"context_line":"                requires \u003d parameters.keys()"},{"line_number":64,"context_line":"                requires.append(\u0027checkpoint\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_55decf3f","line":61,"range":{"start_line":60,"start_character":0,"end_line":61,"end_character":73},"updated":"2016-05-30 09:42:04.000000000","message":"What is this convention of concatenating the resource type and resource id? Is it used somewhere else? Why not just the resource id?","commit_id":"3fc403cc62261cdf5c4086c8b8ed79c13c6a9810"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"c3404afc4a744a880ef58d6ae75a65729a6c9481","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                        parameters[key] \u003d value.get(\u0027value\u0027, None)"},{"line_number":59,"context_line":"                parameters.update(context.parameters.get(resource.type, {}))"},{"line_number":60,"context_line":"                res_params \u003d resource.type + \u0027#\u0027 + str(resource.id)"},{"line_number":61,"context_line":"                parameters.update(context.parameters.get(res_params, {}))"},{"line_number":62,"context_line":"                inject \u003d parameters"},{"line_number":63,"context_line":"                requires \u003d parameters.keys()"},{"line_number":64,"context_line":"                requires.append(\u0027checkpoint\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_b0a9117e","line":61,"updated":"2016-05-30 06:36:45.000000000","message":"same as above.","commit_id":"3fc403cc62261cdf5c4086c8b8ed79c13c6a9810"},{"author":{"_account_id":19720,"name":"wangliuan","email":"wangliuan2016@163.com","username":"wangliuan"},"change_message_id":"d76058c621b5e4d33b04a70616190dc0e43ae430","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                    if not key.startswith(\u0027OS::\u0027):"},{"line_number":58,"context_line":"                        parameters[key] \u003d value.get(\u0027value\u0027, None)"},{"line_number":59,"context_line":"                parameters.update(context.parameters.get(resource.type, {}))"},{"line_number":60,"context_line":"                res_params \u003d resource.type + \u0027#\u0027 + str(resource.id)"},{"line_number":61,"context_line":"                parameters.update(context.parameters.get(res_params, {}))"},{"line_number":62,"context_line":"                inject \u003d parameters"},{"line_number":63,"context_line":"                requires \u003d parameters.keys()"},{"line_number":64,"context_line":"                requires.append(\u0027checkpoint\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_d87db31d","line":61,"range":{"start_line":60,"start_character":0,"end_line":61,"end_character":73},"in_reply_to":"9abb7d3a_55decf3f","updated":"2016-05-31 02:22:46.000000000","message":"the smaug API has define the structure of parameters,for example:\n1.parammeters for protect:\nparameters \u003d {\n        \"username\":{\"value\":\"test\"},\n        \"OS::CINDER::VOLUME\":{\u0027consistency\u0027:\u0027crash\u0027}\n        \"OS::CINDER::VOLUME#123456789\":{\u0027backup_name\u0027:\u0027test\u0027}\n2.parameters for restore\nparameters \u003d {\n        \u0027auth_url\u0027:\u0027127.0.0.1\u0027,\n        \u0027username\u0027:\u0027test\u0027,\n        \u0027password\u0027:\u0027test\u0027,\n        \u0027restore_name\u0027:\u0027test\u0027}\nfor more details ,we can ask chenying,I will add him to review this patch","commit_id":"3fc403cc62261cdf5c4086c8b8ed79c13c6a9810"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"c3404afc4a744a880ef58d6ae75a65729a6c9481","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                requires \u003d parameters.keys()"},{"line_number":64,"context_line":"                requires.append(\u0027checkpoint\u0027)"},{"line_number":65,"context_line":"            elif operation \u003d\u003d constants.OPERATION_RESTORE:"},{"line_number":66,"context_line":"                parameters.update(context.parameters)"},{"line_number":67,"context_line":"                parameters[\u0027checkpoint\u0027] \u003d context.checkpoint"},{"line_number":68,"context_line":"                parameters[\u0027heat_template\u0027] \u003d context.heat_template"},{"line_number":69,"context_line":"                inject \u003d parameters"}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_70c6894a","line":66,"updated":"2016-05-30 06:36:45.000000000","message":"why restore parameters get handled the different way with protection?","commit_id":"3fc403cc62261cdf5c4086c8b8ed79c13c6a9810"},{"author":{"_account_id":2023,"name":"Saggi Mizrahi","email":"ficoos+osreview@gmail.com","username":"ficoos"},"change_message_id":"1d512bb190be0f98e2e14cea1da7357d8a81711f","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            kwargs[\u0027name\u0027] \u003d resource.id"},{"line_number":54,"context_line":"            operation \u003d context.operation"},{"line_number":55,"context_line":"            if operation \u003d\u003d constants.OPERATION_PROTECT:"},{"line_number":56,"context_line":"                for key, value in context.parameters.items():"},{"line_number":57,"context_line":"                    if not key.startswith(\u0027OS::\u0027):"},{"line_number":58,"context_line":"                        parameters[key] \u003d value.get(\u0027value\u0027, None)"},{"line_number":59,"context_line":"                parameters.update(context.parameters.get(resource.type, {}))"},{"line_number":60,"context_line":"                res_params \u003d resource.type + \u0027#\u0027 + str(resource.id)"},{"line_number":61,"context_line":"                parameters.update(context.parameters.get(res_params, {}))"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_90a2f8ac","line":58,"range":{"start_line":56,"start_character":0,"end_line":58,"end_character":66},"updated":"2016-06-07 08:17:59.000000000","message":"Parameters never come without type or type#id.\nYou also can\u0027t assume that all types are in the OS namespace.","commit_id":"04d320700dada4477121c594105a217d4e225642"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"e1c984833ccf82a151024c170b29f3f7a3d11809","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            kwargs[\u0027name\u0027] \u003d resource.id"},{"line_number":54,"context_line":"            operation \u003d context.operation"},{"line_number":55,"context_line":"            if operation \u003d\u003d constants.OPERATION_PROTECT:"},{"line_number":56,"context_line":"                for key, value in context.parameters.items():"},{"line_number":57,"context_line":"                    if not key.startswith(\u0027OS::\u0027):"},{"line_number":58,"context_line":"                        parameters[key] \u003d value.get(\u0027value\u0027, None)"},{"line_number":59,"context_line":"                parameters.update(context.parameters.get(resource.type, {}))"},{"line_number":60,"context_line":"                res_params \u003d resource.type + \u0027#\u0027 + str(resource.id)"},{"line_number":61,"context_line":"                parameters.update(context.parameters.get(res_params, {}))"},{"line_number":62,"context_line":"                inject \u003d parameters"},{"line_number":63,"context_line":"                requires \u003d parameters.keys()"},{"line_number":64,"context_line":"                requires.append(\u0027checkpoint\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_7e0cb294","line":61,"range":{"start_line":56,"start_character":0,"end_line":61,"end_character":73},"updated":"2016-06-06 12:36:17.000000000","message":"Should we add a check or filter method for the parameters with   schema in specific plugin? I think all the key of parameters must accord with the schema definition.","commit_id":"04d320700dada4477121c594105a217d4e225642"},{"author":{"_account_id":19346,"name":"yinwei","email":"yinweiishere@icloud.com","username":"yinwei"},"change_message_id":"99765961a9693aecaed55f539a102e26a21e0519","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            kwargs[\u0027name\u0027] \u003d resource.id"},{"line_number":54,"context_line":"            operation \u003d context.operation"},{"line_number":55,"context_line":"            if operation \u003d\u003d constants.OPERATION_PROTECT:"},{"line_number":56,"context_line":"                for key, value in context.parameters.items():"},{"line_number":57,"context_line":"                    if not key.startswith(\u0027OS::\u0027):"},{"line_number":58,"context_line":"                        parameters[key] \u003d value.get(\u0027value\u0027, None)"},{"line_number":59,"context_line":"                parameters.update(context.parameters.get(resource.type, {}))"},{"line_number":60,"context_line":"                res_params \u003d resource.type + \u0027#\u0027 + str(resource.id)"},{"line_number":61,"context_line":"                parameters.update(context.parameters.get(res_params, {}))"},{"line_number":62,"context_line":"                inject \u003d parameters"},{"line_number":63,"context_line":"                requires \u003d parameters.keys()"},{"line_number":64,"context_line":"                requires.append(\u0027checkpoint\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_8e34a5fb","line":61,"range":{"start_line":56,"start_character":0,"end_line":61,"end_character":73},"in_reply_to":"7aa08908_7e0cb294","updated":"2016-06-07 01:06:41.000000000","message":"I think the parameter checking should be done by each function itself. You can\u0027t tell where the parameters come from and you don\u0027t know whether it\u0027s a necessary or valid value range. The function knows better about the context.","commit_id":"04d320700dada4477121c594105a217d4e225642"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"add07a85991dfcb6a6a2946889a842c4af8f48de","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            kwargs[\u0027name\u0027] \u003d resource.id"},{"line_number":54,"context_line":"            operation \u003d context.operation"},{"line_number":55,"context_line":"            if operation \u003d\u003d constants.OPERATION_PROTECT:"},{"line_number":56,"context_line":"                for key, value in context.parameters.items():"},{"line_number":57,"context_line":"                    if not key.startswith(\u0027OS::\u0027):"},{"line_number":58,"context_line":"                        parameters[key] \u003d value.get(\u0027value\u0027, None)"},{"line_number":59,"context_line":"                parameters.update(context.parameters.get(resource.type, {}))"},{"line_number":60,"context_line":"                res_params \u003d resource.type + \u0027#\u0027 + str(resource.id)"},{"line_number":61,"context_line":"                parameters.update(context.parameters.get(res_params, {}))"},{"line_number":62,"context_line":"                inject \u003d parameters"},{"line_number":63,"context_line":"                requires \u003d parameters.keys()"},{"line_number":64,"context_line":"                requires.append(\u0027checkpoint\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_49e1179a","line":61,"range":{"start_line":56,"start_character":0,"end_line":61,"end_character":73},"in_reply_to":"7aa08908_8e34a5fb","updated":"2016-06-07 01:41:07.000000000","message":"It could be done by each plugin itself.","commit_id":"04d320700dada4477121c594105a217d4e225642"}]}
