)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2266a107a7e92163fdf785d3d4e128cc5e9061f1","unresolved":false,"context_lines":[{"line_number":10,"context_line":"(identified by assigned None tasks), as such instances have some"},{"line_number":11,"context_line":"kind of activity running, which requires communication between"},{"line_number":12,"context_line":"the instance and Trove service."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I64901fd27dc97de8ee5e3bc693ec966d4f1a3346"},{"line_number":15,"context_line":"Signed-off-by: Dariusz Krol \u003cd.krol@samsung.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"ffd0ebdf_a8948b8c","line":13,"updated":"2019-01-04 17:07:34.000000000","message":"Is there a specific change this refers to that has an upgrade release note? Typically upgrade status checks accompany some change which requires operators to take action before upgrading to a target release (stein in this case). So it would be good to have context here for what change is prompting the need for this upgrade check, especially when this change itself doesn\u0027t have a release note with it.","commit_id":"f883bcaceebd209db27aa5a69d5880b8a5a1c213"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"5b1e4742b096773d439dc11f9721ca56c12536ca","unresolved":false,"context_lines":[{"line_number":10,"context_line":"(identified by assigned None tasks), as such instances have some"},{"line_number":11,"context_line":"kind of activity running, which requires communication between"},{"line_number":12,"context_line":"the instance and Trove service."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I64901fd27dc97de8ee5e3bc693ec966d4f1a3346"},{"line_number":15,"context_line":"Signed-off-by: Dariusz Krol \u003cd.krol@samsung.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"dfd5e7cf_a047e4bc","line":13,"in_reply_to":"ffd0ebdf_a8948b8c","updated":"2019-01-05 22:20:42.000000000","message":"Thanks for asking. There was no specific change I can refer to. There was no previous checks in trove before executing an upgrade to my best knowledge. Based on my experience, I\u0027m suggesting to let admin know that it is not recommended to do any upgrade until trove instances are in a \"stable\" state.","commit_id":"f883bcaceebd209db27aa5a69d5880b8a5a1c213"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Dariusz Krol \u003cd.krol@samsung.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-01-08 21:30:00 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add upgrade status check"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds checks for Trove instances in other states than Active"},{"line_number":10,"context_line":"(identified by assigned None tasks), as such instances have some"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"dfd5e7cf_5a957be3","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":24},"updated":"2019-01-09 22:46:20.000000000","message":"In my opinion the title is too generic and should include check name.","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Dariusz Krol \u003cd.krol@samsung.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-01-08 21:30:00 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add upgrade status check"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds checks for Trove instances in other states than Active"},{"line_number":10,"context_line":"(identified by assigned None tasks), as such instances have some"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"bfdaf3ff_362ca046","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":24},"in_reply_to":"dfd5e7cf_5a957be3","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add upgrade status check"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds checks for Trove instances in other states than Active"},{"line_number":10,"context_line":"(identified by assigned None tasks), as such instances have some"},{"line_number":11,"context_line":"kind of activity running, which requires communication between"},{"line_number":12,"context_line":"the instance and Trove service."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"dfd5e7cf_baf82749","line":9,"range":{"start_line":9,"start_character":5,"end_line":9,"end_character":20},"updated":"2019-01-09 22:46:20.000000000","message":"detects all Trove instances","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This adds checks for Trove instances in other states than Active"},{"line_number":10,"context_line":"(identified by assigned None tasks), as such instances have some"},{"line_number":11,"context_line":"kind of activity running, which requires communication between"},{"line_number":12,"context_line":"the instance and Trove service."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I64901fd27dc97de8ee5e3bc693ec966d4f1a3346"},{"line_number":15,"context_line":"Signed-off-by: Dariusz Krol \u003cd.krol@samsung.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"dfd5e7cf_fafeaf36","line":12,"range":{"start_line":12,"start_character":23,"end_line":12,"end_character":30},"updated":"2019-01-09 22:46:20.000000000","message":"\"services\" or \"control plane\"","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"}],"doc/source/cli/trove-status.rst":[{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":74,"context_line":"  **History of Checks**"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"  **11.0.0 (Stein)**"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"  * Checks if any trove instance with assigned task is running."},{"line_number":79,"context_line":"    Upgrade should be postponed until all instances are in the Active state."}],"source_content_type":"text/x-rst","patch_set":6,"id":"dfd5e7cf_3aa2f74c","line":77,"updated":"2019-01-09 22:46:20.000000000","message":"Optional: describe motivation of the check.","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":74,"context_line":"  **History of Checks**"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"  **11.0.0 (Stein)**"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"  * Checks if any trove instance with assigned task is running."},{"line_number":79,"context_line":"    Upgrade should be postponed until all instances are in the Active state."}],"source_content_type":"text/x-rst","patch_set":6,"id":"bfdaf3ff_b6fe50ac","line":77,"in_reply_to":"dfd5e7cf_3aa2f74c","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"  **11.0.0 (Stein)**"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"  * Checks if any trove instance with assigned task is running."},{"line_number":79,"context_line":"    Upgrade should be postponed until all instances are in the Active state."}],"source_content_type":"text/x-rst","patch_set":6,"id":"dfd5e7cf_7a987f1a","line":78,"range":{"start_line":78,"start_character":18,"end_line":78,"end_character":23},"updated":"2019-01-09 22:46:20.000000000","message":"Trove","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"  **11.0.0 (Stein)**"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"  * Checks if any trove instance with assigned task is running."},{"line_number":79,"context_line":"    Upgrade should be postponed until all instances are in the Active state."}],"source_content_type":"text/x-rst","patch_set":6,"id":"bfdaf3ff_16271c67","line":78,"range":{"start_line":78,"start_character":18,"end_line":78,"end_character":23},"in_reply_to":"dfd5e7cf_7a987f1a","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"d9fbc78c64f1a4abfefd1573c37ae5753526939c","unresolved":false,"context_lines":[{"line_number":76,"context_line":"  **11.0.0 (Stein)**"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"  * Checks if any Trove instance with assigned task is running."},{"line_number":79,"context_line":"    The assigned tasks may fail during the upgrade process due to transient unavailability of Trove control plane."},{"line_number":80,"context_line":"    Upgrade should be postponed until all instances are in the Active state."},{"line_number":81,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"bfdaf3ff_f5b7ced7","line":79,"updated":"2019-01-12 16:35:37.000000000","message":"The line is too long.","commit_id":"746724472b0e1680b45b39524a7d43c63af4c87c"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":76,"context_line":"  **11.0.0 (Stein)**"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"  * Checks if any Trove instance with assigned task is running."},{"line_number":79,"context_line":"    The assigned tasks may fail during the upgrade process due to transient unavailability of Trove control plane."},{"line_number":80,"context_line":"    Upgrade should be postponed until all instances are in the Active state."},{"line_number":81,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"bfdaf3ff_488387cd","line":79,"in_reply_to":"bfdaf3ff_f5b7ced7","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"746724472b0e1680b45b39524a7d43c63af4c87c"}],"trove/cmd/status.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2266a107a7e92163fdf785d3d4e128cc5e9061f1","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        \"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        db_api \u003d get_db_api()"},{"line_number":39,"context_line":"        db_api.configure_db(CONF)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        db_instances \u003d DBInstance.find_all().all()"},{"line_number":42,"context_line":"        for db in db_instances:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffd0ebdf_48bf1ffb","line":39,"range":{"start_line":39,"start_character":28,"end_line":39,"end_character":32},"updated":"2019-01-04 17:07:34.000000000","message":"Couldn\u0027t you just re-use cfg.CONF and avoid the new import?","commit_id":"f883bcaceebd209db27aa5a69d5880b8a5a1c213"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"5b1e4742b096773d439dc11f9721ca56c12536ca","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        \"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        db_api \u003d get_db_api()"},{"line_number":39,"context_line":"        db_api.configure_db(CONF)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        db_instances \u003d DBInstance.find_all().all()"},{"line_number":42,"context_line":"        for db in db_instances:"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfd5e7cf_c04468ba","line":39,"range":{"start_line":39,"start_character":28,"end_line":39,"end_character":32},"in_reply_to":"ffd0ebdf_48bf1ffb","updated":"2019-01-05 22:20:42.000000000","message":"Done","commit_id":"f883bcaceebd209db27aa5a69d5880b8a5a1c213"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2266a107a7e92163fdf785d3d4e128cc5e9061f1","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        db_api \u003d get_db_api()"},{"line_number":39,"context_line":"        db_api.configure_db(CONF)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        db_instances \u003d DBInstance.find_all().all()"},{"line_number":42,"context_line":"        for db in db_instances:"},{"line_number":43,"context_line":"            if db.task_status !\u003d InstanceTasks.NONE:"},{"line_number":44,"context_line":"                return upgradecheck.Result(upgradecheck.Code.WARNING)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffd0ebdf_a8700b74","line":41,"range":{"start_line":41,"start_character":8,"end_line":41,"end_character":50},"updated":"2019-01-04 17:07:34.000000000","message":"This could be optimized to just filter out instances that have task_states !\u003d NONE in the DB query couldn\u0027t it rather than filter in python?","commit_id":"f883bcaceebd209db27aa5a69d5880b8a5a1c213"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"5b1e4742b096773d439dc11f9721ca56c12536ca","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        db_api \u003d get_db_api()"},{"line_number":39,"context_line":"        db_api.configure_db(CONF)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        db_instances \u003d DBInstance.find_all().all()"},{"line_number":42,"context_line":"        for db in db_instances:"},{"line_number":43,"context_line":"            if db.task_status !\u003d InstanceTasks.NONE:"},{"line_number":44,"context_line":"                return upgradecheck.Result(upgradecheck.Code.WARNING)"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfd5e7cf_60133cba","line":41,"range":{"start_line":41,"start_character":8,"end_line":41,"end_character":50},"in_reply_to":"ffd0ebdf_a8700b74","updated":"2019-01-05 22:20:42.000000000","message":"I couldn\u0027t find any example about it in trove code. I know that there is a mechanism of not in sqlalchemy but it seems trove may support other db apis. \nDo you know any other project in openstack which uses negative search ?","commit_id":"f883bcaceebd209db27aa5a69d5880b8a5a1c213"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2266a107a7e92163fdf785d3d4e128cc5e9061f1","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                return upgradecheck.Result(upgradecheck.Code.WARNING)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        return upgradecheck.Result(upgradecheck.Code.SUCCESS,"},{"line_number":47,"context_line":"                                   _(\u0027Instances with running tasks exist\u0027))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    # The format of the check functions is to return an"},{"line_number":50,"context_line":"    # oslo_upgradecheck.upgradecheck.Result"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffd0ebdf_2865fbb5","line":47,"range":{"start_line":47,"start_character":35,"end_line":47,"end_character":74},"updated":"2019-01-04 17:07:34.000000000","message":"This should be with the warning result above, not the success case, right?","commit_id":"f883bcaceebd209db27aa5a69d5880b8a5a1c213"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"5b1e4742b096773d439dc11f9721ca56c12536ca","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                return upgradecheck.Result(upgradecheck.Code.WARNING)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        return upgradecheck.Result(upgradecheck.Code.SUCCESS,"},{"line_number":47,"context_line":"                                   _(\u0027Instances with running tasks exist\u0027))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    # The format of the check functions is to return an"},{"line_number":50,"context_line":"    # oslo_upgradecheck.upgradecheck.Result"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfd5e7cf_8018a0d3","line":47,"range":{"start_line":47,"start_character":35,"end_line":47,"end_character":74},"in_reply_to":"ffd0ebdf_2865fbb5","updated":"2019-01-05 22:20:42.000000000","message":"Done","commit_id":"f883bcaceebd209db27aa5a69d5880b8a5a1c213"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2266a107a7e92163fdf785d3d4e128cc5e9061f1","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    # in the returned Result\u0027s \"details\" attribute. The"},{"line_number":55,"context_line":"    # summary will be rolled up at the end of the check() method."},{"line_number":56,"context_line":"    _upgrade_checks \u003d ("},{"line_number":57,"context_line":"        (_(\u0027InstancesWithTasks\u0027), _check_instances_with_tasks),"},{"line_number":58,"context_line":"    )"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ffd0ebdf_28ee5b22","line":57,"updated":"2019-01-04 17:07:34.000000000","message":"The history of checks section in the docs should be updated:\n\nhttps://github.com/openstack/trove/blob/master/doc/source/cli/trove-status.rst#upgrade","commit_id":"f883bcaceebd209db27aa5a69d5880b8a5a1c213"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"5b1e4742b096773d439dc11f9721ca56c12536ca","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    # in the returned Result\u0027s \"details\" attribute. The"},{"line_number":55,"context_line":"    # summary will be rolled up at the end of the check() method."},{"line_number":56,"context_line":"    _upgrade_checks \u003d ("},{"line_number":57,"context_line":"        (_(\u0027InstancesWithTasks\u0027), _check_instances_with_tasks),"},{"line_number":58,"context_line":"    )"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"dfd5e7cf_200d3490","line":57,"in_reply_to":"ffd0ebdf_28ee5b22","updated":"2019-01-05 22:20:42.000000000","message":"Done","commit_id":"f883bcaceebd209db27aa5a69d5880b8a5a1c213"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from oslo_upgradecheck import upgradecheck"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from trove.common.i18n import _"},{"line_number":21,"context_line":"import trove.db"},{"line_number":22,"context_line":"from trove.instance.models import DBInstance"},{"line_number":23,"context_line":"from trove.instance.tasks import InstanceTasks"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"dfd5e7cf_5a625b40","line":21,"updated":"2019-01-09 22:46:20.000000000","message":"Follow good practice import statement pattern:\n\n from X import Y as Z\n\nIn this case:\n\n from trove import db","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"e9485195b39475233425e0f7dd77bf68f0a830c4","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from oslo_upgradecheck import upgradecheck"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from trove.common.i18n import _"},{"line_number":21,"context_line":"import trove.db"},{"line_number":22,"context_line":"from trove.instance.models import DBInstance"},{"line_number":23,"context_line":"from trove.instance.tasks import InstanceTasks"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_740f35e1","line":21,"in_reply_to":"bfdaf3ff_76d78825","updated":"2019-01-15 13:48:51.000000000","message":"You are right. Both forms are a good practice, however the latter is more commonly used in the project. For the sake of better consistency I would prefer using it instead of current form. The decision is yours :)\n\n\nAlternatively, consider using alias:\n\n import trove.db as db","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from oslo_upgradecheck import upgradecheck"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from trove.common.i18n import _"},{"line_number":21,"context_line":"import trove.db"},{"line_number":22,"context_line":"from trove.instance.models import DBInstance"},{"line_number":23,"context_line":"from trove.instance.tasks import InstanceTasks"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_76d78825","line":21,"in_reply_to":"dfd5e7cf_5a625b40","updated":"2019-01-14 22:42:38.000000000","message":"Could you explain why import trove.db is not a good practice?\n\nIn [1], import X is encouraged over from X import Y as it is the most readable way of expressing intentions.\n\n[1] https://docs.python-guide.org/writing/structure/#modules","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    and added to _upgrade_checks tuple."},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _check_instances_with_tasks(self):"},{"line_number":32,"context_line":"        \"\"\"Finds Trove instances with running tasks."},{"line_number":33,"context_line":"        Such instances need to communicate with Trove components to report"},{"line_number":34,"context_line":"        status. This may rise issues if Trove instances are unavailable."}],"source_content_type":"text/x-python","patch_set":6,"id":"dfd5e7cf_3a38b73b","line":31,"range":{"start_line":31,"start_character":30,"end_line":31,"end_character":35},"updated":"2019-01-09 22:46:20.000000000","message":"running_tasks","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    and added to _upgrade_checks tuple."},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _check_instances_with_tasks(self):"},{"line_number":32,"context_line":"        \"\"\"Finds Trove instances with running tasks."},{"line_number":33,"context_line":"        Such instances need to communicate with Trove components to report"},{"line_number":34,"context_line":"        status. This may rise issues if Trove instances are unavailable."}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_16dcfc44","line":31,"range":{"start_line":31,"start_character":30,"end_line":31,"end_character":35},"in_reply_to":"dfd5e7cf_3a38b73b","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _check_instances_with_tasks(self):"},{"line_number":32,"context_line":"        \"\"\"Finds Trove instances with running tasks."},{"line_number":33,"context_line":"        Such instances need to communicate with Trove components to report"},{"line_number":34,"context_line":"        status. This may rise issues if Trove instances are unavailable."},{"line_number":35,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"dfd5e7cf_ba4347af","line":32,"updated":"2019-01-09 22:46:20.000000000","message":"Add single-line spacing after the first line of doc string.","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _check_instances_with_tasks(self):"},{"line_number":32,"context_line":"        \"\"\"Finds Trove instances with running tasks."},{"line_number":33,"context_line":"        Such instances need to communicate with Trove components to report"},{"line_number":34,"context_line":"        status. This may rise issues if Trove instances are unavailable."},{"line_number":35,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_36e10000","line":32,"in_reply_to":"dfd5e7cf_ba4347af","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _check_instances_with_tasks(self):"},{"line_number":32,"context_line":"        \"\"\"Finds Trove instances with running tasks."},{"line_number":33,"context_line":"        Such instances need to communicate with Trove components to report"},{"line_number":34,"context_line":"        status. This may rise issues if Trove instances are unavailable."},{"line_number":35,"context_line":"        \"\"\""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"dfd5e7cf_9a21a3fe","line":33,"range":{"start_line":33,"start_character":54,"end_line":33,"end_character":64},"updated":"2019-01-09 22:46:20.000000000","message":"control plane","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _check_instances_with_tasks(self):"},{"line_number":32,"context_line":"        \"\"\"Finds Trove instances with running tasks."},{"line_number":33,"context_line":"        Such instances need to communicate with Trove components to report"},{"line_number":34,"context_line":"        status. This may rise issues if Trove instances are unavailable."},{"line_number":35,"context_line":"        \"\"\""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_d6e5140c","line":33,"range":{"start_line":33,"start_character":54,"end_line":33,"end_character":64},"in_reply_to":"dfd5e7cf_9a21a3fe","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def _check_instances_with_tasks(self):"},{"line_number":32,"context_line":"        \"\"\"Finds Trove instances with running tasks."},{"line_number":33,"context_line":"        Such instances need to communicate with Trove components to report"},{"line_number":34,"context_line":"        status. This may rise issues if Trove instances are unavailable."},{"line_number":35,"context_line":"        \"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        db_api \u003d trove.db.get_db_api()"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfd5e7cf_da6c0b38","line":34,"range":{"start_line":34,"start_character":46,"end_line":34,"end_character":55},"updated":"2019-01-09 22:46:20.000000000","message":"Trove services?","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def _check_instances_with_tasks(self):"},{"line_number":32,"context_line":"        \"\"\"Finds Trove instances with running tasks."},{"line_number":33,"context_line":"        Such instances need to communicate with Trove components to report"},{"line_number":34,"context_line":"        status. This may rise issues if Trove instances are unavailable."},{"line_number":35,"context_line":"        \"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        db_api \u003d trove.db.get_db_api()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_96ef8ce8","line":34,"range":{"start_line":34,"start_character":46,"end_line":34,"end_character":55},"in_reply_to":"dfd5e7cf_da6c0b38","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        \"\"\"Finds Trove instances with running tasks."},{"line_number":33,"context_line":"        Such instances need to communicate with Trove components to report"},{"line_number":34,"context_line":"        status. This may rise issues if Trove instances are unavailable."},{"line_number":35,"context_line":"        \"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        db_api \u003d trove.db.get_db_api()"},{"line_number":38,"context_line":"        db_api.configure_db(cfg.CONF)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfd5e7cf_dadacbe7","line":35,"range":{"start_line":35,"start_character":8,"end_line":35,"end_character":11},"updated":"2019-01-09 22:46:20.000000000","message":"You could also add mention that upgrade may cause interrupting instance task in the middle and leave it in failed state.","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        \"\"\"Finds Trove instances with running tasks."},{"line_number":33,"context_line":"        Such instances need to communicate with Trove components to report"},{"line_number":34,"context_line":"        status. This may rise issues if Trove instances are unavailable."},{"line_number":35,"context_line":"        \"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        db_api \u003d trove.db.get_db_api()"},{"line_number":38,"context_line":"        db_api.configure_db(cfg.CONF)"}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_f6cb786f","line":35,"range":{"start_line":35,"start_character":8,"end_line":35,"end_character":11},"in_reply_to":"dfd5e7cf_dadacbe7","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        db_api \u003d trove.db.get_db_api()"},{"line_number":38,"context_line":"        db_api.configure_db(cfg.CONF)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        db_instances \u003d DBInstance.find_all().all()"},{"line_number":41,"context_line":"        for db in db_instances:"},{"line_number":42,"context_line":"            if db.task_status !\u003d InstanceTasks.NONE:"},{"line_number":43,"context_line":"                return upgradecheck.Result("}],"source_content_type":"text/x-python","patch_set":6,"id":"dfd5e7cf_fa6eaf94","line":40,"range":{"start_line":40,"start_character":42,"end_line":40,"end_character":44},"updated":"2019-01-09 22:46:20.000000000","message":"Filter out deleted instances:\n\n find_all(deleted\u003dFalse)","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        db_api \u003d trove.db.get_db_api()"},{"line_number":38,"context_line":"        db_api.configure_db(cfg.CONF)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        db_instances \u003d DBInstance.find_all().all()"},{"line_number":41,"context_line":"        for db in db_instances:"},{"line_number":42,"context_line":"            if db.task_status !\u003d InstanceTasks.NONE:"},{"line_number":43,"context_line":"                return upgradecheck.Result("}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_36afc095","line":40,"range":{"start_line":40,"start_character":42,"end_line":40,"end_character":44},"in_reply_to":"dfd5e7cf_fa6eaf94","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        db_api.configure_db(cfg.CONF)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        db_instances \u003d DBInstance.find_all().all()"},{"line_number":41,"context_line":"        for db in db_instances:"},{"line_number":42,"context_line":"            if db.task_status !\u003d InstanceTasks.NONE:"},{"line_number":43,"context_line":"                return upgradecheck.Result("},{"line_number":44,"context_line":"                    upgradecheck.Code.WARNING,"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfd5e7cf_9a0203b4","line":41,"range":{"start_line":41,"start_character":12,"end_line":41,"end_character":14},"updated":"2019-01-09 22:46:20.000000000","message":"Misleading variable name. It is more \"db_instance\" than just \"db\".","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        db_api.configure_db(cfg.CONF)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        db_instances \u003d DBInstance.find_all().all()"},{"line_number":41,"context_line":"        for db in db_instances:"},{"line_number":42,"context_line":"            if db.task_status !\u003d InstanceTasks.NONE:"},{"line_number":43,"context_line":"                return upgradecheck.Result("},{"line_number":44,"context_line":"                    upgradecheck.Code.WARNING,"}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_d996a795","line":41,"range":{"start_line":41,"start_character":12,"end_line":41,"end_character":14},"in_reply_to":"dfd5e7cf_9a0203b4","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        db_instances \u003d DBInstance.find_all().all()"},{"line_number":41,"context_line":"        for db in db_instances:"},{"line_number":42,"context_line":"            if db.task_status !\u003d InstanceTasks.NONE:"},{"line_number":43,"context_line":"                return upgradecheck.Result("},{"line_number":44,"context_line":"                    upgradecheck.Code.WARNING,"},{"line_number":45,"context_line":"                    _(\"Instances with running tasks exist\"))"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfd5e7cf_3a03d775","line":42,"range":{"start_line":42,"start_character":15,"end_line":42,"end_character":51},"updated":"2019-01-09 22:46:20.000000000","message":"A better approach would be to include condition in DB query and count instances with running tasks in single operation. This way we could avoid querying all instances regardless of the status and iterate over each of them in pessimistic (but frequent) scenario.\n\nSQLAlchemy provides interface [1] for constructing such queries and Trove backup model has some nice snippets of code demonstrating the usage [2]. Consider splitting query construction into several statements for better readability.\n\n[1] https://docs.sqlalchemy.org/en/rel_0_9/core/sqlelement.html#sqlalchemy.sql.operators.ColumnOperators.__ne__\n[2] https://github.com/openstack/trove/blob/master/trove/backup/models.py#L246","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        db_instances \u003d DBInstance.find_all().all()"},{"line_number":41,"context_line":"        for db in db_instances:"},{"line_number":42,"context_line":"            if db.task_status !\u003d InstanceTasks.NONE:"},{"line_number":43,"context_line":"                return upgradecheck.Result("},{"line_number":44,"context_line":"                    upgradecheck.Code.WARNING,"},{"line_number":45,"context_line":"                    _(\"Instances with running tasks exist\"))"}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_f9936ba2","line":42,"range":{"start_line":42,"start_character":15,"end_line":42,"end_character":51},"in_reply_to":"dfd5e7cf_3a03d775","updated":"2019-01-14 22:42:38.000000000","message":"Thanks for the hint. Matt Riedemann also suggested the same approach but I couldn\u0027t find any examples.","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            if db.task_status !\u003d InstanceTasks.NONE:"},{"line_number":43,"context_line":"                return upgradecheck.Result("},{"line_number":44,"context_line":"                    upgradecheck.Code.WARNING,"},{"line_number":45,"context_line":"                    _(\"Instances with running tasks exist\"))"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        return upgradecheck.Result(upgradecheck.Code.SUCCESS)"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"dfd5e7cf_da216b4f","line":45,"range":{"start_line":45,"start_character":52,"end_line":45,"end_character":57},"updated":"2019-01-09 22:46:20.000000000","message":"Period.","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            if db.task_status !\u003d InstanceTasks.NONE:"},{"line_number":43,"context_line":"                return upgradecheck.Result("},{"line_number":44,"context_line":"                    upgradecheck.Code.WARNING,"},{"line_number":45,"context_line":"                    _(\"Instances with running tasks exist\"))"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        return upgradecheck.Result(upgradecheck.Code.SUCCESS)"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_d9db077b","line":45,"range":{"start_line":45,"start_character":52,"end_line":45,"end_character":57},"in_reply_to":"dfd5e7cf_da216b4f","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    # If the check hits warnings or failures then those should be stored"},{"line_number":54,"context_line":"    # in the returned Result\u0027s \"details\" attribute. The"},{"line_number":55,"context_line":"    # summary will be rolled up at the end of the check() method."},{"line_number":56,"context_line":"    _upgrade_checks \u003d ((_(\"InstancesWithTasks\"), _check_instances_with_tasks),)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def main():"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfd5e7cf_fa678f50","line":56,"range":{"start_line":56,"start_character":27,"end_line":56,"end_character":45},"updated":"2019-01-09 22:46:20.000000000","message":"There is no need to use camelCase. Add spaces between words for better readability and consistency with other OpenStack services, e.g. Nova [1].\n\n[1] https://github.com/openstack/nova/blob/master/nova/cmd/status.py#L456","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    # If the check hits warnings or failures then those should be stored"},{"line_number":54,"context_line":"    # in the returned Result\u0027s \"details\" attribute. The"},{"line_number":55,"context_line":"    # summary will be rolled up at the end of the check() method."},{"line_number":56,"context_line":"    _upgrade_checks \u003d ((_(\"InstancesWithTasks\"), _check_instances_with_tasks),)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def main():"}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_19cbcfa5","line":56,"range":{"start_line":56,"start_character":27,"end_line":56,"end_character":45},"in_reply_to":"dfd5e7cf_fa678f50","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bccf0dc0c3edd404b4c890c1d96dbb635bd8b0da","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def main():"},{"line_number":60,"context_line":"    return upgradecheck.main("},{"line_number":61,"context_line":"        cfg.CONF, project\u003d\"trove\", upgrade_command\u003dChecks()"},{"line_number":62,"context_line":"    )"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"dfd5e7cf_5af01b68","line":61,"updated":"2019-01-09 22:46:20.000000000","message":"Not relevant for the change. I would revert it.","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def main():"},{"line_number":60,"context_line":"    return upgradecheck.main("},{"line_number":61,"context_line":"        cfg.CONF, project\u003d\"trove\", upgrade_command\u003dChecks()"},{"line_number":62,"context_line":"    )"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bfdaf3ff_593637b7","line":61,"in_reply_to":"dfd5e7cf_5af01b68","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"acd94548b2ebebc0d77af260338f76935e96a5a3"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"d9fbc78c64f1a4abfefd1573c37ae5753526939c","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _check_instances_with_running_tasks(self):"},{"line_number":32,"context_line":"        \"\"\"Finds Trove instances with running tasks."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        Such instances need to communicate with Trove control plane to report"},{"line_number":35,"context_line":"        status. This may rise issues if Trove services are unavailable, e.g."}],"source_content_type":"text/x-python","patch_set":7,"id":"bfdaf3ff_f5610e3b","line":32,"range":{"start_line":32,"start_character":11,"end_line":32,"end_character":52},"updated":"2019-01-12 16:35:37.000000000","message":"Maybe:\n\"Checks to make sure instances with running tasks doesn\u0027t exist.\" ?","commit_id":"746724472b0e1680b45b39524a7d43c63af4c87c"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def _check_instances_with_running_tasks(self):"},{"line_number":32,"context_line":"        \"\"\"Finds Trove instances with running tasks."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        Such instances need to communicate with Trove control plane to report"},{"line_number":35,"context_line":"        status. This may rise issues if Trove services are unavailable, e.g."}],"source_content_type":"text/x-python","patch_set":7,"id":"bfdaf3ff_e84a7baa","line":32,"range":{"start_line":32,"start_character":11,"end_line":32,"end_character":52},"in_reply_to":"bfdaf3ff_f5610e3b","updated":"2019-01-14 22:42:38.000000000","message":"It seems like the current version is shorter and says the same thing :) I like the shorter version as we have a longer description below. Also the negative aspect of your sentence is less readable IMHO.","commit_id":"746724472b0e1680b45b39524a7d43c63af4c87c"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"d9fbc78c64f1a4abfefd1573c37ae5753526939c","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            DBInstance.task_id !\u003d InstanceTasks.NONE.code).filter_by("},{"line_number":45,"context_line":"            deleted\u003dFalse).count()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        if instances_with_tasks:"},{"line_number":48,"context_line":"            return upgradecheck.Result("},{"line_number":49,"context_line":"                upgradecheck.Code.WARNING,"},{"line_number":50,"context_line":"                _(\"Instances with running tasks exist.\"))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        return upgradecheck.Result(upgradecheck.Code.SUCCESS)"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"bfdaf3ff_95cd225f","line":50,"range":{"start_line":47,"start_character":0,"end_line":50,"end_character":57},"updated":"2019-01-12 16:35:37.000000000","message":"I have doubts if we should continue the upgrade when instances with any status exist.\n\nDocumentation about WARNING says:\n\"(...) This is considered a warning but the upgrade may be OK.\"\n\nSo at this moment, we agree on upgrade even when some errored instances exist.\n\n\nIMHO we should return Code.FAILURE here, prevent upgrading and ask a user for investigation.","commit_id":"746724472b0e1680b45b39524a7d43c63af4c87c"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            DBInstance.task_id !\u003d InstanceTasks.NONE.code).filter_by("},{"line_number":45,"context_line":"            deleted\u003dFalse).count()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        if instances_with_tasks:"},{"line_number":48,"context_line":"            return upgradecheck.Result("},{"line_number":49,"context_line":"                upgradecheck.Code.WARNING,"},{"line_number":50,"context_line":"                _(\"Instances with running tasks exist.\"))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        return upgradecheck.Result(upgradecheck.Code.SUCCESS)"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"bfdaf3ff_e8f83b4a","line":50,"range":{"start_line":47,"start_character":0,"end_line":50,"end_character":57},"in_reply_to":"bfdaf3ff_95cd225f","updated":"2019-01-14 22:42:38.000000000","message":"I also had my doubts :) \nMy way of thinking is that there was no breaking changes in the guest agent, which would break existing instances.\n\nInstances in the ERROR state are not a problem since they will not break any further. \n\nThe WARNING message should give hints to the administrator that something may go wrong but it is hard to tell and he should wait for a more stable state.","commit_id":"746724472b0e1680b45b39524a7d43c63af4c87c"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"e9485195b39475233425e0f7dd77bf68f0a830c4","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        db_api \u003d trove.db.get_db_api()"},{"line_number":41,"context_line":"        db_api.configure_db(cfg.CONF)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # pylint: disable\u003dmaybe-no-member"},{"line_number":44,"context_line":"        instances_with_tasks \u003d DBInstance.query().filter("},{"line_number":45,"context_line":"            DBInstance.task_id !\u003d InstanceTasks.NONE.code).filter_by("},{"line_number":46,"context_line":"            deleted\u003dFalse).count()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        if instances_with_tasks:"},{"line_number":49,"context_line":"            return upgradecheck.Result("}],"source_content_type":"text/x-python","patch_set":8,"id":"bfdaf3ff_f46325db","line":46,"range":{"start_line":43,"start_character":0,"end_line":46,"end_character":34},"updated":"2019-01-15 13:48:51.000000000","message":"In backup example [1] we deal with the exact same case and skipping pylint rule is unneeded. Maybe splitting the query into multiple statements would help?\n\nBlocking linter code rules is the ultimate finality. Let\u0027s try to avoid that.\n\n[1] https://github.com/openstack/trove/blob/master/trove/backup/models.py#L138","commit_id":"4cc2323adbcb1c6d647f1bd3e1b31d76e89d34ed"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"1af0dfed3dfa32577fbb16f15a81f258d10cb131","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        db_api \u003d trove.db.get_db_api()"},{"line_number":41,"context_line":"        db_api.configure_db(cfg.CONF)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # pylint: disable\u003dmaybe-no-member"},{"line_number":44,"context_line":"        instances_with_tasks \u003d DBInstance.query().filter("},{"line_number":45,"context_line":"            DBInstance.task_id !\u003d InstanceTasks.NONE.code).filter_by("},{"line_number":46,"context_line":"            deleted\u003dFalse).count()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        if instances_with_tasks:"},{"line_number":49,"context_line":"            return upgradecheck.Result("}],"source_content_type":"text/x-python","patch_set":8,"id":"bfdaf3ff_741dee71","line":46,"range":{"start_line":43,"start_character":0,"end_line":46,"end_character":34},"in_reply_to":"bfdaf3ff_f46325db","updated":"2019-01-15 18:55:50.000000000","message":"Done","commit_id":"4cc2323adbcb1c6d647f1bd3e1b31d76e89d34ed"}],"trove/tests/unittests/cmd/test_status.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2266a107a7e92163fdf785d3d4e128cc5e9061f1","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        super(TestUpgradeChecks, self).setUp()"},{"line_number":25,"context_line":"        self.cmd \u003d status.Checks()"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def test__check_no_instances_with_tasks(self):"},{"line_number":28,"context_line":"        check_result \u003d self.cmd._check_instances_with_tasks()"},{"line_number":29,"context_line":"        self.assertEqual("},{"line_number":30,"context_line":"            Code.SUCCESS, check_result.code)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffd0ebdf_280adbd1","line":27,"updated":"2019-01-04 17:07:34.000000000","message":"You should also have a test for the warning case.","commit_id":"f883bcaceebd209db27aa5a69d5880b8a5a1c213"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"d9fbc78c64f1a4abfefd1573c37ae5753526939c","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from trove.tests.unittests import trove_testtools"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TestUpgradeChecks(trove_testtools.TestCase):"},{"line_number":23,"context_line":"    def setUp(self):"},{"line_number":24,"context_line":"        super(TestUpgradeChecks, self).setUp()"},{"line_number":25,"context_line":"        self.cmd \u003d status.Checks()"}],"source_content_type":"text/x-python","patch_set":7,"id":"bfdaf3ff_7503de43","line":22,"range":{"start_line":22,"start_character":6,"end_line":22,"end_character":23},"updated":"2019-01-12 16:35:37.000000000","message":"I do not like the fact we want to put test cases from all checks to one huge class.\n\nI propose to create a separate class for each check.\n\nThis one we can call for example \"TestInstancesWithTasks\"","commit_id":"746724472b0e1680b45b39524a7d43c63af4c87c"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from trove.tests.unittests import trove_testtools"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TestUpgradeChecks(trove_testtools.TestCase):"},{"line_number":23,"context_line":"    def setUp(self):"},{"line_number":24,"context_line":"        super(TestUpgradeChecks, self).setUp()"},{"line_number":25,"context_line":"        self.cmd \u003d status.Checks()"}],"source_content_type":"text/x-python","patch_set":7,"id":"bfdaf3ff_480e278e","line":22,"range":{"start_line":22,"start_character":6,"end_line":22,"end_character":23},"in_reply_to":"bfdaf3ff_7503de43","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"746724472b0e1680b45b39524a7d43c63af4c87c"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"d9fbc78c64f1a4abfefd1573c37ae5753526939c","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        self.fake_db_api \u003d mock.Mock()"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    @mock.patch(\"trove.cmd.status.DBInstance\")"},{"line_number":29,"context_line":"    def test__check_no_instances_with_tasks(self, mock_instance):"},{"line_number":30,"context_line":"        with mock.patch(\"trove.db.get_db_api\") as fake_get_db_api:"},{"line_number":31,"context_line":"            fake_get_db_api.return_value \u003d self.fake_db_api"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"bfdaf3ff_d5d5eaba","line":29,"range":{"start_line":29,"start_character":4,"end_line":29,"end_character":65},"updated":"2019-01-12 16:35:37.000000000","message":"I would suggest creating docstring for each test case.","commit_id":"746724472b0e1680b45b39524a7d43c63af4c87c"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        self.fake_db_api \u003d mock.Mock()"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    @mock.patch(\"trove.cmd.status.DBInstance\")"},{"line_number":29,"context_line":"    def test__check_no_instances_with_tasks(self, mock_instance):"},{"line_number":30,"context_line":"        with mock.patch(\"trove.db.get_db_api\") as fake_get_db_api:"},{"line_number":31,"context_line":"            fake_get_db_api.return_value \u003d self.fake_db_api"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"bfdaf3ff_e81cbbc2","line":29,"range":{"start_line":29,"start_character":4,"end_line":29,"end_character":65},"in_reply_to":"bfdaf3ff_d5d5eaba","updated":"2019-01-14 22:42:38.000000000","message":"I would rather not do that. The code itself and function name should be is pretty simple and self-describing.","commit_id":"746724472b0e1680b45b39524a7d43c63af4c87c"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bb475a6d7ccec7b407bf369ab5a0f8980ccf65f7","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    @mock.patch(\"trove.cmd.status.DBInstance\")"},{"line_number":29,"context_line":"    def test__check_no_instances_with_tasks(self, mock_instance):"},{"line_number":30,"context_line":"        with mock.patch(\"trove.db.get_db_api\") as fake_get_db_api:"},{"line_number":31,"context_line":"            fake_get_db_api.return_value \u003d self.fake_db_api"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"            mock_instance.query.return_value.filter.return_value.filter_by.\\"}],"source_content_type":"text/x-python","patch_set":7,"id":"bfdaf3ff_d3cbc91b","line":30,"updated":"2019-01-11 23:32:52.000000000","message":"Could we use @mock.patch decorator instead? Multiple patches for single test case are common [1].\n\nIn my opinion \"with mock.patch\", by nesting code included in-between,  impairs readability.\n\n\n[1] https://github.com/openstack/trove/blob/master/trove/tests/unittests/cluster/test_mongodb_cluster.py#L197","commit_id":"746724472b0e1680b45b39524a7d43c63af4c87c"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    @mock.patch(\"trove.cmd.status.DBInstance\")"},{"line_number":29,"context_line":"    def test__check_no_instances_with_tasks(self, mock_instance):"},{"line_number":30,"context_line":"        with mock.patch(\"trove.db.get_db_api\") as fake_get_db_api:"},{"line_number":31,"context_line":"            fake_get_db_api.return_value \u003d self.fake_db_api"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"            mock_instance.query.return_value.filter.return_value.filter_by.\\"}],"source_content_type":"text/x-python","patch_set":7,"id":"bfdaf3ff_88796ffd","line":30,"in_reply_to":"bfdaf3ff_d3cbc91b","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"746724472b0e1680b45b39524a7d43c63af4c87c"},{"author":{"_account_id":28695,"name":"Bartosz Zurkowski","email":"b.zurkowski@samsung.com","username":"b.zurkowski"},"change_message_id":"bb475a6d7ccec7b407bf369ab5a0f8980ccf65f7","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @mock.patch(\"trove.cmd.status.DBInstance\")"},{"line_number":40,"context_line":"    def test__check_instances_with_tasks(self, mock_instance):"},{"line_number":41,"context_line":"        with mock.patch(\"trove.db.get_db_api\") as fake_get_db_api:"},{"line_number":42,"context_line":"            fake_get_db_api.return_value \u003d self.fake_db_api"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"            mock_instance.query.return_value.filter.return_value.filter_by.\\"}],"source_content_type":"text/x-python","patch_set":7,"id":"bfdaf3ff_73d0ddca","line":41,"updated":"2019-01-11 23:32:52.000000000","message":"Same as above. Using decorator instead of \"with\" statement would improve readability.","commit_id":"746724472b0e1680b45b39524a7d43c63af4c87c"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"4637158ef17ecf9cd8211e7553f97d92cb395565","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @mock.patch(\"trove.cmd.status.DBInstance\")"},{"line_number":40,"context_line":"    def test__check_instances_with_tasks(self, mock_instance):"},{"line_number":41,"context_line":"        with mock.patch(\"trove.db.get_db_api\") as fake_get_db_api:"},{"line_number":42,"context_line":"            fake_get_db_api.return_value \u003d self.fake_db_api"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"            mock_instance.query.return_value.filter.return_value.filter_by.\\"}],"source_content_type":"text/x-python","patch_set":7,"id":"bfdaf3ff_a87c73eb","line":41,"in_reply_to":"bfdaf3ff_73d0ddca","updated":"2019-01-14 22:42:38.000000000","message":"Done","commit_id":"746724472b0e1680b45b39524a7d43c63af4c87c"},{"author":{"_account_id":28671,"name":"Marcin Piwowarczyk","email":"m.piwowarczy@samsung.com","username":"m.piwowarczy"},"change_message_id":"18a19fa1f171b30de31ec1885abb9c8508981fd3","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from mock import Mock"},{"line_number":16,"context_line":"from mock import patch"},{"line_number":17,"context_line":"from oslo_upgradecheck.upgradecheck import Code"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from trove.cmd import status"}],"source_content_type":"text/x-python","patch_set":9,"id":"bfdaf3ff_15a247af","line":16,"range":{"start_line":15,"start_character":0,"end_line":16,"end_character":22},"updated":"2019-01-16 18:47:45.000000000","message":"For single module you can import multiple names in one line:\nfrom mock import Mock, patch","commit_id":"f4b5c65dc06e315f7de0d54779811d6c1eaeeab9"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"20e70f75ab263cdf01c8d222d9792afb9ab2bc0b","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from mock import Mock"},{"line_number":16,"context_line":"from mock import patch"},{"line_number":17,"context_line":"from oslo_upgradecheck.upgradecheck import Code"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from trove.cmd import status"}],"source_content_type":"text/x-python","patch_set":9,"id":"bfdaf3ff_f0123109","line":16,"range":{"start_line":15,"start_character":0,"end_line":16,"end_character":22},"in_reply_to":"bfdaf3ff_15a247af","updated":"2019-01-16 19:15:11.000000000","message":"This is not so common in Trove, e.g. [1], [2], and these are just two first opened files by me :)\n\n[1] https://github.com/openstack/trove/blob/master/trove/backup/models.py\n[2] https://github.com/openstack/trove/blob/master/trove/backup/service.py","commit_id":"f4b5c65dc06e315f7de0d54779811d6c1eaeeab9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"09ce4b5042b15ff6fac0527e5716900eb020db7a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from trove.tests.unittests import trove_testtools"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@patch(\"trove.cmd.status.db.get_db_api\")"},{"line_number":24,"context_line":"@patch(\"trove.cmd.status.DBInstance\")"},{"line_number":25,"context_line":"class TestUpgradeChecksInstancesWithTasks(trove_testtools.TestCase):"},{"line_number":26,"context_line":"    def setUp(self):"},{"line_number":27,"context_line":"        super(TestUpgradeChecksInstancesWithTasks, self).setUp()"}],"source_content_type":"text/x-python","patch_set":9,"id":"bfdaf3ff_b611e554","line":24,"range":{"start_line":23,"start_character":0,"end_line":24,"end_character":37},"updated":"2019-01-17 22:48:12.000000000","message":"Given the upgrade check relies on actual database queries, rather than mock this out, I highly recommend to teams writing upgrade checks that they actually test with real data in the test database (normally sqlite) so they can ensure their DB query code is correct.","commit_id":"f4b5c65dc06e315f7de0d54779811d6c1eaeeab9"},{"author":{"_account_id":29393,"name":"Dariusz Król","email":"dkrol3@gmail.com","username":"d.krol"},"change_message_id":"d3ad30bd9fbb92d2c87904c1f3c646f032590d59","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from trove.tests.unittests import trove_testtools"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@patch(\"trove.cmd.status.db.get_db_api\")"},{"line_number":24,"context_line":"@patch(\"trove.cmd.status.DBInstance\")"},{"line_number":25,"context_line":"class TestUpgradeChecksInstancesWithTasks(trove_testtools.TestCase):"},{"line_number":26,"context_line":"    def setUp(self):"},{"line_number":27,"context_line":"        super(TestUpgradeChecksInstancesWithTasks, self).setUp()"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_58ef1187","line":24,"range":{"start_line":23,"start_character":0,"end_line":24,"end_character":37},"in_reply_to":"bfdaf3ff_b611e554","updated":"2019-01-18 20:56:20.000000000","message":"I will an integration test for this check in a separate change.","commit_id":"f4b5c65dc06e315f7de0d54779811d6c1eaeeab9"}]}
