)]}'
{"manila/db/api.py":[{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"46da5a525358466c1c2b92705e0a26d0d0028e05","unresolved":false,"context_lines":[{"line_number":759,"context_line":""},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"def driver_private_data_get(context, host, entity_id, key\u003dNone, default\u003dNone):"},{"line_number":762,"context_line":"    \"\"\"Get one or all key-value pairs for given host and entity_id.\"\"\""},{"line_number":763,"context_line":"    return IMPL.driver_private_data_get(context, host, entity_id, key, default)"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_f7e1bdff","line":762,"updated":"2015-04-30 06:59:47.000000000","message":"Why only one or all? What about all or a list of keys?","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"f29b18014d95ab023a222267e11d0e89d9d3e129","unresolved":false,"context_lines":[{"line_number":759,"context_line":""},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"def driver_private_data_get(context, host, entity_id, key\u003dNone, default\u003dNone):"},{"line_number":762,"context_line":"    \"\"\"Get one or all key-value pairs for given host and entity_id.\"\"\""},{"line_number":763,"context_line":"    return IMPL.driver_private_data_get(context, host, entity_id, key, default)"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_5bfe5b6c","line":762,"in_reply_to":"3acd31a7_1b7d831c","updated":"2015-04-30 08:26:43.000000000","message":"How are you going to filter keys then? By prefix? Except prefix?","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"c6f2c15bdee52ca94e193091dab4a2017c8245be","unresolved":false,"context_lines":[{"line_number":759,"context_line":""},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"def driver_private_data_get(context, host, entity_id, key\u003dNone, default\u003dNone):"},{"line_number":762,"context_line":"    \"\"\"Get one or all key-value pairs for given host and entity_id.\"\"\""},{"line_number":763,"context_line":"    return IMPL.driver_private_data_get(context, host, entity_id, key, default)"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_1b7d831c","line":762,"in_reply_to":"3acd31a7_3b5cbf24","updated":"2015-04-30 08:23:53.000000000","message":"Yes. Sure. What I\u0027m asking for is the possibility to get i.e. 2 keys with one query. That\u0027s with this api not possible.","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"8b797d3b29ae44fdbdc44c1d6c2eb4531ac6bcf4","unresolved":false,"context_lines":[{"line_number":759,"context_line":""},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"def driver_private_data_get(context, host, entity_id, key\u003dNone, default\u003dNone):"},{"line_number":762,"context_line":"    \"\"\"Get one or all key-value pairs for given host and entity_id.\"\"\""},{"line_number":763,"context_line":"    return IMPL.driver_private_data_get(context, host, entity_id, key, default)"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_07ad24e9","line":762,"in_reply_to":"3acd31a7_5bfe5b6c","updated":"2015-04-30 10:00:17.000000000","message":"@Valeriy: hm. I\u0027m not sure if I understand your question correct. The keys still should exactly match. But instead of just searching for one key, you can search for multiple keys. In the DB this would be a IN statement. See http://docs.sqlalchemy.org/en/rel_1_0/core/sqlelement.html#sqlalchemy.sql.operators.ColumnOperators.in_ . Does that answer your question?","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"1956815185af5472d7ad6552fabace091a3f93e5","unresolved":false,"context_lines":[{"line_number":759,"context_line":""},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"def driver_private_data_get(context, host, entity_id, key\u003dNone, default\u003dNone):"},{"line_number":762,"context_line":"    \"\"\"Get one or all key-value pairs for given host and entity_id.\"\"\""},{"line_number":763,"context_line":"    return IMPL.driver_private_data_get(context, host, entity_id, key, default)"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_a7dd5016","line":762,"in_reply_to":"3acd31a7_61d168cd","updated":"2015-04-30 10:07:51.000000000","message":"After update of code param \"key\" can be \"list\", so, need to say it in docstring explicitly to avoid confusions.","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"472907879859362717166fd712295728410b8264","unresolved":false,"context_lines":[{"line_number":759,"context_line":""},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"def driver_private_data_get(context, host, entity_id, key\u003dNone, default\u003dNone):"},{"line_number":762,"context_line":"    \"\"\"Get one or all key-value pairs for given host and entity_id.\"\"\""},{"line_number":763,"context_line":"    return IMPL.driver_private_data_get(context, host, entity_id, key, default)"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_61d168cd","line":762,"in_reply_to":"3acd31a7_f7e1bdff","updated":"2015-04-30 09:30:15.000000000","message":"Done","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"05475e7b0062ded15f6d38f51c2b795d80ee0a02","unresolved":false,"context_lines":[{"line_number":759,"context_line":""},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"def driver_private_data_get(context, host, entity_id, key\u003dNone, default\u003dNone):"},{"line_number":762,"context_line":"    \"\"\"Get one or all key-value pairs for given host and entity_id.\"\"\""},{"line_number":763,"context_line":"    return IMPL.driver_private_data_get(context, host, entity_id, key, default)"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_3b5cbf24","line":762,"in_reply_to":"3acd31a7_f7e1bdff","updated":"2015-04-30 08:12:19.000000000","message":"It returns all when key is set to None.","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"46da5a525358466c1c2b92705e0a26d0d0028e05","unresolved":false,"context_lines":[{"line_number":770,"context_line":"                                           delete_existing)"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":""},{"line_number":773,"context_line":"def driver_private_data_delete(context, host, entity_id, key\u003dNone):"},{"line_number":774,"context_line":"    \"\"\"Remove one or all key-value pairs for given host and entity_id.\"\"\""},{"line_number":775,"context_line":"    return IMPL.driver_private_data_delete(context, host, entity_id, key)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_97f169d0","line":773,"updated":"2015-04-30 06:59:47.000000000","message":"Same here. Could be a list of keys","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"05475e7b0062ded15f6d38f51c2b795d80ee0a02","unresolved":false,"context_lines":[{"line_number":770,"context_line":"                                           delete_existing)"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":""},{"line_number":773,"context_line":"def driver_private_data_delete(context, host, entity_id, key\u003dNone):"},{"line_number":774,"context_line":"    \"\"\"Remove one or all key-value pairs for given host and entity_id.\"\"\""},{"line_number":775,"context_line":"    return IMPL.driver_private_data_delete(context, host, entity_id, key)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_3b0eff34","line":773,"in_reply_to":"3acd31a7_97f169d0","updated":"2015-04-30 08:12:19.000000000","message":"Actually, we can delete all using above function \"driver_private_data_update\". But I agree, that it would be better to be able explicitly just delete all, not providing empty list with key \"delete existing \u003d True\".","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"472907879859362717166fd712295728410b8264","unresolved":false,"context_lines":[{"line_number":770,"context_line":"                                           delete_existing)"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":""},{"line_number":773,"context_line":"def driver_private_data_delete(context, host, entity_id, key\u003dNone):"},{"line_number":774,"context_line":"    \"\"\"Remove one or all key-value pairs for given host and entity_id.\"\"\""},{"line_number":775,"context_line":"    return IMPL.driver_private_data_delete(context, host, entity_id, key)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_41d66cc6","line":773,"in_reply_to":"3acd31a7_97f169d0","updated":"2015-04-30 09:30:15.000000000","message":"Done","commit_id":"ebbe50505e46a100abb32adea170d98829729127"}],"manila/db/migrations/alembic/versions/3a482171410f_add_drivers_private_data_table.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"32640073212dea565b52ae17462b387a1c31e105","unresolved":false,"context_lines":[{"line_number":37,"context_line":"def upgrade():"},{"line_number":38,"context_line":"    try:"},{"line_number":39,"context_line":"        op.create_table("},{"line_number":40,"context_line":"            \u0027drivers_private_data\u0027,"},{"line_number":41,"context_line":"            sql.Column(\u0027created_at\u0027, sql.DateTime),"},{"line_number":42,"context_line":"            sql.Column(\u0027updated_at\u0027, sql.DateTime),"},{"line_number":43,"context_line":"            sql.Column(\u0027deleted_at\u0027, sql.DateTime),"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_a4f02bfe","line":40,"updated":"2015-04-25 16:23:55.000000000","message":"This var used three times, can you please define it only once and then reuse it?","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"b7e842c7ee0c81d4564ac6c7be9e5dc3e8bfd669","unresolved":false,"context_lines":[{"line_number":37,"context_line":"def upgrade():"},{"line_number":38,"context_line":"    try:"},{"line_number":39,"context_line":"        op.create_table("},{"line_number":40,"context_line":"            \u0027drivers_private_data\u0027,"},{"line_number":41,"context_line":"            sql.Column(\u0027created_at\u0027, sql.DateTime),"},{"line_number":42,"context_line":"            sql.Column(\u0027updated_at\u0027, sql.DateTime),"},{"line_number":43,"context_line":"            sql.Column(\u0027deleted_at\u0027, sql.DateTime),"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_875d1749","line":40,"in_reply_to":"bab921fb_a4f02bfe","updated":"2015-04-27 08:33:41.000000000","message":"Done","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"}],"manila/db/sqlalchemy/api.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"32640073212dea565b52ae17462b387a1c31e105","unresolved":false,"context_lines":[{"line_number":2104,"context_line":""},{"line_number":2105,"context_line":"@require_context"},{"line_number":2106,"context_line":"def driver_private_data_get(context, host, entity_id, key\u003dNone,"},{"line_number":2107,"context_line":"                            default\u003dNone, session\u003dNone):"},{"line_number":2108,"context_line":"    if not session:"},{"line_number":2109,"context_line":"        session \u003d get_session()"},{"line_number":2110,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_8443e712","line":2107,"updated":"2015-04-25 16:23:55.000000000","message":"It does not accept param \"read_deleted\". So, you always read only not deleted. If so, why do you need it in \"_driver_private_data_query\"?","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"b7e842c7ee0c81d4564ac6c7be9e5dc3e8bfd669","unresolved":false,"context_lines":[{"line_number":2104,"context_line":""},{"line_number":2105,"context_line":"@require_context"},{"line_number":2106,"context_line":"def driver_private_data_get(context, host, entity_id, key\u003dNone,"},{"line_number":2107,"context_line":"                            default\u003dNone, session\u003dNone):"},{"line_number":2108,"context_line":"    if not session:"},{"line_number":2109,"context_line":"        session \u003d get_session()"},{"line_number":2110,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_672d63a7","line":2107,"in_reply_to":"bab921fb_8443e712","updated":"2015-04-27 08:33:41.000000000","message":"I do so because I use the composite primary key in drivers_private_data and update existing data in the driver_private_data_update() method instead of deleting and re-creating.","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"32640073212dea565b52ae17462b387a1c31e105","unresolved":false,"context_lines":[{"line_number":2132,"context_line":"        original_data \u003d _driver_private_data_query("},{"line_number":2133,"context_line":"            session, context, host, entity_id, read_deleted\u003dNone).all()"},{"line_number":2134,"context_line":""},{"line_number":2135,"context_line":"        print(\"original data: \", original_data)"},{"line_number":2136,"context_line":""},{"line_number":2137,"context_line":"        for data_ref in original_data:"},{"line_number":2138,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_44c38f89","line":2135,"updated":"2015-04-25 16:23:55.000000000","message":"debug leftover?","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"b7e842c7ee0c81d4564ac6c7be9e5dc3e8bfd669","unresolved":false,"context_lines":[{"line_number":2132,"context_line":"        original_data \u003d _driver_private_data_query("},{"line_number":2133,"context_line":"            session, context, host, entity_id, read_deleted\u003dNone).all()"},{"line_number":2134,"context_line":""},{"line_number":2135,"context_line":"        print(\"original data: \", original_data)"},{"line_number":2136,"context_line":""},{"line_number":2137,"context_line":"        for data_ref in original_data:"},{"line_number":2138,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_472a5f91","line":2135,"in_reply_to":"bab921fb_44c38f89","updated":"2015-04-27 08:33:41.000000000","message":"Done","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"c1b886bfef6f2338f93e5fa240ce03089e24f624","unresolved":false,"context_lines":[{"line_number":2160,"context_line":""},{"line_number":2161,"context_line":""},{"line_number":2162,"context_line":"@require_context"},{"line_number":2163,"context_line":"def driver_private_data_delete(context, host, entity_id, key\u003dNone,"},{"line_number":2164,"context_line":"                               session\u003dNone):"},{"line_number":2165,"context_line":"    if not session:"},{"line_number":2166,"context_line":"        session \u003d get_session()"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_209cf90d","line":2163,"updated":"2015-04-26 18:34:52.000000000","message":"Why do you not need \"with session.begin():\" in this method?","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"b7e842c7ee0c81d4564ac6c7be9e5dc3e8bfd669","unresolved":false,"context_lines":[{"line_number":2160,"context_line":""},{"line_number":2161,"context_line":""},{"line_number":2162,"context_line":"@require_context"},{"line_number":2163,"context_line":"def driver_private_data_delete(context, host, entity_id, key\u003dNone,"},{"line_number":2164,"context_line":"                               session\u003dNone):"},{"line_number":2165,"context_line":"    if not session:"},{"line_number":2166,"context_line":"        session \u003d get_session()"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_a70edb38","line":2163,"in_reply_to":"bab921fb_209cf90d","updated":"2015-04-27 08:33:41.000000000","message":"Done","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"9865dfe60e9c7b7eae2ed3208a9858ca6e94b435","unresolved":false,"context_lines":[{"line_number":2136,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"},{"line_number":2137,"context_line":""},{"line_number":2138,"context_line":"            if delete_existing and not in_new_details:"},{"line_number":2139,"context_line":"                data_ref.update({\"deleted\": 1})"},{"line_number":2140,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2141,"context_line":"            elif in_new_details:"},{"line_number":2142,"context_line":"                new_value \u003d six.text_type(new_details.pop(data_ref[\u0027key\u0027]))"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_983e43b7","line":2139,"updated":"2015-04-29 03:11:40.000000000","message":"This block isn\u0027t being unit tested.  Would you mind adding a test with delete_existing\u003dtrue ?","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"fdbe2973150c6b49559c0a9c864db920b1b1a046","unresolved":false,"context_lines":[{"line_number":2136,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"},{"line_number":2137,"context_line":""},{"line_number":2138,"context_line":"            if delete_existing and not in_new_details:"},{"line_number":2139,"context_line":"                data_ref.update({\"deleted\": 1})"},{"line_number":2140,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2141,"context_line":"            elif in_new_details:"},{"line_number":2142,"context_line":"                new_value \u003d six.text_type(new_details.pop(data_ref[\u0027key\u0027]))"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_6eab8f8a","line":2139,"in_reply_to":"5ad0253b_983e43b7","updated":"2015-04-29 12:55:03.000000000","message":"Done","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"fdbe2973150c6b49559c0a9c864db920b1b1a046","unresolved":false,"context_lines":[{"line_number":2136,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"},{"line_number":2137,"context_line":""},{"line_number":2138,"context_line":"            if delete_existing and not in_new_details:"},{"line_number":2139,"context_line":"                data_ref.update({\"deleted\": 1})"},{"line_number":2140,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2141,"context_line":"            elif in_new_details:"},{"line_number":2142,"context_line":"                new_value \u003d six.text_type(new_details.pop(data_ref[\u0027key\u0027]))"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_e210d350","line":2139,"in_reply_to":"5ad0253b_983e43b7","updated":"2015-04-29 12:55:03.000000000","message":"Done","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"46da5a525358466c1c2b92705e0a26d0d0028e05","unresolved":false,"context_lines":[{"line_number":2130,"context_line":"    with session.begin():"},{"line_number":2131,"context_line":"        # Process existing data"},{"line_number":2132,"context_line":"        original_data \u003d _driver_private_data_query("},{"line_number":2133,"context_line":"            session, context, host, entity_id, read_deleted\u003dNone).all()"},{"line_number":2134,"context_line":""},{"line_number":2135,"context_line":"        for data_ref in original_data:"},{"line_number":2136,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_d7d121fd","line":2133,"updated":"2015-04-30 06:59:47.000000000","message":"Why \u0027None\u0027 for read_deleted? I guess you mean \u0027False\u0027 ?","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"09d93e32932ad66d503513c209f20fa9994f37c1","unresolved":false,"context_lines":[{"line_number":2130,"context_line":"    with session.begin():"},{"line_number":2131,"context_line":"        # Process existing data"},{"line_number":2132,"context_line":"        original_data \u003d _driver_private_data_query("},{"line_number":2133,"context_line":"            session, context, host, entity_id, read_deleted\u003dNone).all()"},{"line_number":2134,"context_line":""},{"line_number":2135,"context_line":"        for data_ref in original_data:"},{"line_number":2136,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_f8cbed70","line":2133,"in_reply_to":"3acd31a7_d7d121fd","updated":"2015-04-30 07:47:15.000000000","message":"See line 196, \"None\" will be considered as \"True\". So, we have here read all that we have.","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"472907879859362717166fd712295728410b8264","unresolved":false,"context_lines":[{"line_number":2130,"context_line":"    with session.begin():"},{"line_number":2131,"context_line":"        # Process existing data"},{"line_number":2132,"context_line":"        original_data \u003d _driver_private_data_query("},{"line_number":2133,"context_line":"            session, context, host, entity_id, read_deleted\u003dNone).all()"},{"line_number":2134,"context_line":""},{"line_number":2135,"context_line":"        for data_ref in original_data:"},{"line_number":2136,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_78f35d74","line":2133,"in_reply_to":"3acd31a7_f8cbed70","updated":"2015-04-30 09:30:15.000000000","message":"Valeriy +1","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":11047,"name":"Mark Sturdevant","email":"mark.sturdevant@ibm.com","username":"markstur"},"change_message_id":"bff6c1d5945eb72e28d0e8c086756bde874e1062","unresolved":false,"context_lines":[{"line_number":2132,"context_line":"    with session.begin():"},{"line_number":2133,"context_line":"        # Process existing data"},{"line_number":2134,"context_line":"        original_data \u003d _driver_private_data_query("},{"line_number":2135,"context_line":"            session, context, host, entity_id, read_deleted\u003dNone).all()"},{"line_number":2136,"context_line":""},{"line_number":2137,"context_line":"        for data_ref in original_data:"},{"line_number":2138,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"}],"source_content_type":"text/x-python","patch_set":7,"id":"3acd31a7_16109400","line":2135,"updated":"2015-05-01 04:18:23.000000000","message":"read_deleted\u003d\u0027no\u0027","commit_id":"6a2911851dd6be0955f8341724ab9a0f6caff8fe"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"5199d36cd66bdc5e823e67f4f856bc9ee5006354","unresolved":false,"context_lines":[{"line_number":2132,"context_line":"    with session.begin():"},{"line_number":2133,"context_line":"        # Process existing data"},{"line_number":2134,"context_line":"        original_data \u003d _driver_private_data_query("},{"line_number":2135,"context_line":"            session, context, host, entity_id, read_deleted\u003dNone).all()"},{"line_number":2136,"context_line":""},{"line_number":2137,"context_line":"        for data_ref in original_data:"},{"line_number":2138,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"}],"source_content_type":"text/x-python","patch_set":7,"id":"3acd31a7_1f729d7b","line":2135,"in_reply_to":"3acd31a7_16109400","updated":"2015-05-05 11:02:30.000000000","message":"\u0027None\u0027 value used intentionally. Please see Valeriy\u0027s comment - https://review.openstack.org/#/c/176877/6/manila/db/sqlalchemy/api.py","commit_id":"6a2911851dd6be0955f8341724ab9a0f6caff8fe"},{"author":{"_account_id":7652,"name":"Luis Pabón","email":"lpabon@gmail.com","username":"lpabon"},"change_message_id":"4cae2749b63fd0b6dca615d5a73d8baf277f6bfa","unresolved":false,"context_lines":[{"line_number":2132,"context_line":"    with session.begin():"},{"line_number":2133,"context_line":"        # Process existing data"},{"line_number":2134,"context_line":"        original_data \u003d _driver_private_data_query("},{"line_number":2135,"context_line":"            session, context, host, entity_id, read_deleted\u003dNone).all()"},{"line_number":2136,"context_line":""},{"line_number":2137,"context_line":"        for data_ref in original_data:"},{"line_number":2138,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"}],"source_content_type":"text/x-python","patch_set":7,"id":"3acd31a7_a81caac1","line":2135,"in_reply_to":"3acd31a7_16109400","updated":"2015-05-04 18:37:06.000000000","message":"+1 Mark.  It can also be set to False if you do not want to use a string.  See line 195.","commit_id":"6a2911851dd6be0955f8341724ab9a0f6caff8fe"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"1c88c4e6b9df19b7d4025e4c9692c9a017d5bf83","unresolved":false,"context_lines":[{"line_number":2132,"context_line":"    with session.begin():"},{"line_number":2133,"context_line":"        # Process existing data"},{"line_number":2134,"context_line":"        original_data \u003d _driver_private_data_query("},{"line_number":2135,"context_line":"            session, context, host, entity_id, read_deleted\u003dNone).all()"},{"line_number":2136,"context_line":""},{"line_number":2137,"context_line":"        for data_ref in original_data:"},{"line_number":2138,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aca2d91_f69afec4","line":2135,"in_reply_to":"3acd31a7_1f729d7b","updated":"2015-05-06 01:30:21.000000000","message":"Valeriy\u0027s earlier comment seems a bit misleading, but None would appear what is needed to read all records.  Igor\u0027s added comment here makes that clear.","commit_id":"6a2911851dd6be0955f8341724ab9a0f6caff8fe"},{"author":{"_account_id":11047,"name":"Mark Sturdevant","email":"mark.sturdevant@ibm.com","username":"markstur"},"change_message_id":"bff6c1d5945eb72e28d0e8c086756bde874e1062","unresolved":false,"context_lines":[{"line_number":2137,"context_line":"        for data_ref in original_data:"},{"line_number":2138,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"},{"line_number":2139,"context_line":""},{"line_number":2140,"context_line":"            if delete_existing and not in_new_details:"},{"line_number":2141,"context_line":"                data_ref.update({\"deleted\": 1})"},{"line_number":2142,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2143,"context_line":"            elif in_new_details:"}],"source_content_type":"text/x-python","patch_set":7,"id":"3acd31a7_7668e887","line":2140,"updated":"2015-05-01 04:18:23.000000000","message":"simpler if you switch the if/elif.  Then you can use \"if in_new_details\" and \"elif delete_existing\" w/o the redundant \"and not\".","commit_id":"6a2911851dd6be0955f8341724ab9a0f6caff8fe"},{"author":{"_account_id":7652,"name":"Luis Pabón","email":"lpabon@gmail.com","username":"lpabon"},"change_message_id":"4cae2749b63fd0b6dca615d5a73d8baf277f6bfa","unresolved":false,"context_lines":[{"line_number":2137,"context_line":"        for data_ref in original_data:"},{"line_number":2138,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"},{"line_number":2139,"context_line":""},{"line_number":2140,"context_line":"            if delete_existing and not in_new_details:"},{"line_number":2141,"context_line":"                data_ref.update({\"deleted\": 1})"},{"line_number":2142,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2143,"context_line":"            elif in_new_details:"}],"source_content_type":"text/x-python","patch_set":7,"id":"3acd31a7_68645248","line":2140,"in_reply_to":"3acd31a7_7668e887","updated":"2015-05-04 18:37:06.000000000","message":"Good catch Mark.  Also makes it easier to read.","commit_id":"6a2911851dd6be0955f8341724ab9a0f6caff8fe"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"5199d36cd66bdc5e823e67f4f856bc9ee5006354","unresolved":false,"context_lines":[{"line_number":2137,"context_line":"        for data_ref in original_data:"},{"line_number":2138,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"},{"line_number":2139,"context_line":""},{"line_number":2140,"context_line":"            if delete_existing and not in_new_details:"},{"line_number":2141,"context_line":"                data_ref.update({\"deleted\": 1})"},{"line_number":2142,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2143,"context_line":"            elif in_new_details:"}],"source_content_type":"text/x-python","patch_set":7,"id":"3acd31a7_9fa8ed8e","line":2140,"in_reply_to":"3acd31a7_7668e887","updated":"2015-05-05 11:02:30.000000000","message":"Good suggestion, thanks!\n\nDone","commit_id":"6a2911851dd6be0955f8341724ab9a0f6caff8fe"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"5c6d73402092ac9e60ffe159864b7f86096d251a","unresolved":false,"context_lines":[{"line_number":2121,"context_line":""},{"line_number":2122,"context_line":"@require_context"},{"line_number":2123,"context_line":"def driver_private_data_update(context, host, entity_id, details,"},{"line_number":2124,"context_line":"                               delete_existing\u003dFalse, session\u003dNone):"},{"line_number":2125,"context_line":"    # NOTE(u_glide): following code modifies details dict, that\u0027s why we should"},{"line_number":2126,"context_line":"    # copy it"},{"line_number":2127,"context_line":"    new_details \u003d copy.deepcopy(details)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aca2d91_8bdb931b","line":2124,"updated":"2015-05-06 11:45:39.000000000","message":"Hm. This method looks somehow complicated. Couldn\u0027t the soft_delete() be done with something like (not tested):\nif delete_existing:\n    q \u003d _driver_private_data_query(session, context, host, entity_id, key\u003dNone, read_deleted\u003dFalse)\n    q.filter(not_(models.DriverPrivateData.key.in_(list(details))).soft_delete()\n\n\nI\u0027m not very familiar with sqlalchemy, but maybe there\u0027s somethink like insert_or_update todo the update operation?","commit_id":"d37a9726caaba821e55e5a260f3554d986a3dcff"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"462730500994a02a2234930d9e2d51296af644b3","unresolved":false,"context_lines":[{"line_number":2121,"context_line":""},{"line_number":2122,"context_line":"@require_context"},{"line_number":2123,"context_line":"def driver_private_data_update(context, host, entity_id, details,"},{"line_number":2124,"context_line":"                               delete_existing\u003dFalse, session\u003dNone):"},{"line_number":2125,"context_line":"    # NOTE(u_glide): following code modifies details dict, that\u0027s why we should"},{"line_number":2126,"context_line":"    # copy it"},{"line_number":2127,"context_line":"    new_details \u003d copy.deepcopy(details)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aca2d91_de733014","line":2124,"in_reply_to":"1aca2d91_50617238","updated":"2015-05-08 07:41:38.000000000","message":"Hm. Right. Then the deleted_at column should be set to timeutils.utcnow() whenever you mark something as deleted. Otherwise this field is useless.","commit_id":"d37a9726caaba821e55e5a260f3554d986a3dcff"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"96669fd402ebbf875ffab2f9b5542547d11053a4","unresolved":false,"context_lines":[{"line_number":2121,"context_line":""},{"line_number":2122,"context_line":"@require_context"},{"line_number":2123,"context_line":"def driver_private_data_update(context, host, entity_id, details,"},{"line_number":2124,"context_line":"                               delete_existing\u003dFalse, session\u003dNone):"},{"line_number":2125,"context_line":"    # NOTE(u_glide): following code modifies details dict, that\u0027s why we should"},{"line_number":2126,"context_line":"    # copy it"},{"line_number":2127,"context_line":"    new_details \u003d copy.deepcopy(details)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aca2d91_50617238","line":2124,"in_reply_to":"1aca2d91_8bdb931b","updated":"2015-05-07 12:59:46.000000000","message":"soft_delete() couldn\u0027t be used because table \u0027drivers_private_data\u0027 doesn\u0027t have integer \u0027id\u0027 column.","commit_id":"d37a9726caaba821e55e5a260f3554d986a3dcff"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"85f98b0da709d40a85388e83f77d71d296563013","unresolved":false,"context_lines":[{"line_number":2121,"context_line":""},{"line_number":2122,"context_line":"@require_context"},{"line_number":2123,"context_line":"def driver_private_data_update(context, host, entity_id, details,"},{"line_number":2124,"context_line":"                               delete_existing\u003dFalse, session\u003dNone):"},{"line_number":2125,"context_line":"    # NOTE(u_glide): following code modifies details dict, that\u0027s why we should"},{"line_number":2126,"context_line":"    # copy it"},{"line_number":2127,"context_line":"    new_details \u003d copy.deepcopy(details)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aca2d91_17dd0b0e","line":2124,"in_reply_to":"1aca2d91_de733014","updated":"2015-05-08 09:19:52.000000000","message":"Done","commit_id":"d37a9726caaba821e55e5a260f3554d986a3dcff"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"5c6d73402092ac9e60ffe159864b7f86096d251a","unresolved":false,"context_lines":[{"line_number":2133,"context_line":"        # Process existing data"},{"line_number":2134,"context_line":"        # NOTE(u_glide): read_deleted\u003dNone means here \u0027read all\u0027"},{"line_number":2135,"context_line":"        original_data \u003d _driver_private_data_query("},{"line_number":2136,"context_line":"            session, context, host, entity_id, read_deleted\u003dNone).all()"},{"line_number":2137,"context_line":""},{"line_number":2138,"context_line":"        for data_ref in original_data:"},{"line_number":2139,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aca2d91_a892d555","line":2136,"updated":"2015-05-06 11:45:39.000000000","message":"According to the comment from Valeriy in patchset 6, we treat \u0027None\u0027 as \u0027True\u0027 so we read all data here (including the deleted data). My question is then, why we should allow to update already deleted data? I think we want \u0027read_deleted\u003dFalse\u0027 here. Or am I missing something?","commit_id":"d37a9726caaba821e55e5a260f3554d986a3dcff"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"96669fd402ebbf875ffab2f9b5542547d11053a4","unresolved":false,"context_lines":[{"line_number":2133,"context_line":"        # Process existing data"},{"line_number":2134,"context_line":"        # NOTE(u_glide): read_deleted\u003dNone means here \u0027read all\u0027"},{"line_number":2135,"context_line":"        original_data \u003d _driver_private_data_query("},{"line_number":2136,"context_line":"            session, context, host, entity_id, read_deleted\u003dNone).all()"},{"line_number":2137,"context_line":""},{"line_number":2138,"context_line":"        for data_ref in original_data:"},{"line_number":2139,"context_line":"            in_new_details \u003d data_ref[\u0027key\u0027] in new_details"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aca2d91_50d17256","line":2136,"in_reply_to":"1aca2d91_a892d555","updated":"2015-05-07 12:59:46.000000000","message":"We should allow to update already deleted data to minimize an amount of data in drivers_private_data table. It\u0027s implementation detail which doesn\u0027t affect drivers.","commit_id":"d37a9726caaba821e55e5a260f3554d986a3dcff"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"5c6d73402092ac9e60ffe159864b7f86096d251a","unresolved":false,"context_lines":[{"line_number":2170,"context_line":"        query \u003d _driver_private_data_query(session, context, host,"},{"line_number":2171,"context_line":"                                           entity_id, key)"},{"line_number":2172,"context_line":""},{"line_number":2173,"context_line":"        if key is None or isinstance(key, list):"},{"line_number":2174,"context_line":"            for item in query.all():"},{"line_number":2175,"context_line":"                item.update({\"deleted\": 1})"},{"line_number":2176,"context_line":"                item.save(session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aca2d91_ab3c0f30","line":2173,"updated":"2015-05-06 11:45:39.000000000","message":"Can you use the soft_delete() function here? See http://docs.openstack.org/developer/oslo.db/api/sqlalchemy/session.html for an example. I think this can be directly done with the query object. And if key is given, just do:\nquery.filter(models.DriverPrivateData.key.in_(list(key)).soft_delete()","commit_id":"d37a9726caaba821e55e5a260f3554d986a3dcff"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"96669fd402ebbf875ffab2f9b5542547d11053a4","unresolved":false,"context_lines":[{"line_number":2170,"context_line":"        query \u003d _driver_private_data_query(session, context, host,"},{"line_number":2171,"context_line":"                                           entity_id, key)"},{"line_number":2172,"context_line":""},{"line_number":2173,"context_line":"        if key is None or isinstance(key, list):"},{"line_number":2174,"context_line":"            for item in query.all():"},{"line_number":2175,"context_line":"                item.update({\"deleted\": 1})"},{"line_number":2176,"context_line":"                item.save(session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aca2d91_50ef3287","line":2173,"in_reply_to":"1aca2d91_ab3c0f30","updated":"2015-05-07 12:59:46.000000000","message":"This method could be simplified even more. \n\nThanks for the suggestion! Done.","commit_id":"d37a9726caaba821e55e5a260f3554d986a3dcff"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"225275252e286272f74397187c64bc34762f899a","unresolved":false,"context_lines":[{"line_number":2140,"context_line":""},{"line_number":2141,"context_line":"            if in_new_details:"},{"line_number":2142,"context_line":"                new_value \u003d six.text_type(new_details.pop(data_ref[\u0027key\u0027]))"},{"line_number":2143,"context_line":"                data_ref.update({\"value\": new_value, \"deleted\": 0})"},{"line_number":2144,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2145,"context_line":"            elif delete_existing:"},{"line_number":2146,"context_line":"                data_ref.update({\"deleted\": timeutils.utcnow()})"}],"source_content_type":"text/x-python","patch_set":11,"id":"1aca2d91_97b7db85","line":2143,"updated":"2015-05-08 10:04:02.000000000","message":"shouldn\u0027t the deleted_at field be nulled, here?","commit_id":"f2bd6d27d29520a61841424cc1edac6dae3bf41d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6d1102b12de753e5e257e7a77d633d215712b27f","unresolved":false,"context_lines":[{"line_number":2140,"context_line":""},{"line_number":2141,"context_line":"            if in_new_details:"},{"line_number":2142,"context_line":"                new_value \u003d six.text_type(new_details.pop(data_ref[\u0027key\u0027]))"},{"line_number":2143,"context_line":"                data_ref.update({\"value\": new_value, \"deleted\": 0})"},{"line_number":2144,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2145,"context_line":"            elif delete_existing:"},{"line_number":2146,"context_line":"                data_ref.update({\"deleted\": timeutils.utcnow()})"}],"source_content_type":"text/x-python","patch_set":11,"id":"1aca2d91_cd4ee46e","line":2143,"in_reply_to":"1aca2d91_97b7db85","updated":"2015-05-08 10:11:41.000000000","message":"+1","commit_id":"f2bd6d27d29520a61841424cc1edac6dae3bf41d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"9e038c2073db657b1a44b81e569983a48fdf8ec9","unresolved":false,"context_lines":[{"line_number":2140,"context_line":""},{"line_number":2141,"context_line":"            if in_new_details:"},{"line_number":2142,"context_line":"                new_value \u003d six.text_type(new_details.pop(data_ref[\u0027key\u0027]))"},{"line_number":2143,"context_line":"                data_ref.update({\"value\": new_value, \"deleted\": 0})"},{"line_number":2144,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2145,"context_line":"            elif delete_existing:"},{"line_number":2146,"context_line":"                data_ref.update({\"deleted\": timeutils.utcnow()})"}],"source_content_type":"text/x-python","patch_set":11,"id":"1aca2d91_6de110fe","line":2143,"in_reply_to":"1aca2d91_97b7db85","updated":"2015-05-08 11:03:30.000000000","message":"Done","commit_id":"f2bd6d27d29520a61841424cc1edac6dae3bf41d"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"225275252e286272f74397187c64bc34762f899a","unresolved":false,"context_lines":[{"line_number":2143,"context_line":"                data_ref.update({\"value\": new_value, \"deleted\": 0})"},{"line_number":2144,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2145,"context_line":"            elif delete_existing:"},{"line_number":2146,"context_line":"                data_ref.update({\"deleted\": timeutils.utcnow()})"},{"line_number":2147,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2148,"context_line":""},{"line_number":2149,"context_line":"        # Add new data"}],"source_content_type":"text/x-python","patch_set":11,"id":"1aca2d91_b7c097e1","line":2146,"updated":"2015-05-08 10:04:02.000000000","message":"That\u0027s wrong. deleted should be 1 and deleted_at should be utcnow() . Seems that this is not tested anywhere.","commit_id":"f2bd6d27d29520a61841424cc1edac6dae3bf41d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6d1102b12de753e5e257e7a77d633d215712b27f","unresolved":false,"context_lines":[{"line_number":2143,"context_line":"                data_ref.update({\"value\": new_value, \"deleted\": 0})"},{"line_number":2144,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2145,"context_line":"            elif delete_existing:"},{"line_number":2146,"context_line":"                data_ref.update({\"deleted\": timeutils.utcnow()})"},{"line_number":2147,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2148,"context_line":""},{"line_number":2149,"context_line":"        # Add new data"}],"source_content_type":"text/x-python","patch_set":11,"id":"1aca2d91_cd75c498","line":2146,"in_reply_to":"1aca2d91_b7c097e1","updated":"2015-05-08 10:11:41.000000000","message":"+1","commit_id":"f2bd6d27d29520a61841424cc1edac6dae3bf41d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"9e038c2073db657b1a44b81e569983a48fdf8ec9","unresolved":false,"context_lines":[{"line_number":2143,"context_line":"                data_ref.update({\"value\": new_value, \"deleted\": 0})"},{"line_number":2144,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2145,"context_line":"            elif delete_existing:"},{"line_number":2146,"context_line":"                data_ref.update({\"deleted\": timeutils.utcnow()})"},{"line_number":2147,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2148,"context_line":""},{"line_number":2149,"context_line":"        # Add new data"}],"source_content_type":"text/x-python","patch_set":11,"id":"1aca2d91_4de9b4e5","line":2146,"in_reply_to":"1aca2d91_b7c097e1","updated":"2015-05-08 11:03:30.000000000","message":"Done","commit_id":"f2bd6d27d29520a61841424cc1edac6dae3bf41d"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"225275252e286272f74397187c64bc34762f899a","unresolved":false,"context_lines":[{"line_number":2169,"context_line":"    with session.begin():"},{"line_number":2170,"context_line":"        query \u003d _driver_private_data_query(session, context, host,"},{"line_number":2171,"context_line":"                                           entity_id, key)"},{"line_number":2172,"context_line":"        query.update({\"deleted\": timeutils.utcnow()})"},{"line_number":2173,"context_line":""},{"line_number":2174,"context_line":""},{"line_number":2175,"context_line":"###################"}],"source_content_type":"text/x-python","patch_set":11,"id":"1aca2d91_175aab4f","line":2172,"updated":"2015-05-08 10:04:02.000000000","message":"same here I think. deleted should be 1 and deleted_at should be utcnow()","commit_id":"f2bd6d27d29520a61841424cc1edac6dae3bf41d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"6d1102b12de753e5e257e7a77d633d215712b27f","unresolved":false,"context_lines":[{"line_number":2169,"context_line":"    with session.begin():"},{"line_number":2170,"context_line":"        query \u003d _driver_private_data_query(session, context, host,"},{"line_number":2171,"context_line":"                                           entity_id, key)"},{"line_number":2172,"context_line":"        query.update({\"deleted\": timeutils.utcnow()})"},{"line_number":2173,"context_line":""},{"line_number":2174,"context_line":""},{"line_number":2175,"context_line":"###################"}],"source_content_type":"text/x-python","patch_set":11,"id":"1aca2d91_8d6fccc4","line":2172,"in_reply_to":"1aca2d91_175aab4f","updated":"2015-05-08 10:11:41.000000000","message":"+1","commit_id":"f2bd6d27d29520a61841424cc1edac6dae3bf41d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"9e038c2073db657b1a44b81e569983a48fdf8ec9","unresolved":false,"context_lines":[{"line_number":2169,"context_line":"    with session.begin():"},{"line_number":2170,"context_line":"        query \u003d _driver_private_data_query(session, context, host,"},{"line_number":2171,"context_line":"                                           entity_id, key)"},{"line_number":2172,"context_line":"        query.update({\"deleted\": timeutils.utcnow()})"},{"line_number":2173,"context_line":""},{"line_number":2174,"context_line":""},{"line_number":2175,"context_line":"###################"}],"source_content_type":"text/x-python","patch_set":11,"id":"1aca2d91_eded20f0","line":2172,"in_reply_to":"1aca2d91_175aab4f","updated":"2015-05-08 11:03:30.000000000","message":"Done","commit_id":"f2bd6d27d29520a61841424cc1edac6dae3bf41d"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"9e092ef011268b234a4192b90708d5e33ccb4ad6","unresolved":false,"context_lines":[{"line_number":2147,"context_line":"                })"},{"line_number":2148,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2149,"context_line":"            elif delete_existing:"},{"line_number":2150,"context_line":"                data_ref.update({"},{"line_number":2151,"context_line":"                    \"deleted\": 1, \"deleted_at\": timeutils.utcnow()"},{"line_number":2152,"context_line":"                })"},{"line_number":2153,"context_line":"                data_ref.save(session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1aca2d91_0095a73d","line":2150,"updated":"2015-05-09 05:45:56.000000000","message":"Shouldn\u0027t this only be done if the row wasn\u0027t already deleted? Otherwise you override the deleted_at field with a newer date. And I think we want to keep the original date of the deletion.","commit_id":"d894ab165b054813175f08bb4ce0531f319c461d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"f18a7f2a7290d0fac04343cdf7b7ae105d1b3786","unresolved":false,"context_lines":[{"line_number":2147,"context_line":"                })"},{"line_number":2148,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2149,"context_line":"            elif delete_existing:"},{"line_number":2150,"context_line":"                data_ref.update({"},{"line_number":2151,"context_line":"                    \"deleted\": 1, \"deleted_at\": timeutils.utcnow()"},{"line_number":2152,"context_line":"                })"},{"line_number":2153,"context_line":"                data_ref.save(session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a0c5dc1_a2ac26ee","line":2150,"in_reply_to":"1aca2d91_0095a73d","updated":"2015-05-12 12:06:19.000000000","message":"+1","commit_id":"d894ab165b054813175f08bb4ce0531f319c461d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"332a0f93a42c7cc0062a3bf495fdc9cf528aae02","unresolved":false,"context_lines":[{"line_number":2147,"context_line":"                })"},{"line_number":2148,"context_line":"                data_ref.save(session\u003dsession)"},{"line_number":2149,"context_line":"            elif delete_existing:"},{"line_number":2150,"context_line":"                data_ref.update({"},{"line_number":2151,"context_line":"                    \"deleted\": 1, \"deleted_at\": timeutils.utcnow()"},{"line_number":2152,"context_line":"                })"},{"line_number":2153,"context_line":"                data_ref.save(session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a0c5dc1_d3dc9748","line":2150,"in_reply_to":"1aca2d91_0095a73d","updated":"2015-05-12 12:52:41.000000000","message":"Done","commit_id":"d894ab165b054813175f08bb4ce0531f319c461d"}],"manila/db/sqlalchemy/models.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"32640073212dea565b52ae17462b387a1c31e105","unresolved":false,"context_lines":[{"line_number":458,"context_line":""},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"class DriverPrivateData(BASE, ManilaBase):"},{"line_number":461,"context_line":"    \"\"\"Represents a metadata key/value pair for a share server.\"\"\""},{"line_number":462,"context_line":"    __tablename__ \u003d \u0027drivers_private_data\u0027"},{"line_number":463,"context_line":"    deleted \u003d Column(Integer, default\u003d\u00270\u0027)"},{"line_number":464,"context_line":"    host \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_0467d7b7","line":461,"updated":"2015-04-25 16:23:55.000000000","message":"\"metadata key/value pair\" better to replace with \"private data as key-value pairs\".","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"b7e842c7ee0c81d4564ac6c7be9e5dc3e8bfd669","unresolved":false,"context_lines":[{"line_number":458,"context_line":""},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"class DriverPrivateData(BASE, ManilaBase):"},{"line_number":461,"context_line":"    \"\"\"Represents a metadata key/value pair for a share server.\"\"\""},{"line_number":462,"context_line":"    __tablename__ \u003d \u0027drivers_private_data\u0027"},{"line_number":463,"context_line":"    deleted \u003d Column(Integer, default\u003d\u00270\u0027)"},{"line_number":464,"context_line":"    host \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_e21de162","line":461,"in_reply_to":"bab921fb_0467d7b7","updated":"2015-04-27 08:33:41.000000000","message":"Done","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"f60a0b0b573cbeec0a993a247df69a56a6db8863","unresolved":false,"context_lines":[{"line_number":460,"context_line":"class DriverPrivateData(BASE, ManilaBase):"},{"line_number":461,"context_line":"    \"\"\"Represents a private data as key-value pairs for a driver.\"\"\""},{"line_number":462,"context_line":"    __tablename__ \u003d \u0027drivers_private_data\u0027"},{"line_number":463,"context_line":"    deleted \u003d Column(Integer, default\u003d\u00270\u0027)"},{"line_number":464,"context_line":"    host \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":465,"context_line":"    entity_uuid \u003d Column(String(36), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":466,"context_line":"    key \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_e89317f9","line":463,"updated":"2015-04-29 12:19:38.000000000","message":"Why default value is string type? In model it is integer as expected - https://review.openstack.org/#/c/176877/4/manila/db/migrations/alembic/versions/3a482171410f_add_drivers_private_data_table.py","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"fdbe2973150c6b49559c0a9c864db920b1b1a046","unresolved":false,"context_lines":[{"line_number":460,"context_line":"class DriverPrivateData(BASE, ManilaBase):"},{"line_number":461,"context_line":"    \"\"\"Represents a private data as key-value pairs for a driver.\"\"\""},{"line_number":462,"context_line":"    __tablename__ \u003d \u0027drivers_private_data\u0027"},{"line_number":463,"context_line":"    deleted \u003d Column(Integer, default\u003d\u00270\u0027)"},{"line_number":464,"context_line":"    host \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":465,"context_line":"    entity_uuid \u003d Column(String(36), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":466,"context_line":"    key \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_ce73c34c","line":463,"in_reply_to":"5ad0253b_e89317f9","updated":"2015-04-29 12:55:03.000000000","message":"Done","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"f60a0b0b573cbeec0a993a247df69a56a6db8863","unresolved":false,"context_lines":[{"line_number":464,"context_line":"    host \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":465,"context_line":"    entity_uuid \u003d Column(String(36), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":466,"context_line":"    key \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":467,"context_line":"    value \u003d Column(String(1023), nullable\u003dFalse)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"def register_models():"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_d38db07c","line":467,"updated":"2015-04-29 12:19:38.000000000","message":"Also, what about adding additional column where we will be able to store \"type\" of that \"entity\" that can be useful for human that reads DB table \"drivers_private_data\" records?","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":2417,"name":"Ben Swartzlander","email":"ben@swartzlander.org","username":"bswartz"},"change_message_id":"7bd6eb7fffa7d0e71d4f7ea288fbfb43c0fb5fe4","unresolved":false,"context_lines":[{"line_number":464,"context_line":"    host \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":465,"context_line":"    entity_uuid \u003d Column(String(36), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":466,"context_line":"    key \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":467,"context_line":"    value \u003d Column(String(1023), nullable\u003dFalse)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"def register_models():"}],"source_content_type":"text/x-python","patch_set":4,"id":"3acd31a7_7af931c8","line":467,"in_reply_to":"5ad0253b_d38db07c","updated":"2015-04-29 14:39:10.000000000","message":"Humans using the database directly can use table joins in their queries if they want to filter the private data by entity type.\n\nI suspect adding a new column would create a place for bugs to creep in.","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"46da5a525358466c1c2b92705e0a26d0d0028e05","unresolved":false,"context_lines":[{"line_number":460,"context_line":"class DriverPrivateData(BASE, ManilaBase):"},{"line_number":461,"context_line":"    \"\"\"Represents a private data as key-value pairs for a driver.\"\"\""},{"line_number":462,"context_line":"    __tablename__ \u003d \u0027drivers_private_data\u0027"},{"line_number":463,"context_line":"    deleted \u003d Column(Integer, default\u003d0)"},{"line_number":464,"context_line":"    host \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":465,"context_line":"    entity_uuid \u003d Column(String(36), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":466,"context_line":"    key \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_72481b5c","line":463,"updated":"2015-04-30 06:59:47.000000000","message":"Isn\u0027t the \u0027deleted\u0027 field already handled by the SoftDeleteMixin from oslo.db which we already use in our base model?","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"472907879859362717166fd712295728410b8264","unresolved":false,"context_lines":[{"line_number":460,"context_line":"class DriverPrivateData(BASE, ManilaBase):"},{"line_number":461,"context_line":"    \"\"\"Represents a private data as key-value pairs for a driver.\"\"\""},{"line_number":462,"context_line":"    __tablename__ \u003d \u0027drivers_private_data\u0027"},{"line_number":463,"context_line":"    deleted \u003d Column(Integer, default\u003d0)"},{"line_number":464,"context_line":"    host \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":465,"context_line":"    entity_uuid \u003d Column(String(36), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":466,"context_line":"    key \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_01007433","line":463,"in_reply_to":"3acd31a7_72481b5c","updated":"2015-04-30 09:30:15.000000000","message":"Done","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"cb68267783235053b1e9e6d0c2a068078c2756c3","unresolved":false,"context_lines":[{"line_number":460,"context_line":"class DriverPrivateData(BASE, ManilaBase):"},{"line_number":461,"context_line":"    \"\"\"Represents a private data as key-value pairs for a driver.\"\"\""},{"line_number":462,"context_line":"    __tablename__ \u003d \u0027drivers_private_data\u0027"},{"line_number":463,"context_line":"    deleted \u003d Column(Integer, default\u003d0)"},{"line_number":464,"context_line":"    host \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":465,"context_line":"    entity_uuid \u003d Column(String(36), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":466,"context_line":"    key \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_d876f13d","line":463,"in_reply_to":"3acd31a7_72481b5c","updated":"2015-04-30 07:50:03.000000000","message":"Thomas is right. Column \"deleted\" is inherited from \"ManilaBase\". That on its turn inherited it from \"models.SoftDeleteMixin\".","commit_id":"ebbe50505e46a100abb32adea170d98829729127"}],"manila/share/drivers/generic.py":[{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"c1b886bfef6f2338f93e5fa240ce03089e24f624","unresolved":false,"context_lines":[{"line_number":121,"context_line":"class GenericShareDriver(driver.ExecuteMixin, driver.ShareDriver):"},{"line_number":122,"context_line":"    \"\"\"Executes commands relating to Shares.\"\"\""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def __init__(self, private_data, *args, **kwargs):"},{"line_number":125,"context_line":"        \"\"\"Do initialization.\"\"\""},{"line_number":126,"context_line":"        super(GenericShareDriver, self).__init__("},{"line_number":127,"context_line":"            [False, True], *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_c08bfdc1","line":124,"updated":"2015-04-26 18:34:52.000000000","message":"I\u0027m not in love with the name \u0027private_data\u0027, since it isn\u0027t data; it\u0027s more of a data provider.  In manager.py, you called it \u0027private_storage\u0027, which better captures the feature connotation.  In any case, let\u0027s be consistent with the naming.","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"b7e842c7ee0c81d4564ac6c7be9e5dc3e8bfd669","unresolved":false,"context_lines":[{"line_number":121,"context_line":"class GenericShareDriver(driver.ExecuteMixin, driver.ShareDriver):"},{"line_number":122,"context_line":"    \"\"\"Executes commands relating to Shares.\"\"\""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def __init__(self, private_data, *args, **kwargs):"},{"line_number":125,"context_line":"        \"\"\"Do initialization.\"\"\""},{"line_number":126,"context_line":"        super(GenericShareDriver, self).__init__("},{"line_number":127,"context_line":"            [False, True], *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9abe1de1_379f5861","line":124,"in_reply_to":"bab921fb_c08bfdc1","updated":"2015-04-27 08:33:41.000000000","message":"Done","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"32640073212dea565b52ae17462b387a1c31e105","unresolved":false,"context_lines":[{"line_number":361,"context_line":""},{"line_number":362,"context_line":"    def _get_volume(self, context, share_id):"},{"line_number":363,"context_line":"        \"\"\"Finds volume, associated to the specific share.\"\"\""},{"line_number":364,"context_line":"        volume_id \u003d self.private_data.details_get(share_id, \u0027volume_id\u0027)"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        if volume_id is not None:"},{"line_number":367,"context_line":"            return self.volume_api.get(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_041597e3","line":364,"updated":"2015-04-25 16:23:55.000000000","message":"Generic driver should be as separate change that is dependent on addition of functionality \"driver_private_data\".","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"c1b886bfef6f2338f93e5fa240ce03089e24f624","unresolved":false,"context_lines":[{"line_number":361,"context_line":""},{"line_number":362,"context_line":"    def _get_volume(self, context, share_id):"},{"line_number":363,"context_line":"        \"\"\"Finds volume, associated to the specific share.\"\"\""},{"line_number":364,"context_line":"        volume_id \u003d self.private_data.details_get(share_id, \u0027volume_id\u0027)"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        if volume_id is not None:"},{"line_number":367,"context_line":"            return self.volume_api.get(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_e0a16147","line":364,"in_reply_to":"bab921fb_041597e3","updated":"2015-04-26 18:34:52.000000000","message":"+1\n\nAlthough it\u0027s good to do the generic driver in parallel to ensure the semantics are ideal for use in the drivers.","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"b7e842c7ee0c81d4564ac6c7be9e5dc3e8bfd669","unresolved":false,"context_lines":[{"line_number":361,"context_line":""},{"line_number":362,"context_line":"    def _get_volume(self, context, share_id):"},{"line_number":363,"context_line":"        \"\"\"Finds volume, associated to the specific share.\"\"\""},{"line_number":364,"context_line":"        volume_id \u003d self.private_data.details_get(share_id, \u0027volume_id\u0027)"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        if volume_id is not None:"},{"line_number":367,"context_line":"            return self.volume_api.get(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9abe1de1_b7b3680a","line":364,"in_reply_to":"bab921fb_041597e3","updated":"2015-04-27 08:33:41.000000000","message":"Done","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"}],"manila/share/drivers/private_data.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"32640073212dea565b52ae17462b387a1c31e105","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    cfg.StrOpt("},{"line_number":26,"context_line":"        \u0027drivers_private_storage_class\u0027,"},{"line_number":27,"context_line":"        default\u003d\u0027manila.share.drivers.private_data.SqlStorageDriver\u0027,"},{"line_number":28,"context_line":"        help\u003d\u0027The full class name of the Networking API class to use.\u0027),"},{"line_number":29,"context_line":"]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_8484070b","line":28,"updated":"2015-04-25 16:23:55.000000000","message":"\"Networking api class\" ? \u003d)","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"b7e842c7ee0c81d4564ac6c7be9e5dc3e8bfd669","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    cfg.StrOpt("},{"line_number":26,"context_line":"        \u0027drivers_private_storage_class\u0027,"},{"line_number":27,"context_line":"        default\u003d\u0027manila.share.drivers.private_data.SqlStorageDriver\u0027,"},{"line_number":28,"context_line":"        help\u003d\u0027The full class name of the Networking API class to use.\u0027),"},{"line_number":29,"context_line":"]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_422fed87","line":28,"in_reply_to":"bab921fb_8484070b","updated":"2015-04-27 08:33:41.000000000","message":"Done","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"32640073212dea565b52ae17462b387a1c31e105","unresolved":false,"context_lines":[{"line_number":29,"context_line":"]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"CONF \u003d cfg.CONF"},{"line_number":32,"context_line":"CONF.register_opts(private_data_opts)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class StorageDriver(object):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_049a376e","line":32,"updated":"2015-04-25 16:23:55.000000000","message":"Are you sure that it should be in group DEFAULT? Without possibility to use specific class for each driver?","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"c1b886bfef6f2338f93e5fa240ce03089e24f624","unresolved":false,"context_lines":[{"line_number":29,"context_line":"]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"CONF \u003d cfg.CONF"},{"line_number":32,"context_line":"CONF.register_opts(private_data_opts)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class StorageDriver(object):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_809185f3","line":32,"in_reply_to":"bab921fb_049a376e","updated":"2015-04-26 18:34:52.000000000","message":"+1","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"b7e842c7ee0c81d4564ac6c7be9e5dc3e8bfd669","unresolved":false,"context_lines":[{"line_number":29,"context_line":"]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"CONF \u003d cfg.CONF"},{"line_number":32,"context_line":"CONF.register_opts(private_data_opts)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class StorageDriver(object):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_a2748967","line":32,"in_reply_to":"bab921fb_049a376e","updated":"2015-04-27 08:33:41.000000000","message":"Done","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"32640073212dea565b52ae17462b387a1c31e105","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"CONF \u003d cfg.CONF"},{"line_number":32,"context_line":"CONF.register_opts(private_data_opts)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class StorageDriver(object):"},{"line_number":36,"context_line":"    def __init__(self, context, backend_host):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_64e9f3e5","line":33,"updated":"2015-04-25 16:23:55.000000000","message":"Place \"manila/share/drivers/private_data.py\" is incorrect. It is not driver.","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"c1b886bfef6f2338f93e5fa240ce03089e24f624","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"CONF \u003d cfg.CONF"},{"line_number":32,"context_line":"CONF.register_opts(private_data_opts)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class StorageDriver(object):"},{"line_number":36,"context_line":"    def __init__(self, context, backend_host):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_608e71d1","line":33,"in_reply_to":"bab921fb_64e9f3e5","updated":"2015-04-26 18:34:52.000000000","message":"+1","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"b7e842c7ee0c81d4564ac6c7be9e5dc3e8bfd669","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"CONF \u003d cfg.CONF"},{"line_number":32,"context_line":"CONF.register_opts(private_data_opts)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class StorageDriver(object):"},{"line_number":36,"context_line":"    def __init__(self, context, backend_host):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_82718578","line":33,"in_reply_to":"bab921fb_64e9f3e5","updated":"2015-04-27 08:33:41.000000000","message":"Done","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"c1b886bfef6f2338f93e5fa240ce03089e24f624","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self.backend_host \u003d backend_host"},{"line_number":39,"context_line":"        self.context \u003d context"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def details_get(self, entity_id, key, default):"},{"line_number":42,"context_line":"        raise NotImplementedError()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def details_update(self, entity_id, details,"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_60a55145","line":41,"updated":"2015-04-26 18:34:52.000000000","message":"Why do all the methods start with \u0027details\u0027?  Do you envision more methods later that don\u0027t have that prefix?  Otherwise, it doesn\u0027t add value and I\u0027d be just as happy with \u0027get\u0027, \u0027update\u0027, and \u0027delete\u0027 methods.","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"b7e842c7ee0c81d4564ac6c7be9e5dc3e8bfd669","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self.backend_host \u003d backend_host"},{"line_number":39,"context_line":"        self.context \u003d context"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def details_get(self, entity_id, key, default):"},{"line_number":42,"context_line":"        raise NotImplementedError()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def details_update(self, entity_id, details,"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_22bcf9da","line":41,"in_reply_to":"bab921fb_60a55145","updated":"2015-04-27 08:33:41.000000000","message":"Done","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"32640073212dea565b52ae17462b387a1c31e105","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self.context \u003d context"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def details_get(self, entity_id, key, default):"},{"line_number":42,"context_line":"        raise NotImplementedError()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def details_update(self, entity_id, details,"},{"line_number":45,"context_line":"                       delete_existing):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_24c65b68","line":42,"updated":"2015-04-25 16:23:55.000000000","message":"You may want to use here module \"ABC\".","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"c1b886bfef6f2338f93e5fa240ce03089e24f624","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self.context \u003d context"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def details_get(self, entity_id, key, default):"},{"line_number":42,"context_line":"        raise NotImplementedError()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def details_update(self, entity_id, details,"},{"line_number":45,"context_line":"                       delete_existing):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_40becd65","line":42,"in_reply_to":"bab921fb_24c65b68","updated":"2015-04-26 18:34:52.000000000","message":"+1","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"b7e842c7ee0c81d4564ac6c7be9e5dc3e8bfd669","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self.context \u003d context"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def details_get(self, entity_id, key, default):"},{"line_number":42,"context_line":"        raise NotImplementedError()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def details_update(self, entity_id, details,"},{"line_number":45,"context_line":"                       delete_existing):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_e2da814a","line":42,"in_reply_to":"bab921fb_24c65b68","updated":"2015-04-27 08:33:41.000000000","message":"Done","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"32640073212dea565b52ae17462b387a1c31e105","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class SqlStorageDriver(StorageDriver):"},{"line_number":53,"context_line":"    def __init__(self, context, backend_host):"},{"line_number":54,"context_line":"        super(SqlStorageDriver, self).__init__(context, backend_host)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def details_update(self, entity_id, details, delete_existing):"},{"line_number":57,"context_line":"        return db_api.driver_private_data_update("}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_64d0d31f","line":54,"updated":"2015-04-25 16:23:55.000000000","message":"Lines 53 and 54 are redundant.","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"b7e842c7ee0c81d4564ac6c7be9e5dc3e8bfd669","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class SqlStorageDriver(StorageDriver):"},{"line_number":53,"context_line":"    def __init__(self, context, backend_host):"},{"line_number":54,"context_line":"        super(SqlStorageDriver, self).__init__(context, backend_host)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def details_update(self, entity_id, details, delete_existing):"},{"line_number":57,"context_line":"        return db_api.driver_private_data_update("}],"source_content_type":"text/x-python","patch_set":2,"id":"bab921fb_02c1f553","line":54,"in_reply_to":"bab921fb_64d0d31f","updated":"2015-04-27 08:33:41.000000000","message":"Done","commit_id":"e1ac11d900040cd5f513343d8cfc6c07ca425e36"}],"manila/share/drivers_private_data.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"54c25ac20dfc34e4092538fb6c28de4cf5c81b66","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import abc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_e616d0a6","line":15,"updated":"2015-04-27 10:29:48.000000000","message":"Would be great to have here some docstring with general purpose. So, every developer opening this module will have exhaustive info.","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"80317bab9ace09000005227048084478291b395a","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import abc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_ec3b4f9b","line":15,"in_reply_to":"9abe1de1_e616d0a6","updated":"2015-04-27 13:14:39.000000000","message":"Done","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"54c25ac20dfc34e4092538fb6c28de4cf5c81b66","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    cfg.StrOpt("},{"line_number":28,"context_line":"        \u0027drivers_private_storage_class\u0027,"},{"line_number":29,"context_line":"        default\u003d\u0027manila.share.drivers_private_data.SqlStorageDriver\u0027,"},{"line_number":30,"context_line":"        help\u003d\u0027The full class name of the Storage Driver class to use.\u0027),"},{"line_number":31,"context_line":"]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_a62a182b","line":30,"updated":"2015-04-27 10:29:48.000000000","message":"Can you please replace \"storage\" with something similar that you used in migration? Word \"Storage\" is ambiguous here.","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"80317bab9ace09000005227048084478291b395a","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    cfg.StrOpt("},{"line_number":28,"context_line":"        \u0027drivers_private_storage_class\u0027,"},{"line_number":29,"context_line":"        default\u003d\u0027manila.share.drivers_private_data.SqlStorageDriver\u0027,"},{"line_number":30,"context_line":"        help\u003d\u0027The full class name of the Storage Driver class to use.\u0027),"},{"line_number":31,"context_line":"]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_2c69478c","line":30,"in_reply_to":"9abe1de1_a62a182b","updated":"2015-04-27 13:14:39.000000000","message":"Done","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"54c25ac20dfc34e4092538fb6c28de4cf5c81b66","unresolved":false,"context_lines":[{"line_number":37,"context_line":"class StorageDriver(object):"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def __init__(self, context, backend_host):"},{"line_number":40,"context_line":"        # Backend cannot access data stored by another backend"},{"line_number":41,"context_line":"        self.backend_host \u003d backend_host"},{"line_number":42,"context_line":"        self.context \u003d context"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_a6e1f800","line":40,"updated":"2015-04-27 10:29:48.000000000","message":"s/cannot/should not/ ?","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"80317bab9ace09000005227048084478291b395a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"class StorageDriver(object):"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def __init__(self, context, backend_host):"},{"line_number":40,"context_line":"        # Backend cannot access data stored by another backend"},{"line_number":41,"context_line":"        self.backend_host \u003d backend_host"},{"line_number":42,"context_line":"        self.context \u003d context"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_8cf973cb","line":40,"in_reply_to":"9abe1de1_a6e1f800","updated":"2015-04-27 13:14:39.000000000","message":"Done","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"54c25ac20dfc34e4092538fb6c28de4cf5c81b66","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @abc.abstractmethod"},{"line_number":45,"context_line":"    def get(self, entity_id, key, default):"},{"line_number":46,"context_line":"        pass"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @abc.abstractmethod"},{"line_number":49,"context_line":"    def update(self, entity_id, details, delete_existing):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_86cef481","line":46,"updated":"2015-04-27 10:29:48.000000000","message":"Better to add here some doc string with useful description and remove \"pass\".","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"80317bab9ace09000005227048084478291b395a","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @abc.abstractmethod"},{"line_number":45,"context_line":"    def get(self, entity_id, key, default):"},{"line_number":46,"context_line":"        pass"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @abc.abstractmethod"},{"line_number":49,"context_line":"    def update(self, entity_id, details, delete_existing):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_83e4a10d","line":46,"in_reply_to":"9abe1de1_86cef481","updated":"2015-04-27 13:14:39.000000000","message":"Done","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"54c25ac20dfc34e4092538fb6c28de4cf5c81b66","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @abc.abstractmethod"},{"line_number":49,"context_line":"    def update(self, entity_id, details, delete_existing):"},{"line_number":50,"context_line":"        pass"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @abc.abstractmethod"},{"line_number":53,"context_line":"    def delete(self, entity_id, key):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_66cbe073","line":50,"updated":"2015-04-27 10:29:48.000000000","message":"ditto","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"80317bab9ace09000005227048084478291b395a","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @abc.abstractmethod"},{"line_number":49,"context_line":"    def update(self, entity_id, details, delete_existing):"},{"line_number":50,"context_line":"        pass"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @abc.abstractmethod"},{"line_number":53,"context_line":"    def delete(self, entity_id, key):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_63f18dcd","line":50,"in_reply_to":"9abe1de1_66cbe073","updated":"2015-04-27 13:14:39.000000000","message":"Done","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"54c25ac20dfc34e4092538fb6c28de4cf5c81b66","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @abc.abstractmethod"},{"line_number":53,"context_line":"    def delete(self, entity_id, key):"},{"line_number":54,"context_line":"        pass"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class SqlStorageDriver(StorageDriver):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_46c8dc74","line":54,"updated":"2015-04-27 10:29:48.000000000","message":"ditto","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"80317bab9ace09000005227048084478291b395a","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @abc.abstractmethod"},{"line_number":53,"context_line":"    def delete(self, entity_id, key):"},{"line_number":54,"context_line":"        pass"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class SqlStorageDriver(StorageDriver):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_43ee89ed","line":54,"in_reply_to":"9abe1de1_46c8dc74","updated":"2015-04-27 13:14:39.000000000","message":"Done","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"54c25ac20dfc34e4092538fb6c28de4cf5c81b66","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"class DriverPrivateData(object):"},{"line_number":77,"context_line":"    def __init__(self, storage\u003dNone, *args, **kwargs):"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        config_group_name \u003d kwargs.get(\u0027config_group\u0027)"},{"line_number":80,"context_line":"        CONF.register_opts(private_data_opts, group\u003dconfig_group_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_c6818cfd","line":77,"updated":"2015-04-27 10:29:48.000000000","message":"What \"args\" and \"kwargs\" are expected here? Please, add these to docstring.","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"80317bab9ace09000005227048084478291b395a","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"class DriverPrivateData(object):"},{"line_number":77,"context_line":"    def __init__(self, storage\u003dNone, *args, **kwargs):"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        config_group_name \u003d kwargs.get(\u0027config_group\u0027)"},{"line_number":80,"context_line":"        CONF.register_opts(private_data_opts, group\u003dconfig_group_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_e3b35d09","line":77,"in_reply_to":"9abe1de1_c6818cfd","updated":"2015-04-27 13:14:39.000000000","message":"Done","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"f60a0b0b573cbeec0a993a247df69a56a6db8863","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        :param storage: None or inheritor of StorageDriver abstract class"},{"line_number":86,"context_line":"        :param args: expected args: None"},{"line_number":87,"context_line":"        :param kwargs: expected kwargs:"},{"line_number":88,"context_line":"                        - config_group - Config group used for loading settings"},{"line_number":89,"context_line":"                        - context - Current context"},{"line_number":90,"context_line":"                        - backend_host - Driver host"},{"line_number":91,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_73ab7c8a","line":88,"updated":"2015-04-29 12:19:38.000000000","message":"Better to rewrite it, for example:\n\n\"\"\"\n\n:param storage: None or inheritor of StorageDriver abstract class\n\n:param config_group: text -- Config group used for loading settings\n\n:param context: Current context\n\n:param backend_host: text -- Driver host\n\n\"\"\"","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"fdbe2973150c6b49559c0a9c864db920b1b1a046","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        :param storage: None or inheritor of StorageDriver abstract class"},{"line_number":86,"context_line":"        :param args: expected args: None"},{"line_number":87,"context_line":"        :param kwargs: expected kwargs:"},{"line_number":88,"context_line":"                        - config_group - Config group used for loading settings"},{"line_number":89,"context_line":"                        - context - Current context"},{"line_number":90,"context_line":"                        - backend_host - Driver host"},{"line_number":91,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_a21adb6c","line":88,"in_reply_to":"5ad0253b_73ab7c8a","updated":"2015-04-29 12:55:03.000000000","message":"Done","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"89a32551d2aaf377aeb1e4bda33959311faec6e8","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        else:"},{"line_number":99,"context_line":"            storage_class \u003d CONF.drivers_private_storage_class"},{"line_number":100,"context_line":"            cls \u003d importutils.import_class(storage_class)"},{"line_number":101,"context_line":"            self._storage \u003d cls(kwargs[\u0027context\u0027], kwargs[\u0027backend_host\u0027])"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def get(self, entity_id, key\u003dNone, default\u003dNone):"},{"line_number":104,"context_line":"        \"\"\"Get value for specified key or get all key-value pairs."}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_d3eff0ae","line":101,"updated":"2015-04-29 12:20:10.000000000","message":"Presence of \"context\" and \"backend_host\" is not verified. So, you can get here AttributeError.","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"fdbe2973150c6b49559c0a9c864db920b1b1a046","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        else:"},{"line_number":99,"context_line":"            storage_class \u003d CONF.drivers_private_storage_class"},{"line_number":100,"context_line":"            cls \u003d importutils.import_class(storage_class)"},{"line_number":101,"context_line":"            self._storage \u003d cls(kwargs[\u0027context\u0027], kwargs[\u0027backend_host\u0027])"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def get(self, entity_id, key\u003dNone, default\u003dNone):"},{"line_number":104,"context_line":"        \"\"\"Get value for specified key or get all key-value pairs."}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_622ba383","line":101,"in_reply_to":"5ad0253b_d3eff0ae","updated":"2015-04-29 12:55:03.000000000","message":"Done","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"f60a0b0b573cbeec0a993a247df69a56a6db8863","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        :param entity_id: Model UUID"},{"line_number":107,"context_line":"        :param key: Key string"},{"line_number":108,"context_line":"        :param default: Default value for case when key(s) not found"},{"line_number":109,"context_line":"        :return: string or dict"},{"line_number":110,"context_line":"        \"\"\""},{"line_number":111,"context_line":"        self._validate_entity_id(entity_id)"},{"line_number":112,"context_line":"        return self._storage.get(entity_id, key, default)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_b388f423","line":109,"updated":"2015-04-29 12:19:38.000000000","message":"s/return/returns/ ?","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"fdbe2973150c6b49559c0a9c864db920b1b1a046","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        :param entity_id: Model UUID"},{"line_number":107,"context_line":"        :param key: Key string"},{"line_number":108,"context_line":"        :param default: Default value for case when key(s) not found"},{"line_number":109,"context_line":"        :return: string or dict"},{"line_number":110,"context_line":"        \"\"\""},{"line_number":111,"context_line":"        self._validate_entity_id(entity_id)"},{"line_number":112,"context_line":"        return self._storage.get(entity_id, key, default)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_4220a79b","line":109,"in_reply_to":"5ad0253b_b388f423","updated":"2015-04-29 12:55:03.000000000","message":"Done","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":7652,"name":"Luis Pabón","email":"lpabon@gmail.com","username":"lpabon"},"change_message_id":"0ee4e206a8b57082d37add3ea349360b39cdf05c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        return self._storage.get(entity_id, key, default)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def update(self, entity_id, details, delete_existing\u003dFalse):"},{"line_number":115,"context_line":"        \"\"\"Update specified key-value pairs."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        :param entity_id: Model UUID"},{"line_number":118,"context_line":"        :param details: dict with key-value pairs data"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_3d04c17c","line":115,"updated":"2015-04-29 02:30:08.000000000","message":"I think the docstring should say \"Update or create specified...\" - Just a suggestion.","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"9865dfe60e9c7b7eae2ed3208a9858ca6e94b435","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        return self._storage.get(entity_id, key, default)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def update(self, entity_id, details, delete_existing\u003dFalse):"},{"line_number":115,"context_line":"        \"\"\"Update specified key-value pairs."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        :param entity_id: Model UUID"},{"line_number":118,"context_line":"        :param details: dict with key-value pairs data"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_7d81198f","line":115,"in_reply_to":"5ad0253b_3d04c17c","updated":"2015-04-29 03:11:40.000000000","message":"+1\n\nUsing the Create/Retrieve/Update/Delete (CRUD) model, this method does both Create and Update, so the docstring should make that clear.","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"fdbe2973150c6b49559c0a9c864db920b1b1a046","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        return self._storage.get(entity_id, key, default)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def update(self, entity_id, details, delete_existing\u003dFalse):"},{"line_number":115,"context_line":"        \"\"\"Update specified key-value pairs."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        :param entity_id: Model UUID"},{"line_number":118,"context_line":"        :param details: dict with key-value pairs data"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_225c8b24","line":115,"in_reply_to":"5ad0253b_3d04c17c","updated":"2015-04-29 12:55:03.000000000","message":"Done","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"f60a0b0b573cbeec0a993a247df69a56a6db8863","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        return self._storage.get(entity_id, key, default)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def update(self, entity_id, details, delete_existing\u003dFalse):"},{"line_number":115,"context_line":"        \"\"\"Update specified key-value pairs."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        :param entity_id: Model UUID"},{"line_number":118,"context_line":"        :param details: dict with key-value pairs data"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_337d041d","line":115,"in_reply_to":"5ad0253b_7d81198f","updated":"2015-04-29 12:19:38.000000000","message":"+1","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"f60a0b0b573cbeec0a993a247df69a56a6db8863","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            entity_id, details, delete_existing)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def delete(self, entity_id, key\u003dNone):"},{"line_number":135,"context_line":"        \"\"\"Delete value for specified key or delete all key-value pairs."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        :param entity_id: Model UUID"},{"line_number":138,"context_line":"        :param key: Key string"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_b38fd422","line":135,"updated":"2015-04-29 12:19:38.000000000","message":"Second word \"delete\" is redundant, how do you think?","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":11047,"name":"Mark Sturdevant","email":"mark.sturdevant@ibm.com","username":"markstur"},"change_message_id":"bff6c1d5945eb72e28d0e8c086756bde874e1062","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            msg \u003d (_(\"Provided entity_id %s is not valid UUID.\")"},{"line_number":154,"context_line":"                   % six.text_type(entity_id))"},{"line_number":155,"context_line":"            raise ValueError(msg)"},{"line_number":156,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":7,"id":"3acd31a7_76ba280c","line":156,"updated":"2015-05-01 04:18:23.000000000","message":"return True isn\u0027t being used by any callers.","commit_id":"6a2911851dd6be0955f8341724ab9a0f6caff8fe"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"5199d36cd66bdc5e823e67f4f856bc9ee5006354","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            msg \u003d (_(\"Provided entity_id %s is not valid UUID.\")"},{"line_number":154,"context_line":"                   % six.text_type(entity_id))"},{"line_number":155,"context_line":"            raise ValueError(msg)"},{"line_number":156,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":7,"id":"3acd31a7_9f8fcd29","line":156,"in_reply_to":"3acd31a7_76ba280c","updated":"2015-05-05 11:02:30.000000000","message":"Done","commit_id":"6a2911851dd6be0955f8341724ab9a0f6caff8fe"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"5c6d73402092ac9e60ffe159864b7f86096d251a","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from manila.db import api as db_api"},{"line_number":29,"context_line":"from manila.i18n import _"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"private_data_opts \u003d ["},{"line_number":32,"context_line":"    cfg.StrOpt("},{"line_number":33,"context_line":"        \u0027drivers_private_storage_class\u0027,"},{"line_number":34,"context_line":"        default\u003d\u0027manila.share.drivers_private_data.SqlStorageDriver\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aca2d91_cec4f993","line":31,"updated":"2015-05-06 11:45:39.000000000","message":"This needs to be included in manila/opts.py so the config generator includes this option.","commit_id":"d37a9726caaba821e55e5a260f3554d986a3dcff"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"96669fd402ebbf875ffab2f9b5542547d11053a4","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from manila.db import api as db_api"},{"line_number":29,"context_line":"from manila.i18n import _"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"private_data_opts \u003d ["},{"line_number":32,"context_line":"    cfg.StrOpt("},{"line_number":33,"context_line":"        \u0027drivers_private_storage_class\u0027,"},{"line_number":34,"context_line":"        default\u003d\u0027manila.share.drivers_private_data.SqlStorageDriver\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aca2d91_30d71625","line":31,"in_reply_to":"1aca2d91_cec4f993","updated":"2015-05-07 12:59:46.000000000","message":"Done","commit_id":"d37a9726caaba821e55e5a260f3554d986a3dcff"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"873cd2e3c5d71862461c36e9dc9755b8aca3bd07","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        \"\"\"Update or create specified key-value pairs."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        :param entity_id: Model UUID"},{"line_number":125,"context_line":"        :param details: dict with key-value pairs data"},{"line_number":126,"context_line":"        :param delete_existing: boolean flag which determines behaviour"},{"line_number":127,"context_line":"                                for existing key-value pairs:"},{"line_number":128,"context_line":"                                True - remove all existing key-value pairs"}],"source_content_type":"text/x-python","patch_set":9,"id":"1aca2d91_9e86d863","line":125,"updated":"2015-05-08 07:43:45.000000000","message":"key and value must be strings. should be mentioned here","commit_id":"ff38a3de7ef228305a7ab647a5efadbfc5df64d7"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"c470e0b8bff05f07845fe94716b409044bae2f49","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        \"\"\"Update or create specified key-value pairs."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        :param entity_id: Model UUID"},{"line_number":125,"context_line":"        :param details: dict with key-value pairs data"},{"line_number":126,"context_line":"        :param delete_existing: boolean flag which determines behaviour"},{"line_number":127,"context_line":"                                for existing key-value pairs:"},{"line_number":128,"context_line":"                                True - remove all existing key-value pairs"}],"source_content_type":"text/x-python","patch_set":9,"id":"1aca2d91_37c12781","line":125,"in_reply_to":"1aca2d91_9e86d863","updated":"2015-05-08 09:19:59.000000000","message":"Done","commit_id":"ff38a3de7ef228305a7ab647a5efadbfc5df64d7"},{"author":{"_account_id":7102,"name":"Thomas Bechtold","email":"thomas.bechtold@chainguard.dev","username":"toabctl"},"change_message_id":"873cd2e3c5d71862461c36e9dc9755b8aca3bd07","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            msg \u003d (_(\"Provided details %s is not valid dict.\")"},{"line_number":135,"context_line":"                   % six.text_type(details))"},{"line_number":136,"context_line":"            raise ValueError(msg)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        return self._storage.update("},{"line_number":139,"context_line":"            entity_id, details, delete_existing)"},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1aca2d91_be2754b5","line":137,"updated":"2015-05-08 07:43:45.000000000","message":"What about validation for the details? key and value must be both strings according to the database model.","commit_id":"ff38a3de7ef228305a7ab647a5efadbfc5df64d7"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"c470e0b8bff05f07845fe94716b409044bae2f49","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            msg \u003d (_(\"Provided details %s is not valid dict.\")"},{"line_number":135,"context_line":"                   % six.text_type(details))"},{"line_number":136,"context_line":"            raise ValueError(msg)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        return self._storage.update("},{"line_number":139,"context_line":"            entity_id, details, delete_existing)"},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1aca2d91_17f3cbd7","line":137,"in_reply_to":"1aca2d91_be2754b5","updated":"2015-05-08 09:19:59.000000000","message":"I don\u0027t like the idea to add here strict type validation because drivers can pass booleans or integers without any harm. Furthermore mentioned limitation is the limitation of the current implementation of SqlStorageDriver, which could be changed in future (especially after migration to Versioned Objects).","commit_id":"ff38a3de7ef228305a7ab647a5efadbfc5df64d7"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ebc77e2845bdafe7c479ca8867282fb08a824500","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @abc.abstractmethod"},{"line_number":50,"context_line":"    def get(self, entity_id, key, default):"},{"line_number":51,"context_line":"        \"\"\"See DriverPrivateData.get() method for more details.\"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @abc.abstractmethod"},{"line_number":54,"context_line":"    def update(self, entity_id, details, delete_existing):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9af37de9_496c859c","line":51,"updated":"2015-05-10 15:04:07.000000000","message":"Docstring in the base class should explain briefly what this method is about and how derived classes should implement this. You can still use DriverPrivateData as an example.","commit_id":"d894ab165b054813175f08bb4ce0531f319c461d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"332a0f93a42c7cc0062a3bf495fdc9cf528aae02","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @abc.abstractmethod"},{"line_number":50,"context_line":"    def get(self, entity_id, key, default):"},{"line_number":51,"context_line":"        \"\"\"See DriverPrivateData.get() method for more details.\"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @abc.abstractmethod"},{"line_number":54,"context_line":"    def update(self, entity_id, details, delete_existing):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a0c5dc1_334d2673","line":51,"in_reply_to":"9af37de9_496c859c","updated":"2015-05-12 12:52:41.000000000","message":"Done","commit_id":"d894ab165b054813175f08bb4ce0531f319c461d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ebc77e2845bdafe7c479ca8867282fb08a824500","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @abc.abstractmethod"},{"line_number":54,"context_line":"    def update(self, entity_id, details, delete_existing):"},{"line_number":55,"context_line":"        \"\"\"See DriverPrivateData.update() method for more details.\"\"\""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @abc.abstractmethod"},{"line_number":58,"context_line":"    def delete(self, entity_id, key):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9af37de9_09055dc1","line":55,"updated":"2015-05-10 15:04:07.000000000","message":"Same.","commit_id":"d894ab165b054813175f08bb4ce0531f319c461d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"332a0f93a42c7cc0062a3bf495fdc9cf528aae02","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @abc.abstractmethod"},{"line_number":54,"context_line":"    def update(self, entity_id, details, delete_existing):"},{"line_number":55,"context_line":"        \"\"\"See DriverPrivateData.update() method for more details.\"\"\""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @abc.abstractmethod"},{"line_number":58,"context_line":"    def delete(self, entity_id, key):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a0c5dc1_13522214","line":55,"in_reply_to":"9af37de9_09055dc1","updated":"2015-05-12 12:52:41.000000000","message":"Done","commit_id":"d894ab165b054813175f08bb4ce0531f319c461d"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ebc77e2845bdafe7c479ca8867282fb08a824500","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @abc.abstractmethod"},{"line_number":58,"context_line":"    def delete(self, entity_id, key):"},{"line_number":59,"context_line":"        \"\"\"See DriverPrivateData.delete() method for more details.\"\"\""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"class SqlStorageDriver(StorageDriver):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9af37de9_e909f9de","line":59,"updated":"2015-05-10 15:04:07.000000000","message":"Same.","commit_id":"d894ab165b054813175f08bb4ce0531f319c461d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"332a0f93a42c7cc0062a3bf495fdc9cf528aae02","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @abc.abstractmethod"},{"line_number":58,"context_line":"    def delete(self, entity_id, key):"},{"line_number":59,"context_line":"        \"\"\"See DriverPrivateData.delete() method for more details.\"\"\""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"class SqlStorageDriver(StorageDriver):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a0c5dc1_f3566e05","line":59,"in_reply_to":"9af37de9_e909f9de","updated":"2015-05-12 12:52:41.000000000","message":"Done","commit_id":"d894ab165b054813175f08bb4ce0531f319c461d"}],"manila/share/manager.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"f60a0b0b573cbeec0a993a247df69a56a6db8863","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":117,"context_line":"        private_storage \u003d drivers_private_data.DriverPrivateData("},{"line_number":118,"context_line":"            context\u003dctxt, backend_host\u003dself.host)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        self.driver \u003d importutils.import_object("},{"line_number":121,"context_line":"            share_driver, private_storage, configuration\u003dself.configuration)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_f3db0c1a","line":118,"updated":"2015-04-29 12:19:38.000000000","message":"+ config_group\u003dservice_name","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"bed9689fbadd4dcf89546e24a1552015779485ca","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":117,"context_line":"        private_storage \u003d drivers_private_data.DriverPrivateData("},{"line_number":118,"context_line":"            context\u003dctxt, backend_host\u003dself.host)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        self.driver \u003d importutils.import_object("},{"line_number":121,"context_line":"            share_driver, private_storage, configuration\u003dself.configuration)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ad0253b_58309856","line":118,"in_reply_to":"5ad0253b_f3db0c1a","updated":"2015-04-29 13:45:37.000000000","message":"Done","commit_id":"936dfce16d14e3aee24d5d99403eb97afd65d219"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"864c9dba6634d50b8f1dab53196202bf4331ee6a","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":117,"context_line":"        private_storage \u003d drivers_private_data.DriverPrivateData("},{"line_number":118,"context_line":"            context\u003dctxt, backend_host\u003dself.host,"},{"line_number":119,"context_line":"            config_group\u003dself.service_name"},{"line_number":120,"context_line":"        )"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        self.driver \u003d importutils.import_object("}],"source_content_type":"text/x-python","patch_set":11,"id":"1aca2d91_ed688089","line":119,"updated":"2015-05-08 10:22:53.000000000","message":"\"self.service_name\" is incorrect to use here. It is also different than arg \"service_name\".\n\nNeed to set here \"self.configuration.config_group\":\n\n\"\"\"\n\nprivate_storage \u003d drivers_private_data.DriverPrivateData(\n\n    context\u003dctxt,\n\n    backend_host\u003dself.host,\n\n    config_group\u003dself.configuration.config_group)\n\n\"\"\"","commit_id":"f2bd6d27d29520a61841424cc1edac6dae3bf41d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"ab017a680114b9447ca8949409e8eead1c53dd85","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":117,"context_line":"        private_storage \u003d drivers_private_data.DriverPrivateData("},{"line_number":118,"context_line":"            context\u003dctxt, backend_host\u003dself.host,"},{"line_number":119,"context_line":"            config_group\u003dself.service_name"},{"line_number":120,"context_line":"        )"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        self.driver \u003d importutils.import_object("}],"source_content_type":"text/x-python","patch_set":11,"id":"1aca2d91_8d10ec02","line":119,"in_reply_to":"1aca2d91_ed688089","updated":"2015-05-08 10:23:43.000000000","message":"Also, this change is not covered with tests at all.","commit_id":"f2bd6d27d29520a61841424cc1edac6dae3bf41d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"9e038c2073db657b1a44b81e569983a48fdf8ec9","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":117,"context_line":"        private_storage \u003d drivers_private_data.DriverPrivateData("},{"line_number":118,"context_line":"            context\u003dctxt, backend_host\u003dself.host,"},{"line_number":119,"context_line":"            config_group\u003dself.service_name"},{"line_number":120,"context_line":"        )"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        self.driver \u003d importutils.import_object("}],"source_content_type":"text/x-python","patch_set":11,"id":"1aca2d91_515caeec","line":119,"in_reply_to":"1aca2d91_ed688089","updated":"2015-05-08 11:03:30.000000000","message":"Done","commit_id":"f2bd6d27d29520a61841424cc1edac6dae3bf41d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"98ed4bd236dad029011b4526a01a1bdc435df8f3","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        )"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        self.driver \u003d importutils.import_object("},{"line_number":123,"context_line":"            share_driver, private_storage, configuration\u003dself.configuration)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _ensure_share_has_pool(self, ctxt, share):"},{"line_number":126,"context_line":"        pool \u003d share_utils.extract_host(share[\u0027host\u0027], \u0027pool\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_b469f727","line":123,"updated":"2015-05-26 13:49:04.000000000","message":"Please, provide \"private_storage\" as named argument in the same way as \"configuration\".","commit_id":"63953878a4c6d39eab8d4f7200a889b5722f3b30"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"2389e036bb0d3316af3517ebf09c7da139221269","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        )"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        self.driver \u003d importutils.import_object("},{"line_number":123,"context_line":"            share_driver, private_storage, configuration\u003dself.configuration)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _ensure_share_has_pool(self, ctxt, share):"},{"line_number":126,"context_line":"        pool \u003d share_utils.extract_host(share[\u0027host\u0027], \u0027pool\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a016987_a573ffe6","line":123,"in_reply_to":"7a016987_b469f727","updated":"2015-05-26 14:58:34.000000000","message":"Done","commit_id":"63953878a4c6d39eab8d4f7200a889b5722f3b30"}],"manila/tests/fake_volume.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"54c25ac20dfc34e4092538fb6c28de4cf5c81b66","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class API(object):"},{"line_number":48,"context_line":"    \"\"\"Fake Volume API.\"\"\""},{"line_number":49,"context_line":"    def get(self, *args, **kwargs):"},{"line_number":50,"context_line":"        pass"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def create_snapshot_force(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_a6b458d1","line":49,"updated":"2015-04-27 10:29:48.000000000","message":"I guess this change related to dependent commit with update of generic driver.","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"80317bab9ace09000005227048084478291b395a","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class API(object):"},{"line_number":48,"context_line":"    \"\"\"Fake Volume API.\"\"\""},{"line_number":49,"context_line":"    def get(self, *args, **kwargs):"},{"line_number":50,"context_line":"        pass"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def create_snapshot_force(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_d4392d43","line":49,"in_reply_to":"9abe1de1_a6b458d1","updated":"2015-04-27 13:14:39.000000000","message":"Done","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"}],"manila/tests/share/test_drivers_private_data.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"54c25ac20dfc34e4092538fb6c28de4cf5c81b66","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"@ddt.ddt"},{"line_number":25,"context_line":"class DriverPrivateDataTestCase(test.TestCase):"},{"line_number":26,"context_line":"    \"\"\"Tests GenericShareDriver.\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def setUp(self):"},{"line_number":29,"context_line":"        super(DriverPrivateDataTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_a6eb38b0","line":26,"updated":"2015-04-27 10:29:48.000000000","message":"\"Tests GenericShareDriver.\"?","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"80317bab9ace09000005227048084478291b395a","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"@ddt.ddt"},{"line_number":25,"context_line":"class DriverPrivateDataTestCase(test.TestCase):"},{"line_number":26,"context_line":"    \"\"\"Tests GenericShareDriver.\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def setUp(self):"},{"line_number":29,"context_line":"        super(DriverPrivateDataTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abe1de1_63762d40","line":26,"in_reply_to":"9abe1de1_a6eb38b0","updated":"2015-04-27 13:14:39.000000000","message":"Done","commit_id":"66080504f1456df5b71216d1847cd291f227c97d"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"51152fecbbe914c78200fc37b6f0c705c9402116","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        self.assertEqual(private_data._storage, self.fake_storage)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def test_invalid_parameters(self):"},{"line_number":46,"context_line":"        self.assertRaises(ValueError, pd.DriverPrivateData)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @ddt.data(\"111\", [\"fake\"], None)"},{"line_number":49,"context_line":"    def test_validate_entity_id_invalid(self, entity_id):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_fa9421e9","line":46,"updated":"2015-04-29 14:45:37.000000000","message":"Cases when only \"context\" or \"backend_host\" are provided?","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"472907879859362717166fd712295728410b8264","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        self.assertEqual(private_data._storage, self.fake_storage)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def test_invalid_parameters(self):"},{"line_number":46,"context_line":"        self.assertRaises(ValueError, pd.DriverPrivateData)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @ddt.data(\"111\", [\"fake\"], None)"},{"line_number":49,"context_line":"    def test_validate_entity_id_invalid(self, entity_id):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3acd31a7_2126d0ce","line":46,"in_reply_to":"3acd31a7_fa9421e9","updated":"2015-04-30 09:30:15.000000000","message":"Done","commit_id":"ebbe50505e46a100abb32adea170d98829729127"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"afe29df4080419486d4b80e11b266fc567b199d6","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def test_invalid_parameters(self):"},{"line_number":46,"context_line":"        self.assertRaises(ValueError, pd.DriverPrivateData)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @ddt.data({\u0027context\u0027: \u0027fake\u0027}, {\u0027backend\u0027: \u0027fake\u0027})"},{"line_number":49,"context_line":"    def test_invalid_single_parameter(self, test_args):"},{"line_number":50,"context_line":"        self.assertRaises(ValueError, pd.DriverPrivateData, **test_args)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3acd31a7_ec90cf97","line":48,"updated":"2015-04-30 09:37:29.000000000","message":"pd.DriverPrivateData expects \"backend_host\" and not \"backend\".","commit_id":"6a2911851dd6be0955f8341724ab9a0f6caff8fe"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"5199d36cd66bdc5e823e67f4f856bc9ee5006354","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def test_invalid_parameters(self):"},{"line_number":46,"context_line":"        self.assertRaises(ValueError, pd.DriverPrivateData)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @ddt.data({\u0027context\u0027: \u0027fake\u0027}, {\u0027backend\u0027: \u0027fake\u0027})"},{"line_number":49,"context_line":"    def test_invalid_single_parameter(self, test_args):"},{"line_number":50,"context_line":"        self.assertRaises(ValueError, pd.DriverPrivateData, **test_args)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3acd31a7_3ffb197b","line":48,"in_reply_to":"3acd31a7_ec90cf97","updated":"2015-05-05 11:02:30.000000000","message":"Done","commit_id":"6a2911851dd6be0955f8341724ab9a0f6caff8fe"},{"author":{"_account_id":11047,"name":"Mark Sturdevant","email":"mark.sturdevant@ibm.com","username":"markstur"},"change_message_id":"bff6c1d5945eb72e28d0e8c086756bde874e1062","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def test_invalid_parameters(self):"},{"line_number":46,"context_line":"        self.assertRaises(ValueError, pd.DriverPrivateData)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @ddt.data({\u0027context\u0027: \u0027fake\u0027}, {\u0027backend\u0027: \u0027fake\u0027})"},{"line_number":49,"context_line":"    def test_invalid_single_parameter(self, test_args):"},{"line_number":50,"context_line":"        self.assertRaises(ValueError, pd.DriverPrivateData, **test_args)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3acd31a7_f612b808","line":48,"in_reply_to":"3acd31a7_ec90cf97","updated":"2015-05-01 04:18:23.000000000","message":"agree.  Please fix.","commit_id":"6a2911851dd6be0955f8341724ab9a0f6caff8fe"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"5fc593e69bdf9516ba0ca51dd4f50039d35d849e","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            pd.DriverPrivateData._validate_entity_id(self.entity_id)"},{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        self.assertEqual(None, actual_result)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_update(self):"},{"line_number":66,"context_line":"        data \u003d pd.DriverPrivateData(storage\u003dself.fake_storage)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aca2d91_5693f2a3","line":63,"updated":"2015-05-06 01:30:13.000000000","message":"You could also use:\n\nself.assertIsNone(actual_result)","commit_id":"d37a9726caaba821e55e5a260f3554d986a3dcff"},{"author":{"_account_id":14232,"name":"Igor Malinovskiy","email":"u.glide@gmail.com","username":"imalinovskiy"},"change_message_id":"96669fd402ebbf875ffab2f9b5542547d11053a4","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            pd.DriverPrivateData._validate_entity_id(self.entity_id)"},{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        self.assertEqual(None, actual_result)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def test_update(self):"},{"line_number":66,"context_line":"        data \u003d pd.DriverPrivateData(storage\u003dself.fake_storage)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aca2d91_b0ca066d","line":63,"in_reply_to":"1aca2d91_5693f2a3","updated":"2015-05-07 12:59:46.000000000","message":"Done","commit_id":"d37a9726caaba821e55e5a260f3554d986a3dcff"}]}
