)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3659821a77a28fcf2aa98baab519387674fcbe65","unresolved":false,"context_lines":[{"line_number":16,"context_line":"to schedule and fail quota recheck, because the instance could be"},{"line_number":17,"context_line":"rebuilt from ERROR state in the future."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Some online data migrations create InstanceMapping records and since"},{"line_number":20,"context_line":"the user_id field did not previously exist, they were not setting it."},{"line_number":21,"context_line":"We will populate user_id in these cases."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Finally, during/after an upgrade, soft-deleted servers might be"},{"line_number":24,"context_line":"restored. We need to set user_id on the instance mapping if it is not"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9fdfeff1_a2ca2743","line":21,"range":{"start_line":19,"start_character":0,"end_line":21,"end_character":40},"updated":"2019-02-22 19:46:00.000000000","message":"This is the VirtualInterface object change right? The online data migration is still going to have to deal with any existing instance mappings that didn\u0027t have a user_id though, right? And potentially marker instances that don\u0027t have a user_id?","commit_id":"411b81289305ca4675725ecdc3131944319d7586"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2a1fe3e715a4265d68e31bec49b00e953e745907","unresolved":false,"context_lines":[{"line_number":16,"context_line":"to schedule and fail quota recheck, because the instance could be"},{"line_number":17,"context_line":"rebuilt from ERROR state in the future."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Some online data migrations create InstanceMapping records and since"},{"line_number":20,"context_line":"the user_id field did not previously exist, they were not setting it."},{"line_number":21,"context_line":"We will populate user_id in these cases."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Finally, during/after an upgrade, soft-deleted servers might be"},{"line_number":24,"context_line":"restored. We need to set user_id on the instance mapping if it is not"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9fdfeff1_c50df5e8","line":21,"range":{"start_line":19,"start_character":0,"end_line":21,"end_character":40},"in_reply_to":"9fdfeff1_022a13e6","updated":"2019-02-22 20:36:59.000000000","message":"Right. I added that to handle it, and also went ahead and updated the VirtualInterface object behavior to set the FAKE_UUID since I think it makes sense to do that anyhow. Since we know map_instances is going to pull user_id from instances to fill in InstanceMapping.user_id.","commit_id":"411b81289305ca4675725ecdc3131944319d7586"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"270835d12268ab73816f2366b1c4b89e82e4b476","unresolved":false,"context_lines":[{"line_number":16,"context_line":"to schedule and fail quota recheck, because the instance could be"},{"line_number":17,"context_line":"rebuilt from ERROR state in the future."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Some online data migrations create InstanceMapping records and since"},{"line_number":20,"context_line":"the user_id field did not previously exist, they were not setting it."},{"line_number":21,"context_line":"We will populate user_id in these cases."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Finally, during/after an upgrade, soft-deleted servers might be"},{"line_number":24,"context_line":"restored. We need to set user_id on the instance mapping if it is not"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9fdfeff1_022a13e6","line":21,"range":{"start_line":19,"start_character":0,"end_line":21,"end_character":40},"in_reply_to":"9fdfeff1_a2ca2743","updated":"2019-02-22 19:47:56.000000000","message":"Looks like you do handle it now:\n\nhttps://review.openstack.org/#/c/633351/6..10/nova/objects/instance_mapping.py@249","commit_id":"411b81289305ca4675725ecdc3131944319d7586"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e0443ac7ff8d592393e3bc7f0365273fd0bde38b","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"During an upgrade, online data migrations will run via nova-manage and"},{"line_number":13,"context_line":"in-flight server create requests might be scheduled across the upgrade"},{"line_number":14,"context_line":"boundary. We need to populate the user_id on new schedules. We can also"},{"line_number":15,"context_line":"opportunistically set user_id on instance mappings that fail to"},{"line_number":16,"context_line":"schedule and fail quota recheck, since we are updating the instance"},{"line_number":17,"context_line":"mapping (with a cell) anyway. These instances could be rebuilt from"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9fdfeff1_a6d0a020","line":14,"range":{"start_line":14,"start_character":10,"end_line":14,"end_character":59},"updated":"2019-02-27 20:10:44.000000000","message":"Which we can (will) do in the API _populate_instances method, correct?\n\n(later) yes you do it in this change","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e0443ac7ff8d592393e3bc7f0365273fd0bde38b","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"During an upgrade, online data migrations will run via nova-manage and"},{"line_number":13,"context_line":"in-flight server create requests might be scheduled across the upgrade"},{"line_number":14,"context_line":"boundary. We need to populate the user_id on new schedules. We can also"},{"line_number":15,"context_line":"opportunistically set user_id on instance mappings that fail to"},{"line_number":16,"context_line":"schedule and fail quota recheck, since we are updating the instance"},{"line_number":17,"context_line":"mapping (with a cell) anyway. These instances could be rebuilt from"},{"line_number":18,"context_line":"ERROR state by the user."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Some online data migrations create InstanceMapping records and since"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9fdfeff1_268b501f","line":17,"range":{"start_line":14,"start_character":60,"end_line":17,"end_character":29},"updated":"2019-02-27 20:10:44.000000000","message":"These would already be set when they run through the API. Do you think we\u0027re actually going to handle a window of time during an upgrade where the API is not populating the user_id but instances are being scheduled? Or said another way: the API is down but conductor/scheduler are still cranking along with an instance?\n\nEven if we did hit that window, wouldn\u0027t the online data migration handle it for us?","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"bbc8b729737ea3a34dbb727f3f8073eb24ad4889","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"During an upgrade, online data migrations will run via nova-manage and"},{"line_number":13,"context_line":"in-flight server create requests might be scheduled across the upgrade"},{"line_number":14,"context_line":"boundary. We need to populate the user_id on new schedules. We can also"},{"line_number":15,"context_line":"opportunistically set user_id on instance mappings that fail to"},{"line_number":16,"context_line":"schedule and fail quota recheck, since we are updating the instance"},{"line_number":17,"context_line":"mapping (with a cell) anyway. These instances could be rebuilt from"},{"line_number":18,"context_line":"ERROR state by the user."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Some online data migrations create InstanceMapping records and since"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9fdfeff1_964ca53f","line":17,"range":{"start_line":14,"start_character":60,"end_line":17,"end_character":29},"in_reply_to":"9fdfeff1_268b501f","updated":"2019-02-27 22:53:11.000000000","message":"It\u0027s very specific timing, but I was thinking of something like:\n\nold API takes server create request \u003d\u003e upgrade API host \u003d\u003e run nova-manage online_data_migrations while cell_id\u003dNULL \u003d\u003e server gets to conductor afterward \n\nWith the existing implementation of populate_user_id, we\u0027d miss migrating such a case. But since our IRC discussion, I\u0027m going to rework the migration so that it will not miss isntance mappings with user_id\u003dNULL and cell_id\u003dNULL.","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e0443ac7ff8d592393e3bc7f0365273fd0bde38b","unresolved":false,"context_lines":[{"line_number":14,"context_line":"boundary. We need to populate the user_id on new schedules. We can also"},{"line_number":15,"context_line":"opportunistically set user_id on instance mappings that fail to"},{"line_number":16,"context_line":"schedule and fail quota recheck, since we are updating the instance"},{"line_number":17,"context_line":"mapping (with a cell) anyway. These instances could be rebuilt from"},{"line_number":18,"context_line":"ERROR state by the user."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Some online data migrations create InstanceMapping records and since"},{"line_number":21,"context_line":"the user_id field did not previously exist, they were not setting it."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9fdfeff1_06840c0a","line":18,"range":{"start_line":17,"start_character":30,"end_line":18,"end_character":24},"updated":"2019-02-27 20:10:44.000000000","message":"No they can\u0027t, because you can\u0027t rebuild from cell0 (the instance.host must be set). At least until pre-emptible instance support is in-tree, which it\u0027s not yet.","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"bbc8b729737ea3a34dbb727f3f8073eb24ad4889","unresolved":false,"context_lines":[{"line_number":14,"context_line":"boundary. We need to populate the user_id on new schedules. We can also"},{"line_number":15,"context_line":"opportunistically set user_id on instance mappings that fail to"},{"line_number":16,"context_line":"schedule and fail quota recheck, since we are updating the instance"},{"line_number":17,"context_line":"mapping (with a cell) anyway. These instances could be rebuilt from"},{"line_number":18,"context_line":"ERROR state by the user."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Some online data migrations create InstanceMapping records and since"},{"line_number":21,"context_line":"the user_id field did not previously exist, they were not setting it."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9fdfeff1_766a6181","line":18,"range":{"start_line":17,"start_character":30,"end_line":18,"end_character":24},"in_reply_to":"9fdfeff1_06840c0a","updated":"2019-02-27 22:53:11.000000000","message":"Ah, right. My bad. I was thinking of the old way, before cell0.","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"}],"nova/compute/api.py":[{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"88ae250395b3ec6b158fd1a12823b4872d985c33","unresolved":false,"context_lines":[{"line_number":2285,"context_line":"            instance.task_state \u003d None"},{"line_number":2286,"context_line":"            instance.deleted_at \u003d None"},{"line_number":2287,"context_line":"            instance.save(expected_task_state\u003d[None])"},{"line_number":2288,"context_line":"        im \u003d self._update_queued_for_deletion(context, instance, False)"},{"line_number":2289,"context_line":"        # Soft-deleted instances were not included in the data migration to"},{"line_number":2290,"context_line":"        # populate user_id, so set it if it\u0027s NULL."},{"line_number":2291,"context_line":"        if \u0027user_id\u0027 not in im or im.user_id is None:"},{"line_number":2292,"context_line":"            im.user_id \u003d instance.user_id"},{"line_number":2293,"context_line":"            im.save()"},{"line_number":2294,"context_line":""},{"line_number":2295,"context_line":"    @check_instance_lock"},{"line_number":2296,"context_line":"    @check_instance_state(task_state\u003dNone,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_51155548","line":2293,"range":{"start_line":2288,"start_character":8,"end_line":2293,"end_character":21},"updated":"2019-02-22 08:38:39.000000000","message":"yep this works I am fine this this, else the other way I was suggesting in the previous patchset (sorry for not making it clearer) which might also avoid the extra save/returning the instance_mapping is to do something like this:\n\n def _update_queued_for_delete_and_user_id(context, instance, qfd)\n     ...\n     ...\n     if not qfd:\n         im.user_id \u003d instance.user_id\n     im.save()\n\nfrom the restore function alone we pass the qfd as False and for the rest of the deletes its True. So we could just make use of that flag, might make the code cleaner.\n\nAnyhow I don\u0027t mind either of the ways, whichever works for you.\n\nI see you have the comment saying its because we didn\u0027t add this in the data migration which is good, which also means this is only for the transition period right ? After a while we could stop doing this once we are sure we would have caught all the NULL cases ? Maybe you could put a TODO to remove this.","commit_id":"411b81289305ca4675725ecdc3131944319d7586"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"417eb36b1efefbd701765079deb203f9057ecd18","unresolved":false,"context_lines":[{"line_number":2285,"context_line":"            instance.task_state \u003d None"},{"line_number":2286,"context_line":"            instance.deleted_at \u003d None"},{"line_number":2287,"context_line":"            instance.save(expected_task_state\u003d[None])"},{"line_number":2288,"context_line":"        im \u003d self._update_queued_for_deletion(context, instance, False)"},{"line_number":2289,"context_line":"        # Soft-deleted instances were not included in the data migration to"},{"line_number":2290,"context_line":"        # populate user_id, so set it if it\u0027s NULL."},{"line_number":2291,"context_line":"        if \u0027user_id\u0027 not in im or im.user_id is None:"},{"line_number":2292,"context_line":"            im.user_id \u003d instance.user_id"},{"line_number":2293,"context_line":"            im.save()"},{"line_number":2294,"context_line":""},{"line_number":2295,"context_line":"    @check_instance_lock"},{"line_number":2296,"context_line":"    @check_instance_state(task_state\u003dNone,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_b80c9942","line":2293,"range":{"start_line":2288,"start_character":8,"end_line":2293,"end_character":21},"in_reply_to":"9fdfeff1_51155548","updated":"2019-02-22 17:34:38.000000000","message":"A-ha, thanks. I like this way you suggest -- will update.\n\nHm, thinking about it, if we don\u0027t migrate soft-deleted instances, we can\u0027t ever be 100% sure we are done with data migrations because someone could theoretically restore a soft-deleted instance at any time in the future (several releases later).\n\nSo maybe what I really need to do is go back and add soft-deleted instances back to the migration. Then I could add the TODO here to remove this in the T release.","commit_id":"411b81289305ca4675725ecdc3131944319d7586"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"25d9a67e926dd7c2ec51a3684cfce4923d54f04b","unresolved":false,"context_lines":[{"line_number":2285,"context_line":"            instance.task_state \u003d None"},{"line_number":2286,"context_line":"            instance.deleted_at \u003d None"},{"line_number":2287,"context_line":"            instance.save(expected_task_state\u003d[None])"},{"line_number":2288,"context_line":"        im \u003d self._update_queued_for_deletion(context, instance, False)"},{"line_number":2289,"context_line":"        # Soft-deleted instances were not included in the data migration to"},{"line_number":2290,"context_line":"        # populate user_id, so set it if it\u0027s NULL."},{"line_number":2291,"context_line":"        if \u0027user_id\u0027 not in im or im.user_id is None:"},{"line_number":2292,"context_line":"            im.user_id \u003d instance.user_id"},{"line_number":2293,"context_line":"            im.save()"},{"line_number":2294,"context_line":""},{"line_number":2295,"context_line":"    @check_instance_lock"},{"line_number":2296,"context_line":"    @check_instance_state(task_state\u003dNone,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_8cb07a8d","line":2293,"range":{"start_line":2288,"start_character":8,"end_line":2293,"end_character":21},"in_reply_to":"9fdfeff1_6ca676ae","updated":"2019-02-22 18:09:36.000000000","message":"I\u0027m hoping I can pull only the soft-deleted mappings, but maybe that\u0027s not possible? I have to try it out.\n\nWell, maybe, but because a deployer can run the \u0027nova-manage online_data_migrations\u0027 command at any point during the upgrade, we also attempt to actively migrate records when sensible, to do some migration up to the point where the \u0027nova-manage\u0027 command is run. For that reason, I would leave this here with a TODO on it.","commit_id":"411b81289305ca4675725ecdc3131944319d7586"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"429c6a6859a19deeb5c2575ad747995229c4eae0","unresolved":false,"context_lines":[{"line_number":2285,"context_line":"            instance.task_state \u003d None"},{"line_number":2286,"context_line":"            instance.deleted_at \u003d None"},{"line_number":2287,"context_line":"            instance.save(expected_task_state\u003d[None])"},{"line_number":2288,"context_line":"        im \u003d self._update_queued_for_deletion(context, instance, False)"},{"line_number":2289,"context_line":"        # Soft-deleted instances were not included in the data migration to"},{"line_number":2290,"context_line":"        # populate user_id, so set it if it\u0027s NULL."},{"line_number":2291,"context_line":"        if \u0027user_id\u0027 not in im or im.user_id is None:"},{"line_number":2292,"context_line":"            im.user_id \u003d instance.user_id"},{"line_number":2293,"context_line":"            im.save()"},{"line_number":2294,"context_line":""},{"line_number":2295,"context_line":"    @check_instance_lock"},{"line_number":2296,"context_line":"    @check_instance_state(task_state\u003dNone,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_4f47e4bd","line":2293,"range":{"start_line":2288,"start_character":8,"end_line":2293,"end_character":21},"in_reply_to":"9fdfeff1_8cb07a8d","updated":"2019-02-22 18:51:07.000000000","message":"(later) Indeed, it\u0027s not possible to pull only soft-deleted instances -- have to pull deleted and soft-deleted and ignore the deleted ones, at best.","commit_id":"411b81289305ca4675725ecdc3131944319d7586"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"d90295c2ce77381e14cdf782a118952901cb154e","unresolved":false,"context_lines":[{"line_number":2285,"context_line":"            instance.task_state \u003d None"},{"line_number":2286,"context_line":"            instance.deleted_at \u003d None"},{"line_number":2287,"context_line":"            instance.save(expected_task_state\u003d[None])"},{"line_number":2288,"context_line":"        im \u003d self._update_queued_for_deletion(context, instance, False)"},{"line_number":2289,"context_line":"        # Soft-deleted instances were not included in the data migration to"},{"line_number":2290,"context_line":"        # populate user_id, so set it if it\u0027s NULL."},{"line_number":2291,"context_line":"        if \u0027user_id\u0027 not in im or im.user_id is None:"},{"line_number":2292,"context_line":"            im.user_id \u003d instance.user_id"},{"line_number":2293,"context_line":"            im.save()"},{"line_number":2294,"context_line":""},{"line_number":2295,"context_line":"    @check_instance_lock"},{"line_number":2296,"context_line":"    @check_instance_state(task_state\u003dNone,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_6ca676ae","line":2293,"range":{"start_line":2288,"start_character":8,"end_line":2293,"end_character":21},"in_reply_to":"9fdfeff1_b80c9942","updated":"2019-02-22 17:57:37.000000000","message":"\u003e A-ha, thanks. I like this way you suggest -- will update.\n \u003e \n \u003e Hm, thinking about it, if we don\u0027t migrate soft-deleted instances,\n \u003e we can\u0027t ever be 100% sure we are done with data migrations because\n \u003e someone could theoretically restore a soft-deleted instance at any\n \u003e time in the future (several releases later).\n\ntrue. \n\n \u003e \n \u003e So maybe what I really need to do is go back and add soft-deleted\n \u003e instances back to the migration. \n\nThat means you have to also pull the deleted mappings ?\n\n\u003e Then I could add the TODO here to\n \u003e remove this in the T release.\n\nOh if you finish it in the migrations then we don\u0027t need it here I guess ?","commit_id":"411b81289305ca4675725ecdc3131944319d7586"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a594ac795f287008c2a6ffa561a9c8bf33572e70","unresolved":false,"context_lines":[{"line_number":947,"context_line":"                inst_mapping \u003d objects.InstanceMapping(context\u003dcontext)"},{"line_number":948,"context_line":"                inst_mapping.instance_uuid \u003d instance_uuid"},{"line_number":949,"context_line":"                inst_mapping.project_id \u003d context.project_id"},{"line_number":950,"context_line":"                inst_mapping.user_id \u003d context.user_id"},{"line_number":951,"context_line":"                inst_mapping.cell_mapping \u003d None"},{"line_number":952,"context_line":"                inst_mapping.create()"},{"line_number":953,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_f17ae074","line":950,"updated":"2019-02-27 19:49:14.000000000","message":"Per my comment on the patch before this, I expect this is the only place we actually create instance mappings, and thus the optional-ness of it in the object implementation is to reduce unit test fallout, not actual functional code.","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"bbc8b729737ea3a34dbb727f3f8073eb24ad4889","unresolved":false,"context_lines":[{"line_number":947,"context_line":"                inst_mapping \u003d objects.InstanceMapping(context\u003dcontext)"},{"line_number":948,"context_line":"                inst_mapping.instance_uuid \u003d instance_uuid"},{"line_number":949,"context_line":"                inst_mapping.project_id \u003d context.project_id"},{"line_number":950,"context_line":"                inst_mapping.user_id \u003d context.user_id"},{"line_number":951,"context_line":"                inst_mapping.cell_mapping \u003d None"},{"line_number":952,"context_line":"                inst_mapping.create()"},{"line_number":953,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_360619d0","line":950,"in_reply_to":"9fdfeff1_f17ae074","updated":"2019-02-27 22:53:11.000000000","message":"Replied to your comment on the patch before this.","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e0443ac7ff8d592393e3bc7f0365273fd0bde38b","unresolved":false,"context_lines":[{"line_number":2197,"context_line":"        im \u003d objects.InstanceMapping.get_by_instance_uuid(context,"},{"line_number":2198,"context_line":"                                                          instance.uuid)"},{"line_number":2199,"context_line":"        im.queued_for_delete \u003d qfd"},{"line_number":2200,"context_line":"        if not qfd and im.user_id is None:"},{"line_number":2201,"context_line":"            # If we\u0027re un-deleting an instance (soft-delete restore), go ahead"},{"line_number":2202,"context_line":"            # and migrate the user_id if it\u0027s not yet migrated."},{"line_number":2203,"context_line":"            # TODO(melwitt): This setting of user_id can be removed in the"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_66c2b836","line":2200,"range":{"start_line":2200,"start_character":23,"end_line":2200,"end_character":33},"updated":"2019-02-27 20:10:44.000000000","message":"And this should always be set because it will be null in the database for old instances and _from_db_object will set it.","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e0443ac7ff8d592393e3bc7f0365273fd0bde38b","unresolved":false,"context_lines":[{"line_number":2446,"context_line":"                                        uuid\u003duuid,"},{"line_number":2447,"context_line":"                                        project_id\u003dim.project_id,"},{"line_number":2448,"context_line":"                                        created_at\u003dim.created_at,"},{"line_number":2449,"context_line":"                                        user_id\u003drs.user_id,"},{"line_number":2450,"context_line":"                                        flavor\u003drs.flavor,"},{"line_number":2451,"context_line":"                                        image_ref\u003dimage_ref,"},{"line_number":2452,"context_line":"                                        availability_zone\u003drs.availability_zone)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_71d7d0ef","line":2449,"range":{"start_line":2449,"start_character":40,"end_line":2449,"end_character":59},"updated":"2019-02-27 20:10:44.000000000","message":"In this case the RequestSpec.user_id could also be None, so _save_user_id_in_instance_mapping might not actually change anything, but it shouldn\u0027t hurt either.","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"bbc8b729737ea3a34dbb727f3f8073eb24ad4889","unresolved":false,"context_lines":[{"line_number":2446,"context_line":"                                        uuid\u003duuid,"},{"line_number":2447,"context_line":"                                        project_id\u003dim.project_id,"},{"line_number":2448,"context_line":"                                        created_at\u003dim.created_at,"},{"line_number":2449,"context_line":"                                        user_id\u003drs.user_id,"},{"line_number":2450,"context_line":"                                        flavor\u003drs.flavor,"},{"line_number":2451,"context_line":"                                        image_ref\u003dimage_ref,"},{"line_number":2452,"context_line":"                                        availability_zone\u003drs.availability_zone)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_362ff93f","line":2449,"range":{"start_line":2449,"start_character":40,"end_line":2449,"end_character":59},"in_reply_to":"9fdfeff1_71d7d0ef","updated":"2019-02-27 22:53:11.000000000","message":"Ah, thanks. I wasn\u0027t 100% whether it would be set here -- I assumed \"probably\" if the minimally constructed instance is bothering to set it from RequestSpec.user_id.","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d26ef3c036de708efb5129ea90bb280b657da7f2","unresolved":false,"context_lines":[{"line_number":2440,"context_line":"    def _save_user_id_in_instance_mapping(mapping, instance):"},{"line_number":2441,"context_line":"        # TODO(melwitt): We take the opportunity to migrate user_id on the"},{"line_number":2442,"context_line":"        # instance mapping if it\u0027s not yet been migrated. This can be removed"},{"line_number":2443,"context_line":"        # in the T release, when all migrations are complete."},{"line_number":2444,"context_line":"        if \u0027user_id\u0027 not in mapping:"},{"line_number":2445,"context_line":"            mapping.user_id \u003d instance.user_id"},{"line_number":2446,"context_line":"            mapping.save()"}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_69aa2a86","line":2443,"range":{"start_line":2443,"start_character":13,"end_line":2443,"end_character":18},"updated":"2019-03-06 19:08:17.000000000","message":"nit: I\u0027d probably say \"a future release\" to be safe, because if we land this in Stein, people will be migrating before getting to Stein or during Stein, and then if we are going to drop in Train we\u0027d have to add a blocker migration so people can\u0027t get to Train without running the online data migration first, so it\u0027s a tricky dance - you\u0027d have to leave the online data migration in Train so people that upgrade before completing the data migration can still do so, meanwhile dropping the compatibility code in the API....\n\nAnyway, ramblings but I\u0027ve seen enough of \"drop this in Pike\" or \"drop this in Queens\" type stuff still lying around to know we\u0027re not great about following up.","commit_id":"d24275951d3ad0e0ae00621971278aeedf2bfd09"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"911b5117e7b3f5387f43e6235d87b9e1abaddc92","unresolved":false,"context_lines":[{"line_number":2440,"context_line":"    def _save_user_id_in_instance_mapping(mapping, instance):"},{"line_number":2441,"context_line":"        # TODO(melwitt): We take the opportunity to migrate user_id on the"},{"line_number":2442,"context_line":"        # instance mapping if it\u0027s not yet been migrated. This can be removed"},{"line_number":2443,"context_line":"        # in the T release, when all migrations are complete."},{"line_number":2444,"context_line":"        if \u0027user_id\u0027 not in mapping:"},{"line_number":2445,"context_line":"            mapping.user_id \u003d instance.user_id"},{"line_number":2446,"context_line":"            mapping.save()"}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_f1d12459","line":2443,"range":{"start_line":2443,"start_character":13,"end_line":2443,"end_character":18},"in_reply_to":"5fc1f717_69aa2a86","updated":"2019-03-06 19:29:45.000000000","message":"Good points, will change.","commit_id":"d24275951d3ad0e0ae00621971278aeedf2bfd09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d26ef3c036de708efb5129ea90bb280b657da7f2","unresolved":false,"context_lines":[{"line_number":2442,"context_line":"        # instance mapping if it\u0027s not yet been migrated. This can be removed"},{"line_number":2443,"context_line":"        # in the T release, when all migrations are complete."},{"line_number":2444,"context_line":"        if \u0027user_id\u0027 not in mapping:"},{"line_number":2445,"context_line":"            mapping.user_id \u003d instance.user_id"},{"line_number":2446,"context_line":"            mapping.save()"},{"line_number":2447,"context_line":""},{"line_number":2448,"context_line":"    def _get_instance_from_cell(self, context, im, expected_attrs,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_8988b61f","line":2445,"range":{"start_line":2445,"start_character":12,"end_line":2445,"end_character":46},"updated":"2019-03-06 19:08:17.000000000","message":"From L2491 if this is an instance from a down cell where the user_id is set from the RequestSpec, the user_id here might be None which will blow up because InstanceMapping.user_id is not nullable but RequestSpec.user_id and Instance.user_id are nullable. -1 for that.","commit_id":"d24275951d3ad0e0ae00621971278aeedf2bfd09"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"911b5117e7b3f5387f43e6235d87b9e1abaddc92","unresolved":false,"context_lines":[{"line_number":2442,"context_line":"        # instance mapping if it\u0027s not yet been migrated. This can be removed"},{"line_number":2443,"context_line":"        # in the T release, when all migrations are complete."},{"line_number":2444,"context_line":"        if \u0027user_id\u0027 not in mapping:"},{"line_number":2445,"context_line":"            mapping.user_id \u003d instance.user_id"},{"line_number":2446,"context_line":"            mapping.save()"},{"line_number":2447,"context_line":""},{"line_number":2448,"context_line":"    def _get_instance_from_cell(self, context, im, expected_attrs,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_71dc5474","line":2445,"range":{"start_line":2445,"start_character":12,"end_line":2445,"end_character":46},"in_reply_to":"5fc1f717_8988b61f","updated":"2019-03-06 19:29:45.000000000","message":"Ah, thank you for catching that.","commit_id":"d24275951d3ad0e0ae00621971278aeedf2bfd09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"71f2da0aa6fc684c7476a8e19e798b4494111ec6","unresolved":false,"context_lines":[{"line_number":2444,"context_line":"        # If the instance came from a RequestSpec because of a down cell, its"},{"line_number":2445,"context_line":"        # user_id could be None and the InstanceMapping.user_id field is"},{"line_number":2446,"context_line":"        # non-nullable. Avoid trying to set/save the user_id in that case."},{"line_number":2447,"context_line":"        if \u0027user_id\u0027 not in mapping and instance.user_id is not None:"},{"line_number":2448,"context_line":"            mapping.user_id \u003d instance.user_id"},{"line_number":2449,"context_line":"            mapping.save()"},{"line_number":2450,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_e03f08d4","line":2447,"range":{"start_line":2447,"start_character":36,"end_line":2447,"end_character":69},"updated":"2019-03-07 00:00:38.000000000","message":"Should have a simple test wrinkle for this in test_save_user_id_in_instance_mapping.","commit_id":"5e5b60ad0b468843bd4f11599a4e3f5ee6709598"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9f70d1c86e85972e5e0bb48cb6ad8765a58e8087","unresolved":false,"context_lines":[{"line_number":2444,"context_line":"        # If the instance came from a RequestSpec because of a down cell, its"},{"line_number":2445,"context_line":"        # user_id could be None and the InstanceMapping.user_id field is"},{"line_number":2446,"context_line":"        # non-nullable. Avoid trying to set/save the user_id in that case."},{"line_number":2447,"context_line":"        if \u0027user_id\u0027 not in mapping and instance.user_id is not None:"},{"line_number":2448,"context_line":"            mapping.user_id \u003d instance.user_id"},{"line_number":2449,"context_line":"            mapping.save()"},{"line_number":2450,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"5fc1f717_6e59b958","line":2447,"updated":"2019-03-07 15:55:26.000000000","message":"might be good to put a LOG.info() in here...","commit_id":"afbe4abba881c75fef2d4ef864334d5d91181d8c"}],"nova/conductor/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e0443ac7ff8d592393e3bc7f0365273fd0bde38b","unresolved":false,"context_lines":[{"line_number":494,"context_line":""},{"line_number":495,"context_line":"    @staticmethod"},{"line_number":496,"context_line":"    def _set_user_id_in_instance_mapping(mapping, instance):"},{"line_number":497,"context_line":"        # If we are in the middle of an upgrade, populate user_id once we know"},{"line_number":498,"context_line":"        # the cell."},{"line_number":499,"context_line":"        if mapping.user_id is None:"},{"line_number":500,"context_line":"            mapping.user_id \u003d instance.user_id"},{"line_number":501,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_510acc89","line":498,"range":{"start_line":497,"start_character":66,"end_line":498,"end_character":19},"updated":"2019-02-27 20:10:44.000000000","message":"Again, we should know the user_id long before scheduling.","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"bbc8b729737ea3a34dbb727f3f8073eb24ad4889","unresolved":false,"context_lines":[{"line_number":494,"context_line":""},{"line_number":495,"context_line":"    @staticmethod"},{"line_number":496,"context_line":"    def _set_user_id_in_instance_mapping(mapping, instance):"},{"line_number":497,"context_line":"        # If we are in the middle of an upgrade, populate user_id once we know"},{"line_number":498,"context_line":"        # the cell."},{"line_number":499,"context_line":"        if mapping.user_id is None:"},{"line_number":500,"context_line":"            mapping.user_id \u003d instance.user_id"},{"line_number":501,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_d61d4d0f","line":498,"range":{"start_line":497,"start_character":66,"end_line":498,"end_character":19},"in_reply_to":"9fdfeff1_510acc89","updated":"2019-02-27 22:53:11.000000000","message":"Yeah, this was the tight window thing.","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e0443ac7ff8d592393e3bc7f0365273fd0bde38b","unresolved":false,"context_lines":[{"line_number":526,"context_line":"                return None"},{"line_number":527,"context_line":"            else:"},{"line_number":528,"context_line":"                inst_mapping.cell_mapping \u003d host_mapping.cell_mapping"},{"line_number":529,"context_line":"                self._set_user_id_in_instance_mapping(inst_mapping, instance)"},{"line_number":530,"context_line":"                inst_mapping.save()"},{"line_number":531,"context_line":"        return inst_mapping"},{"line_number":532,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_f131805a","line":529,"updated":"2019-02-27 20:10:44.000000000","message":"We should have already set it in the API before we hit this.","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e0443ac7ff8d592393e3bc7f0365273fd0bde38b","unresolved":false,"context_lines":[{"line_number":1240,"context_line":"                        objects.InstanceMapping.get_by_instance_uuid("},{"line_number":1241,"context_line":"                            context, instance.uuid)"},{"line_number":1242,"context_line":"                    inst_mapping.cell_mapping \u003d cell0"},{"line_number":1243,"context_line":"                    self._set_user_id_in_instance_mapping(inst_mapping,"},{"line_number":1244,"context_line":"                                                          instance)"},{"line_number":1245,"context_line":"                    inst_mapping.save()"},{"line_number":1246,"context_line":"                except exception.InstanceMappingNotFound:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_d13a3c32","line":1243,"updated":"2019-02-27 20:10:44.000000000","message":"same","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e0443ac7ff8d592393e3bc7f0365273fd0bde38b","unresolved":false,"context_lines":[{"line_number":1396,"context_line":"            inst_mapping \u003d objects.InstanceMapping.get_by_instance_uuid("},{"line_number":1397,"context_line":"                context, instance.uuid)"},{"line_number":1398,"context_line":"            inst_mapping.cell_mapping \u003d cell"},{"line_number":1399,"context_line":"            self._set_user_id_in_instance_mapping(inst_mapping, instance)"},{"line_number":1400,"context_line":"            inst_mapping.save()"},{"line_number":1401,"context_line":""},{"line_number":1402,"context_line":"            if not self._delete_build_request("}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_3115c89c","line":1399,"updated":"2019-02-27 20:10:44.000000000","message":"same","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e0443ac7ff8d592393e3bc7f0365273fd0bde38b","unresolved":false,"context_lines":[{"line_number":1446,"context_line":"            inst_mapping \u003d objects.InstanceMapping.get_by_instance_uuid("},{"line_number":1447,"context_line":"                context, instance.uuid)"},{"line_number":1448,"context_line":"            inst_mapping.cell_mapping \u003d cell"},{"line_number":1449,"context_line":"            self._set_user_id_in_instance_mapping(inst_mapping, instance)"},{"line_number":1450,"context_line":"            inst_mapping.save()"},{"line_number":1451,"context_line":""},{"line_number":1452,"context_line":"            # In order to properly clean-up volumes when deleting a server in"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_51188cd1","line":1449,"updated":"2019-02-27 20:10:44.000000000","message":"same","commit_id":"657439ec6d86324d1aef73de0cb76aa8cc4467bc"}],"nova/tests/unit/compute/test_compute_api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d26ef3c036de708efb5129ea90bb280b657da7f2","unresolved":false,"context_lines":[{"line_number":5799,"context_line":"        im1 \u003d objects.InstanceMapping(instance_uuid\u003duuids.inst1,"},{"line_number":5800,"context_line":"                                      cell_mapping\u003dcell_mapping,"},{"line_number":5801,"context_line":"                                      queued_for_delete\u003dTrue)"},{"line_number":5802,"context_line":"        # Verify that user_id is populated during a compute_api.get()."},{"line_number":5803,"context_line":"        im2 \u003d objects.InstanceMapping(instance_uuid\u003duuids.inst2,"},{"line_number":5804,"context_line":"                                      cell_mapping\u003dcell_mapping,"},{"line_number":5805,"context_line":"                                      queued_for_delete\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_899d165b","line":5802,"range":{"start_line":5802,"start_character":8,"end_line":5802,"end_character":70},"updated":"2019-03-06 19:08:17.000000000","message":"This would be more clear if it was by the new assert below.","commit_id":"d24275951d3ad0e0ae00621971278aeedf2bfd09"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"911b5117e7b3f5387f43e6235d87b9e1abaddc92","unresolved":false,"context_lines":[{"line_number":5799,"context_line":"        im1 \u003d objects.InstanceMapping(instance_uuid\u003duuids.inst1,"},{"line_number":5800,"context_line":"                                      cell_mapping\u003dcell_mapping,"},{"line_number":5801,"context_line":"                                      queued_for_delete\u003dTrue)"},{"line_number":5802,"context_line":"        # Verify that user_id is populated during a compute_api.get()."},{"line_number":5803,"context_line":"        im2 \u003d objects.InstanceMapping(instance_uuid\u003duuids.inst2,"},{"line_number":5804,"context_line":"                                      cell_mapping\u003dcell_mapping,"},{"line_number":5805,"context_line":"                                      queued_for_delete\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_d1d0a853","line":5802,"range":{"start_line":5802,"start_character":8,"end_line":5802,"end_character":70},"in_reply_to":"5fc1f717_899d165b","updated":"2019-03-06 19:29:45.000000000","message":"Will update.","commit_id":"d24275951d3ad0e0ae00621971278aeedf2bfd09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d26ef3c036de708efb5129ea90bb280b657da7f2","unresolved":false,"context_lines":[{"line_number":6024,"context_line":"        # instance from the proper cell will be added when that capability is."},{"line_number":6025,"context_line":"        instance \u003d self._create_instance_obj()"},{"line_number":6026,"context_line":"        build_req_obj \u003d fake_build_request.fake_req_obj(self.context)"},{"line_number":6027,"context_line":"        # Verify that user_id is populated during a compute_api.get()."},{"line_number":6028,"context_line":"        inst_map \u003d objects.InstanceMapping(cell_mapping\u003dobjects.CellMapping("},{"line_number":6029,"context_line":"            uuid\u003duuids.cell), instance_uuid\u003dinstance.uuid)"},{"line_number":6030,"context_line":"        mock_get_inst_map.return_value \u003d inst_map"}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_499f2e50","line":6027,"range":{"start_line":6027,"start_character":8,"end_line":6027,"end_character":70},"updated":"2019-03-06 19:08:17.000000000","message":"same - move this by the new assert for context","commit_id":"d24275951d3ad0e0ae00621971278aeedf2bfd09"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"911b5117e7b3f5387f43e6235d87b9e1abaddc92","unresolved":false,"context_lines":[{"line_number":6024,"context_line":"        # instance from the proper cell will be added when that capability is."},{"line_number":6025,"context_line":"        instance \u003d self._create_instance_obj()"},{"line_number":6026,"context_line":"        build_req_obj \u003d fake_build_request.fake_req_obj(self.context)"},{"line_number":6027,"context_line":"        # Verify that user_id is populated during a compute_api.get()."},{"line_number":6028,"context_line":"        inst_map \u003d objects.InstanceMapping(cell_mapping\u003dobjects.CellMapping("},{"line_number":6029,"context_line":"            uuid\u003duuids.cell), instance_uuid\u003dinstance.uuid)"},{"line_number":6030,"context_line":"        mock_get_inst_map.return_value \u003d inst_map"}],"source_content_type":"text/x-python","patch_set":8,"id":"5fc1f717_71c5348e","line":6027,"range":{"start_line":6027,"start_character":8,"end_line":6027,"end_character":70},"in_reply_to":"5fc1f717_499f2e50","updated":"2019-03-06 19:29:45.000000000","message":"Will update.","commit_id":"d24275951d3ad0e0ae00621971278aeedf2bfd09"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9f70d1c86e85972e5e0bb48cb6ad8765a58e8087","unresolved":false,"context_lines":[{"line_number":6017,"context_line":"        i \u003d objects.Instance(user_id\u003dNone)"},{"line_number":6018,"context_line":"        self.compute_api._save_user_id_in_instance_mapping(im, i)"},{"line_number":6019,"context_line":"        self.assertNotIn(\u0027user_id\u0027, im)"},{"line_number":6020,"context_line":"        im_save.assert_not_called()"},{"line_number":6021,"context_line":""},{"line_number":6022,"context_line":"    @mock.patch(\u0027nova.compute.api.API._save_user_id_in_instance_mapping\u0027)"},{"line_number":6023,"context_line":"    @mock.patch.object(objects.InstanceMapping, \u0027get_by_instance_uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5fc1f717_190e4134","line":6020,"updated":"2019-03-07 15:55:26.000000000","message":"✔","commit_id":"afbe4abba881c75fef2d4ef864334d5d91181d8c"}]}
