)]}'
{"nova/cmd/manage.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ced2a07499e73724146275cac1569696a1fb3cf1","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            count \u003d max_count - ran"},{"line_number":677,"context_line":"            try:"},{"line_number":678,"context_line":"                found, done \u003d migration_meth(ctxt, count)"},{"line_number":679,"context_line":"            except Exception:"},{"line_number":680,"context_line":"                print(_(\"Error attempting to run %(method)s\") % dict("},{"line_number":681,"context_line":"                      method\u003dmigration_meth))"},{"line_number":682,"context_line":"                found \u003d done \u003d 0"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_25bdaab6","side":"PARENT","line":679,"range":{"start_line":679,"start_character":19,"end_line":679,"end_character":28},"updated":"2018-09-04 18:57:37.000000000","message":"FWIW, it\u0027s been this way since the command was introduced:\n\nhttps://review.openstack.org/#/c/278078/","commit_id":"5c6b22559d538e63543c38471e60aeb5c7867e8f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4ec80dbcaeb4263e6a99440f1191eeb324f5fcc7","unresolved":false,"context_lines":[{"line_number":680,"context_line":"            count \u003d max_count - ran"},{"line_number":681,"context_line":"            try:"},{"line_number":682,"context_line":"                found, done \u003d migration_meth(ctxt, count)"},{"line_number":683,"context_line":"            except exception.NovaException:"},{"line_number":684,"context_line":"                print(_(\"Error attempting to run %(method)s\") % dict("},{"line_number":685,"context_line":"                      method\u003dmigration_meth))"},{"line_number":686,"context_line":"                found \u003d done \u003d 0"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_8b24cfc7","line":683,"updated":"2018-09-04 20:07:42.000000000","message":"Forgot to remove this.","commit_id":"0a448ce9c11807a600ca6e63d2841de872bd6b80"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"18574c7b128a9ae78f44ff40e26fc87d759caeb1","unresolved":false,"context_lines":[{"line_number":2297,"context_line":"def main():"},{"line_number":2298,"context_line":"    \"\"\"Parse options and call the appropriate class/method.\"\"\""},{"line_number":2299,"context_line":"    CONF.register_cli_opts([category_opt, post_mortem_opt])"},{"line_number":2300,"context_line":"    config.parse_args(sys.argv)"},{"line_number":2301,"context_line":"    logging.set_defaults("},{"line_number":2302,"context_line":"        default_log_levels\u003dlogging.get_default_log_levels() +"},{"line_number":2303,"context_line":"        _EXTRA_DEFAULT_LOG_LEVELS)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_4c19ead4","line":2300,"updated":"2018-09-05 00:30:10.000000000","message":"We should maybe do the placement db config in this method, because it has a configure_db kwarg and that\u0027s what controls where we configure the nova db context managers.","commit_id":"731ef425627ff87a22d6f8c9e401c5d3f0be4cb5"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"d7437b82f8f5a731337c1f373a40dc965e2df1e0","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            count \u003d max_count - ran"},{"line_number":677,"context_line":"            try:"},{"line_number":678,"context_line":"                found, done \u003d migration_meth(ctxt, count)"},{"line_number":679,"context_line":"            except Exception:"},{"line_number":680,"context_line":"                print(_(\"Error attempting to run %(method)s\") % dict("},{"line_number":681,"context_line":"                      method\u003dmigration_meth))"},{"line_number":682,"context_line":"                found \u003d done \u003d 0"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"            name \u003d migration_meth.__name__"},{"line_number":685,"context_line":"            if found:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_0f23da59","side":"PARENT","line":682,"range":{"start_line":679,"start_character":12,"end_line":682,"end_character":32},"updated":"2018-09-05 12:29:25.000000000","message":"It means if there is any migration failed at here, we will have a hard stop, and the user can\u0027t know which migration is successful, and how much records migration successful.\n\nI know this is for exposing the error for the CI, maybe we CI should test the response, ensure there isn\u0027t any error message?","commit_id":"5c6b22559d538e63543c38471e60aeb5c7867e8f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dee7bdf0149204c60795a835309a65fa6a09979e","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            count \u003d max_count - ran"},{"line_number":677,"context_line":"            try:"},{"line_number":678,"context_line":"                found, done \u003d migration_meth(ctxt, count)"},{"line_number":679,"context_line":"            except Exception:"},{"line_number":680,"context_line":"                print(_(\"Error attempting to run %(method)s\") % dict("},{"line_number":681,"context_line":"                      method\u003dmigration_meth))"},{"line_number":682,"context_line":"                found \u003d done \u003d 0"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"            name \u003d migration_meth.__name__"},{"line_number":685,"context_line":"            if found:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_328399cd","side":"PARENT","line":682,"range":{"start_line":679,"start_character":12,"end_line":682,"end_character":32},"in_reply_to":"3f79a3b5_0f23da59","updated":"2018-09-05 13:24:09.000000000","message":"\u003e I know this is for exposing the error for the CI, maybe we CI should test the response, ensure there isn\u0027t any error message?\n\nIt\u0027s not just for the CI - a user was literally hitting this same problem while upgrading to Rocky and reported the issue, but otherwise this wasn\u0027t a failure because we trap the exception, which also means the exit code was still 0.\n\nAn alternative to this is we trap this as before, but save the exception so we can raise it at the end and result in a non-0 exit code, but that seems overly complicated to me. If there is a broken migration method, fix it and then re-run as Chris mentioned; these should be idempotent migrations.\n\nSince Dan has been more heavily involved in the online data migrations I\u0027ll ask him to take a look at this to see what he thinks about options.","commit_id":"5c6b22559d538e63543c38471e60aeb5c7867e8f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"985953fc78a331e67a84aa399ac7ed09556d5c76","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            count \u003d max_count - ran"},{"line_number":677,"context_line":"            try:"},{"line_number":678,"context_line":"                found, done \u003d migration_meth(ctxt, count)"},{"line_number":679,"context_line":"            except Exception:"},{"line_number":680,"context_line":"                print(_(\"Error attempting to run %(method)s\") % dict("},{"line_number":681,"context_line":"                      method\u003dmigration_meth))"},{"line_number":682,"context_line":"                found \u003d done \u003d 0"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"            name \u003d migration_meth.__name__"},{"line_number":685,"context_line":"            if found:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_afa426a4","side":"PARENT","line":682,"range":{"start_line":679,"start_character":12,"end_line":682,"end_character":32},"in_reply_to":"3f79a3b5_0f23da59","updated":"2018-09-05 12:35:41.000000000","message":"Isn\u0027t the idea that the migrations are idempotent, so if you hit an error, you can fix it, and then run the migrations command again and it\u0027s not a big deal. It seems very weird form (to me) to simply ignore the errors.","commit_id":"5c6b22559d538e63543c38471e60aeb5c7867e8f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"929f60008ac2a5075243e0799c72883a7a7c5202","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            count \u003d max_count - ran"},{"line_number":677,"context_line":"            try:"},{"line_number":678,"context_line":"                found, done \u003d migration_meth(ctxt, count)"},{"line_number":679,"context_line":"            except Exception:"},{"line_number":680,"context_line":"                print(_(\"Error attempting to run %(method)s\") % dict("},{"line_number":681,"context_line":"                      method\u003dmigration_meth))"},{"line_number":682,"context_line":"                found \u003d done \u003d 0"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"            name \u003d migration_meth.__name__"},{"line_number":685,"context_line":"            if found:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_3e0e028c","side":"PARENT","line":682,"range":{"start_line":679,"start_character":12,"end_line":682,"end_character":32},"in_reply_to":"3f79a3b5_2599156c","updated":"2018-09-05 15:53:59.000000000","message":"So the reason this is here is because we may not be able to run all the migrations linearly all the time. I think we\u0027ve had at least one case in the past where one migration had to complete before another one could finish. I don\u0027t remember what specifically, and I\u0027m not going to go look it up. I know for sure the DB archiving stuff had many dependencies and making them all idempotent and run until completion was the solution to avoid having to calculate all those links. If you failed on an earlier step and never allowed the later ones to progress, you were stuck.\n\nSo I guess my point is.. I don\u0027t think we should remove the try..except entirely. I think maybe collecting exceptions that we hit, and then re-raising them at the end if we didn\u0027t progress at all would be best. That way, if we hit something transient, but later migrations do work, we just exit with \"okay, did some work, still have more to do\". If we encounter the exception and no other migrations do work, then we raise and say \"okay, we\u0027ve done everything we can but one migration keeps failing, here\u0027s a stack trace.\"\n\nMake sense?","commit_id":"5c6b22559d538e63543c38471e60aeb5c7867e8f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7aa3fe1f47618729aff1bf47920e925282da8750","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            count \u003d max_count - ran"},{"line_number":677,"context_line":"            try:"},{"line_number":678,"context_line":"                found, done \u003d migration_meth(ctxt, count)"},{"line_number":679,"context_line":"            except Exception:"},{"line_number":680,"context_line":"                print(_(\"Error attempting to run %(method)s\") % dict("},{"line_number":681,"context_line":"                      method\u003dmigration_meth))"},{"line_number":682,"context_line":"                found \u003d done \u003d 0"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"            name \u003d migration_meth.__name__"},{"line_number":685,"context_line":"            if found:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_8f9fdb00","side":"PARENT","line":682,"range":{"start_line":679,"start_character":12,"end_line":682,"end_character":32},"in_reply_to":"3f79a3b5_3e0e028c","updated":"2018-09-05 22:04:29.000000000","message":"OK, you likely want to -1 https://review.openstack.org/#/c/600085/ then.","commit_id":"5c6b22559d538e63543c38471e60aeb5c7867e8f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"99792ed133dd7b3fce86d21753aa8348740f3581","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            count \u003d max_count - ran"},{"line_number":677,"context_line":"            try:"},{"line_number":678,"context_line":"                found, done \u003d migration_meth(ctxt, count)"},{"line_number":679,"context_line":"            except Exception:"},{"line_number":680,"context_line":"                print(_(\"Error attempting to run %(method)s\") % dict("},{"line_number":681,"context_line":"                      method\u003dmigration_meth))"},{"line_number":682,"context_line":"                found \u003d done \u003d 0"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"            name \u003d migration_meth.__name__"},{"line_number":685,"context_line":"            if found:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_2599156c","side":"PARENT","line":682,"range":{"start_line":679,"start_character":12,"end_line":682,"end_character":32},"in_reply_to":"3f79a3b5_72cb511d","updated":"2018-09-05 14:04:10.000000000","message":"If this is contentious I can also just pull this out of the change and make it a follow up for further discussion.","commit_id":"5c6b22559d538e63543c38471e60aeb5c7867e8f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"68b5d7b3eaeaab7dff29ef0c4aae4d0fcc8346da","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            count \u003d max_count - ran"},{"line_number":677,"context_line":"            try:"},{"line_number":678,"context_line":"                found, done \u003d migration_meth(ctxt, count)"},{"line_number":679,"context_line":"            except Exception:"},{"line_number":680,"context_line":"                print(_(\"Error attempting to run %(method)s\") % dict("},{"line_number":681,"context_line":"                      method\u003dmigration_meth))"},{"line_number":682,"context_line":"                found \u003d done \u003d 0"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"            name \u003d migration_meth.__name__"},{"line_number":685,"context_line":"            if found:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_72cb511d","side":"PARENT","line":682,"range":{"start_line":679,"start_character":12,"end_line":682,"end_character":32},"in_reply_to":"3f79a3b5_92d5cde8","updated":"2018-09-05 13:27:05.000000000","message":"Arguably a stacktrace is more useful in reporting broken code though, right? I mean, we should assume bugs like this shouldn\u0027t happen, but if they do, we likely want/need a stacktrace to more quickly debug it.","commit_id":"5c6b22559d538e63543c38471e60aeb5c7867e8f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5076031247d61bd84153acaa242053b08000fdf3","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            count \u003d max_count - ran"},{"line_number":677,"context_line":"            try:"},{"line_number":678,"context_line":"                found, done \u003d migration_meth(ctxt, count)"},{"line_number":679,"context_line":"            except Exception:"},{"line_number":680,"context_line":"                print(_(\"Error attempting to run %(method)s\") % dict("},{"line_number":681,"context_line":"                      method\u003dmigration_meth))"},{"line_number":682,"context_line":"                found \u003d done \u003d 0"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"            name \u003d migration_meth.__name__"},{"line_number":685,"context_line":"            if found:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_92d5cde8","side":"PARENT","line":682,"range":{"start_line":679,"start_character":12,"end_line":682,"end_character":32},"in_reply_to":"3f79a3b5_afa426a4","updated":"2018-09-05 13:21:43.000000000","message":"yea, totally agree with you about the idempotent, even we ignore this error, it\u0027s still idempotent.\n\nI just thinking of whether worth a human-readable report what is done, what is not, since operator always complain we don\u0027t have enough log.\n\nIf we just raise this exception, the output like this:\n\nRunning batches of 50 until complete\nAn error has occurred:\nTraceback (most recent call last):\n  File \"/opt/stack/nova/nova/cmd/manage.py\", line 2299, in main\n    ret \u003d fn(*fn_args, **fn_kwargs)\n  File \"/opt/stack/nova/nova/cmd/manage.py\", line 709, in online_data_migrations\n    migrations \u003d self._run_migration(ctxt, max_count)\n  File \"/opt/stack/nova/nova/cmd/manage.py\", line 670, in _run_migration\n    found, done \u003d migration_meth(ctxt, count)\n  File \"/usr/local/lib/python2.7/dist-packages/oslo_db/sqlalchemy/enginefacade.py\", line 993, in wrapper\n    return fn(*args, **kwargs)\n  File \"/opt/stack/nova/nova/api/openstack/placement/objects/consumer.py\", line 39, in create_incomplete_consumers\n    incomplete_proj_id \u003d project_obj.ensure_incomplete_project(ctx)\n  File \"/usr/local/lib/python2.7/dist-packages/oslo_db/sqlalchemy/enginefacade.py\", line 993, in wrapper\n    return fn(*args, **kwargs)\n  File \"/opt/stack/nova/nova/api/openstack/placement/objects/project.py\", line 35, in ensure_incomplete_project\n    res \u003d ctx.session.execute(sel).fetchone()\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py\", line 1176, in execute\n    bind, close_with_result\u003dTrue).execute(clause, params or {})\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py\", line 948, in execute\n    return meth(self, multiparams, params)\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/elements.py\", line 269, in _execute_on_connection\n    return connection._execute_clauseelement(self, multiparams, params)\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py\", line 1060, in _execute_clauseelement\n    compiled_sql, distilled_params\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py\", line 1200, in _execute_context\n    context)\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py\", line 1409, in _handle_dbapi_exception\n    util.raise_from_cause(newraise, exc_info)\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/compat.py\", line 265, in raise_from_cause\n    reraise(type(exception), exception, tb\u003dexc_tb, cause\u003dcause)\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py\", line 1193, in _execute_context\n    context)\n  File \"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py\", line 509, in do_execute\n    cursor.execute(statement, parameters)\n  File \"/usr/local/lib/python2.7/dist-packages/pymysql/cursors.py\", line 166, in execute\n    result \u003d self._query(query)\n  File \"/usr/local/lib/python2.7/dist-packages/pymysql/cursors.py\", line 322, in _query\n    conn.query(q)\n  File \"/usr/local/lib/python2.7/dist-packages/pymysql/connections.py\", line 856, in query\n    self._affected_rows \u003d self._read_query_result(unbuffered\u003dunbuffered)\n  File \"/usr/local/lib/python2.7/dist-packages/pymysql/connections.py\", line 1057, in _read_query_result\n    result.read()\n  File \"/usr/local/lib/python2.7/dist-packages/pymysql/connections.py\", line 1340, in read\n    first_packet \u003d self.connection._read_packet()\n  File \"/usr/local/lib/python2.7/dist-packages/pymysql/connections.py\", line 1014, in _read_packet\n    packet.check_error()\n  File \"/usr/local/lib/python2.7/dist-packages/pymysql/connections.py\", line 393, in check_error\n    err.raise_mysql_exception(self._data)\n  File \"/usr/local/lib/python2.7/dist-packages/pymysql/err.py\", line 107, in raise_mysql_exception\n    raise errorclass(errno, errval)\nProgrammingError: (pymysql.err.ProgrammingError) (1146, u\"Table \u0027nova_cell0.projects\u0027 doesn\u0027t exist\") [SQL: u\u0027SELECT projects.id \\nFROM projects \\nWHERE projects.external_id \u003d %(external_id_1)s\u0027] [parameters: {u\u0027external_id_1\u0027: \u002700000000-0000-0000-0000-000000000000\u0027}] (Background on this error at: http://sqlalche.me/e/f405)\n\n\nThe previous output is more friendly:\n\nhp-pc:/opt/stack/nova alex$ nova-manage db online_data_migrations\nRunning batches of 50 until complete\nError attempting to run \u003cfunction create_incomplete_consumers at 0x7f635690f8c0\u003e\n(pymysql.err.ProgrammingError) (1146, u\"Table \u0027nova_cell0.projects\u0027 doesn\u0027t exist\") [SQL: u\u0027SELECT projects.id \\nFROM projects \\nWHERE projects.external_id \u003d %(external_id_1)s\u0027] [parameters: {u\u0027external_id_1\u0027: \u002700000000-0000-0000-0000-000000000000\u0027}] (Background on this error at: http://sqlalche.me/e/f405)\n+---------------------------------------------+--------------+-----------+\n|                  Migration                  | Total Needed | Completed |\n+---------------------------------------------+--------------+-----------+\n|         create_incomplete_consumers         |      0       |     0     |\n| delete_build_requests_with_no_instance_uuid |      0       |     0     |\n|      migrate_instances_add_request_spec     |      0       |     0     |\n|          migrate_keypairs_to_api_db         |      0       |     0     |\n|       migrate_quota_classes_to_api_db       |      0       |     0     |\n|        migrate_quota_limits_to_api_db       |      0       |     0     |\n|          migration_migrate_to_uuid          |      0       |     0     |\n|     populate_missing_availability_zones     |      0       |     0     |\n|          populate_queued_for_delete         |      0       |     0     |\n|                populate_uuids               |      0       |     0     |\n|     service_uuids_online_data_migration     |      0       |     0     |\n+---------------------------------------------+--------------+-----------+","commit_id":"5c6b22559d538e63543c38471e60aeb5c7867e8f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bc9a2d7f875020f9434534c193e42e1c58a0686d","unresolved":false,"context_lines":[{"line_number":860,"context_line":"        # the placement sync to and with the api sync."},{"line_number":861,"context_line":"        result \u003d True"},{"line_number":862,"context_line":"        if CONF.placement_database.connection is not None:"},{"line_number":863,"context_line":"            # Establish the independent context manager for the placement db."},{"line_number":864,"context_line":"            placement_db.configure(CONF)"},{"line_number":865,"context_line":"            result \u003d migration.db_sync(version2, database\u003d\u0027placement\u0027)"},{"line_number":866,"context_line":"        return migration.db_sync(version2, database\u003d\u0027api\u0027) and result"},{"line_number":867,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_671ddfbc","side":"PARENT","line":864,"range":{"start_line":863,"start_character":12,"end_line":864,"end_character":40},"updated":"2018-09-05 01:35:02.000000000","message":"This is handled via parse_args now.","commit_id":"5c6b22559d538e63543c38471e60aeb5c7867e8f"}],"nova/config.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"8eac4270a2120b6e77b261cc90dc5d5cbde31adf","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    if configure_db:"},{"line_number":64,"context_line":"        sqlalchemy_api.configure(CONF)"},{"line_number":65,"context_line":"        placement_db.configure(CONF)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_3dc7ef9a","line":65,"updated":"2018-09-05 11:32:52.000000000","message":"Is it worth putting a TODO here that this goes away sometime between now and the heat death of the universe?","commit_id":"fb963986c208cde48193f04634ef4888960af625"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dee7bdf0149204c60795a835309a65fa6a09979e","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    if configure_db:"},{"line_number":64,"context_line":"        sqlalchemy_api.configure(CONF)"},{"line_number":65,"context_line":"        placement_db.configure(CONF)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_12fbfd7a","line":65,"in_reply_to":"3f79a3b5_3dc7ef9a","updated":"2018-09-05 13:24:09.000000000","message":"I originally had but it would be redundant because when we delete nova/api/openstack/placement from nova then this will naturally need to go with it.","commit_id":"fb963986c208cde48193f04634ef4888960af625"}]}
