)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"e8047565881760c77290dbcefd9a1cd9df665ed5","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"9efe6524_789aef27","updated":"2021-11-01 16:03:32.000000000","message":"This patch changes Nova API, so a spec for this change should be approved.\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/yoga/index.html","commit_id":"f5aee1bd0fb74e24b401595858302d5a527b3e56"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"54688d9b8153a61158cedab8c61dea49b037a79f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"2b96af77_73820308","updated":"2021-11-01 13:30:54.000000000","message":"recheck","commit_id":"f5aee1bd0fb74e24b401595858302d5a527b3e56"},{"author":{"_account_id":32755,"name":"Christian Rohmann","email":"christian.rohmann@inovex.de","username":"frittentheke"},"change_message_id":"1f8b1378cf4010d5f54f72b34a17725af68df4c1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c41d9a62_a2231864","in_reply_to":"9efe6524_789aef27","updated":"2021-11-05 11:04:47.000000000","message":"see https://review.opendev.org/c/openstack/nova-specs/+/816542","commit_id":"f5aee1bd0fb74e24b401595858302d5a527b3e56"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"f7f4d2e050a0440b5eda9761c829eec56602ab93","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"bb6cc3eb_b86da94a","updated":"2022-05-18 15:02:02.000000000","message":"I will update the implementation according to the spec and push it in the next few days.","commit_id":"f20aaf5aa167252370d1ed7f78f4bfad90b2721a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a3811e0718c0cc731cc81a42dedc08453fe6df11","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"680f6ae8_9bd4cd0e","updated":"2022-05-18 09:19:47.000000000","message":"this has not been updated to reflect teh change in the spec.\nspecifically the change to support regenerating the config drive optionally on hard reboot","commit_id":"f20aaf5aa167252370d1ed7f78f4bfad90b2721a"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"56fe97f6b7f15174a26511747dea3c37406471fc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"c2c72af2_7fa2ab2e","updated":"2022-06-27 14:21:35.000000000","message":"I have now extended the implementation by the updated reboot actions API as well as logic for config drive regeneration, according to the spec.\nFeel free to give any feedback.","commit_id":"0d6b37868deebf8aa34175d4bc8a5f0f3d276ca7"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"d6952eb9397155a7bd012da4f7d0051f1a345035","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"563e6251_d7c906dc","updated":"2022-08-02 16:49:29.000000000","message":"We agreed on the last Nova meeting to prioritize this API change for the 2.93 microversion.\n\nPlease rebase this change before Friday Aug 5th so we can review it, or https://review.opendev.org/c/openstack/nova/+/830883 will then be prioritized against 2.93.\n\nThanks,\n-Sylvain, on the behalf of the Nova cores.","commit_id":"638a7dc5d1251aab72f95b7af50161f8ca0ecd4d"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"399cfc088f681edf28a8ba5755a2116da097d6f1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"c02f0cc1_5bbf6ca9","in_reply_to":"563e6251_d7c906dc","updated":"2022-08-03 17:30:30.000000000","message":"Thanks Sylvain!\n\nI\u0027ve pushed the rebased patchset.","commit_id":"638a7dc5d1251aab72f95b7af50161f8ca0ecd4d"},{"author":{"_account_id":32755,"name":"Christian Rohmann","email":"christian.rohmann@inovex.de","username":"frittentheke"},"change_message_id":"3b4d974dcd4e393413f61f062ecdb359a4780f44","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3b48f9ad_27f549b0","updated":"2022-08-04 09:33:21.000000000","message":"recheck","commit_id":"41e5ccd21cf5a70c182e2c2ce2d1cd654875902b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"073ed95a13bb1fc5663fe6467a2925b78fac1613","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"eb99c926_3f819d0a","updated":"2022-08-09 08:06:31.000000000","message":"Also the config drive is supported by not just the libvirt driver but also other in tree virt drivers:\n* hyperv\n* vmvare\n* zvm\n\nSo either the whole updating config drive feature needs to be marked as libvirt driver only or you need to implement this to the other virt drivers too. \n\nMaking this libvit only would lead to a pretty awkward API user experience though. :/ ","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"816bae293f718e12a98ad3ae0a50d329e0989812","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"c4cadfc3_3301d208","updated":"2022-08-09 08:04:02.000000000","message":"I have a couple of request inline. Also this patch need test coverage on the libvirt driver change","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"19ab87f34393ed783c04500a854966b3054c09c3","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"c0e55a82_e0ecc6bb","in_reply_to":"19eab703_5bc8b3e5","updated":"2022-08-26 12:48:07.000000000","message":"I think the release will be merged today. So feel free to propose a change here that uses the trait already. It is OK for now if that fails the tests.","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"456cd8f923dca399454e7e4573ba30b90db854aa","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"ba22fa2e_67585311","in_reply_to":"2365602a_8d5d51b0","updated":"2022-08-22 08:44:29.000000000","message":"You are right if regenerate_configdrive is called from within the libvirt driver\u0027s _hard_reboot call, then this will be not called for non libvirt drivers.\n\nOne way to do this is that the new regenerate_configdrive() is called from nova.compute.manager.ComputeManager._reboot_instance() before self.driver.reboot() is called.","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"2365602a_8d5d51b0","in_reply_to":"31631f09_e71ba037","updated":"2022-08-22 08:10:22.000000000","message":"I also thought about this and think this would be a good approach. It provides an interface which can easily be implemented for other drivers.\n\nBut how would an API caller be notified of the missing functionality for non-libvirt drivers when no non-libvirt driver actually calls this method?","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"47efc342a707851dbc30fb0e4a54ad049a65afb5","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"19eab703_5bc8b3e5","in_reply_to":"3af1017b_45bcfa53","updated":"2022-08-25 13:06:22.000000000","message":"thanks. We merged the trait, and I proposed an os-trait lib release https://review.opendev.org/c/openstack/releases/+/854617","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"89f79e9f630c473cbdc873feab10007727e21192","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"f2628883_033737ae","in_reply_to":"ba22fa2e_67585311","updated":"2022-08-24 08:03:36.000000000","message":"One thing we missed is the fact that the reboot_instance RPC is a *cast*. So even if the compute detects that the current virt driver does not support the config drive regeneration, there is no way to signal that back to the API user. :/ So while I think the current solution is good as it gives other virt driver implementors an easy way to add the regeneration support, it does not solve the case of signalling error if the regeneration is not supported.\n\nSo we need one more step. Sorry that I missed this before.\n1) create a new os-traits standard trait for config driver regeneration.\n2) report a new virt driver capability about config driver regeneration. This will be translated to the new trait being added to the compute RP in placement. [1][2][3]. Obviously set it to False by default and set it to True in libvirt driver.\n3) check for the trait on the compute RP during hard reboot in the compute api (here is an example [4] how to do that)\n\nWe have a non client library freeze (i.e. os-traits lib freeze) this week so #1) needs to be proposed very soon.\n\n\n[1]https://github.com/openstack/nova/blob/94065763d32287606895c07bd5882bab083a4e48/nova/virt/libvirt/driver.py#L410\n[2]https://github.com/openstack/nova/blob/94065763d32287606895c07bd5882bab083a4e48/nova/virt/driver.py#L1105\n[3]https://github.com/openstack/nova/blob/94065763d32287606895c07bd5882bab083a4e48/nova/compute/resource_tracker.py#L1178\n[4]https://github.com/openstack/nova/blob/94065763d32287606895c07bd5882bab083a4e48/nova/compute/api.py#L4362","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"a939d4eb666a6585f0ae9d339bb8465fd21b7535","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"88d020ab_8f2602b2","in_reply_to":"c0e55a82_e0ecc6bb","updated":"2022-08-28 18:55:43.000000000","message":"I have now added a first implementation of config drive regeneration with the new trait. Tests are yet to be implemented.","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"290aba9d3eda0151d94b76c28219d0765cabf1c6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"bb6a6c06_dcd105db","in_reply_to":"c4cadfc3_3301d208","updated":"2022-08-12 13:21:55.000000000","message":"Thanks for your feedback! I have made some adjustments accordingly.\nTest coverage on libvirt driver changes still has to be added.","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"ebed15fe_580da5f2","in_reply_to":"eb99c926_3f819d0a","updated":"2022-08-16 01:08:18.000000000","message":"Agree with gibi here.\n\nNot sure if people will like this idea but I was thinking:\n\n* Add a regenerate_configdrive() method to nova/virt/driver.py and make it raise NotImplementedError in the base class (See set_admin_password for an example of a thing implemented only in libvirt but the API and option for other drivers to implement it is there)\n* Add the rengenerate_configdrive() method in nova/virt/libvirt/driver.py and make it do the stuff it\u0027s doing\n* Call regenerate_configdrive() from _hard_reboot()\n\nI think doing something like this would provide feedback to API callers requesting user_data update when using a driver other than libvirt.","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"4b2b0f287621ac6ddda0f439dc5bc497b9d7aedc","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"e281b542_cf57ad1f","in_reply_to":"eb99c926_3f819d0a","updated":"2022-08-12 13:40:19.000000000","message":"I would prefer to only implement this change for libvirt only for now. Also, driver support is only required if the instance uses a config drive (and I would assume that most people use the metadata service nevertheless).\n\nThis would then probably need another note in the docs and release notes that this particular case is libvirt only, correct?","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bb734d2f195f6a0b613f421fde4a0b340438da38","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"31631f09_e71ba037","in_reply_to":"ebed15fe_580da5f2","updated":"2022-08-17 09:58:07.000000000","message":"I\u0027ve just realized that this is not resolved yet. Dropping my +1 as this needs a solution.\n\nI like Melanie\u0027s suggest. Having a virt level method for this enable an easy way for the other drivers to support this eventually and would also make a nice way to notify the user that something they asked for is not supported.\n\nWhen you add the new method to the virt interface please drop a mail to the mailing list notifying the out of tree driver authors (for example https://lists.openstack.org/pipermail/openstack-discuss/2020-July/015824.html)","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"e27d430c4cdeecb7f1a7ed7d9211ed272e16217d","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"3af1017b_45bcfa53","in_reply_to":"f2628883_033737ae","updated":"2022-08-25 10:03:01.000000000","message":"Thanks for the hints. I\u0027ve added a new trait in the os-traits repo (https://review.opendev.org/c/openstack/os-traits/+/854599).\n\nHope we can meet the freeze!","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f471df0c1f47824c078ee4ae85c59563b9bb848b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"da8126ec_1149354a","updated":"2022-08-17 09:35:57.000000000","message":"I have only nits, but Melanie had some valid point I agree with. Hence I\u0027m only +1. Once Melanie\u0027s points have been fixed I will upgrade my vote to +2.","commit_id":"86b6394d9ee2e818d09fed7b2adcd5fa4ef7498d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"22dc070e05423a8c66f4fed1244bedc006d18d73","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"22a19e03_e128ef53","updated":"2022-08-26 18:43:07.000000000","message":"Sorry I was away from this review for a bit. This is looking nice to me, the virt API addition makes it quite clean IMHO.\n\nThanks to gibi for walking through it and coming up with a nice way to detect whether a given compute host supports config drive regeneration and give feedback to REST API callers.","commit_id":"f1a660fb172d519b64d4e84f1e677762976b09d3"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"02fcdf7af6a3f8caa7f4d7746e7360539969f8ba","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"7fec42b0_e41c5ff8","updated":"2022-08-24 06:42:45.000000000","message":"The following files are missing.\n\n* doc/api_samples/servers/v2.93/servers-list-resp.json\n* nova/tests/functional/api_sample_tests/api_samples/servers/v2.93/server-create-req.json.tpl","commit_id":"f1a660fb172d519b64d4e84f1e677762976b09d3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d62ea91ec8b2ee44d3b1926fd81f6dfac54d6a4b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"52d2d8df_b8582ecc","updated":"2022-08-26 14:48:07.000000000","message":"When you revise this, can you make sure to rebase it on master? There are other patches that depend on this one that need to rebase behind your revisions, and those also have dependencies on things that have changed in master since. THanks!","commit_id":"f1a660fb172d519b64d4e84f1e677762976b09d3"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6956d7aa394593ca01e887ef376b8b3cb2d63b83","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"8a0d3859_fda4fc99","updated":"2022-08-26 16:06:39.000000000","message":"in general i think this looks good so +1 but its blocked by the os-traits release and as dan noted it would be good to rebase this.\n\nwith the depenency on the new version of os tratis we shoudl update the minium required version in the requirements.txt\n\nhttps://github.com/openstack/nova/blob/master/requirements.txt#L56","commit_id":"f1a660fb172d519b64d4e84f1e677762976b09d3"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0efbd5930ec2b615c8c88606bb5e765e16e0c339","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"f232d3cf_cc3cad65","in_reply_to":"45b2f8e0_376dfe03","updated":"2022-08-26 18:43:58.000000000","message":"*for a future PS","commit_id":"f1a660fb172d519b64d4e84f1e677762976b09d3"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"809932f032b55fa2491b412f8275172f6cff15e9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"0f920d70_8cf17b47","in_reply_to":"7fec42b0_e41c5ff8","updated":"2022-08-28 14:37:25.000000000","message":"Thanks, I\u0027ve re-added those files.","commit_id":"f1a660fb172d519b64d4e84f1e677762976b09d3"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"22dc070e05423a8c66f4fed1244bedc006d18d73","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"45b2f8e0_376dfe03","in_reply_to":"8a0d3859_fda4fc99","updated":"2022-08-26 18:43:07.000000000","message":"+1, marking this as not \"Resolved\" so it\u0027s easier for Jan to track it as a \"todo\" for the next PS.","commit_id":"f1a660fb172d519b64d4e84f1e677762976b09d3"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"809932f032b55fa2491b412f8275172f6cff15e9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"2ae120ce_b1f6cae0","in_reply_to":"f232d3cf_cc3cad65","updated":"2022-08-28 14:37:25.000000000","message":"Ack","commit_id":"f1a660fb172d519b64d4e84f1e677762976b09d3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0ad9e0ac85c50ba6e357870831e64a0593b192a7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"5b0ca501_be2d8e30","updated":"2022-08-26 19:11:27.000000000","message":"Looks like Rajat accidentally rebased and pushed rev 8 of this set on top of rev 9 as rev 10. So I\u0027m going to rebase this all on master with rev 9 as rev 11, and the updated BFV ones on top of that.\n\nSorry for the noise. Jan, hopefully you didn\u0027t have any (or many) pending changes on top of this, but make sure you can reconcile things next week...","commit_id":"246389da83f1c3a66e78ca80e215137323391e77"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"0f165d6081cac13e4463f7370629589f74a66e39","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"0687d95e_56869439","in_reply_to":"5b0ca501_be2d8e30","updated":"2022-08-29 11:56:39.000000000","message":"Yeah really sorry about the updates, didn\u0027t realize that my patch series wasn\u0027t rebased on your latest PS. Also thanks to Dan for bringing things back to normal. This MV chain dependency is kind of tricky and it\u0027s the first time I\u0027m dealing with this.","commit_id":"246389da83f1c3a66e78ca80e215137323391e77"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"809932f032b55fa2491b412f8275172f6cff15e9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"01b87806_322aa579","updated":"2022-08-28 14:37:25.000000000","message":"I\u0027ve rebased the PS and re-added the missing API samples. Also updated the os-traits version in requirements.txt.","commit_id":"726f42976dde84e42224daaf4d936482583da260"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c0117419fd262c7060a783dcb32f3d39b856dede","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"32f0d725_4d8e069f","updated":"2022-08-29 08:01:19.000000000","message":"I only have nits. But just +1 as you noted that unit tests needs to be updated.","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b94abbc42dea06b9d989f698ffbee826a9283a19","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"720313c0_5bbf135a","updated":"2022-08-29 17:35:24.000000000","message":"and just in case my comment were not clear\n\n\n def test_reboot_hard_with_user_data_update(self):\n        fake_reboot \u003d mock.Mock()\n        self.stub_out(\u0027nova.compute.api.API.reboot\u0027, fake_reboot)\n        with mock.patch(\n                \"nova.objects.Instance.config_drive_dirty\",\n                new_callable\u003dmock.PropertyMock\n        ) as mock_config_drive_dirty:\n            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))\n            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)\n            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)\n\n            # Assert this is not set as the instance has no config drive\n            self.assertFalse(mock_config_drive_dirty.called)\n\n    def test_reboot_hard_with_user_data_update_and_config_drive(self):\n        fake_reboot \u003d mock.Mock()\n        self.stub_out(\u0027nova.compute.api.API.reboot\u0027, fake_reboot)\n        with mock.patch(\n                \"nova.objects.Instance.config_drive_dirty\",\n                new_callable\u003dmock.PropertyMock\n        ) as mock_config_drive_dirty:\n            # Mock an instance with config drive\n            self.stub_out(\"nova.compute.api.API.get\",\n                          fakes.fake_compute_get(config_drive\u003dTrue))\n            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))\n            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)\n            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)\n            mock_config_drive_dirty.assert_called_with(True)\n\n\nthat works locally\n\nall the unit test that actully should succeed in this class should mock out the action implmeation like this.\n\nthe ones that fail do not need to do this as it should fail before it calls the underlying implemantion in the api validation.","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"fda2b5c4b39b49f3721e5b062dc5d43ec58a622b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"b76c81ac_f2cdfb3b","updated":"2022-08-30 23:21:30.000000000","message":"I can volunteer to do the api sample test things I commented about inline as part of the proposed followup testing additions.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"49307dc2c71ba41ba120aa7c76940a92a54aea3f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"73c89b45_dacecbe6","updated":"2022-08-30 08:02:36.000000000","message":"I only have nits here and in the previous patch set and those can be fixed in a follow up.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"cdc671e19d9ecbcfb282b0d83686e9d395bbc18c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"904d23e3_dafc727b","updated":"2022-08-30 20:19:48.000000000","message":"Okay, so here\u0027s my proposed compromise:\n\nAs gibi pointed out on IRC, the trait should prevent us from allowing the call against an old compute, even though we will update user_data and we will queue the rebuild for much (much) later. I think the shadow unversioned covert signaling should get fixed. So based on that, and what is behind this, I think the best plan is to:\n\n- Let this merge as it is with the thin protection of the trait\n- Follow up with a conversion of this to an RPC interface with proper versioning\n- Follow up on this with fixes to the revert logic if the call fails\n- Follow up on this with actual test coverage of the virt bits\n\nThis follow-up will come after the BFV rebuild patch because if it doesn\u0027t, we have a bunch of RPC version conflicts to fix. I\u0027ll do most or all of that because it\u0027s my fault for not rubber-stamping this, and already have some of the RPC stuff worked out.\n\nSound okay?","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"500f190a16005ff87099d5c6ba35b3e0b31f4737","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"d96dec3e_9453c314","updated":"2022-08-30 19:28:59.000000000","message":"Thinking and discussing about this more, I think we need to do something different here. I say that knowing the implication for this and the patch above it. But this creates a shadow RPC interface, which side-steps our RPC, object, and service versioning and creates an upgrade breakage. If there was a tempest test for this (which there should be anyway), it would fail on the grenade job because the un-upgraded compute will not honor the dirty flag and regenerate the config drive.\n\nFurther, in the current scenario, if we have an instance on an old compute node and I try to reboot with new user_data, that data will be written to the DB, the flag will be set, but the compute will ignore it because it\u0027s old. Then in several months, when the operator upgrades that compute, a months-later hard reboot will suddenly change the user data to what it was months ago. That could be quite confusing and frustrating for the owner.\n\nIf this was a proper flag to reboot, it would be RPC versioned, and the RPC layer\u0027s auto-pin would reject a call to pass it if we\u0027re pinned to the older version, thus ensuring that the API call fails, telling the user \"we can\u0027t do this right now.\"\n\nI think the right thing to do is make this a flag to the RPC call, bump the version, and then catch the ComputeTooOld (or whatever) exception when it gets raised by the RPC layer in order to reject the API call to the user.\n\nI can help work that out quickly if others agree.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6722bfc0613556c45425e1f1de7c17880bb2e532","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"b92d985c_775e9bd7","updated":"2022-08-30 23:14:14.000000000","message":"at least on centos9stream this seams to be broken\n\nhttps://termbin.com/6502\n\ni can try this on ubuntu but i suspect we are missing a privsep call \n\n\u0027xorriso 1.5.4 : RockRidge filesystem manipulator, libburnia project.\\n\\nlibburn : SORRY : Failed to open device (a pseudo-drive) : Permission denied\\nxorriso : FAILURE : libburn indicates failure with writing.\\n\u0027","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f9bcfb9f6d0115f20223c4cd1e91d5c5428798d7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"083f9b96_50273e5b","updated":"2022-08-31 09:31:30.000000000","message":"given the issue with config drive and the rpc issues raised by dan\nwe should reorder the micorversion and give 2.93 to the BFV seriese.\n\nim going to quickly see if if can find a way to make config drive work but at\nthis point it might be better to split the feature into two patches and 2 microverions.\n\n\n2.94 would introduce the ability to update user data when not using config drive\n2.95 would add the ablity to update user_data on hard_reboot with config drive reconfigurtion.\n\nthe second patch should also not use the dirty flag but instead use an rpc bump to pass an arge as part of hard reboot.\n\ni think we can still likely land the user data update without config drive part this cycle but the config drive part will likely have to wait until next cycle.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c95644c0eb4ca4e01f575b05177a11b98024e037","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"7bb857cd_79a451e6","updated":"2022-08-29 18:14:21.000000000","message":"just adressed my own comments","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5284ad14014ebf22551f03e14305540c8b1dea9f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"93dbc609_f12e1b5c","updated":"2022-08-30 14:42:29.000000000","message":"since i fixed the  failing unit test i am going to leave +w to others\nbut i think there remainign comments can be adressed in a followup.\n\nthe only expction to that perhaps melanines but i dont think that was a blocker","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a6e7bb13376a32bc31abdd76a3f2b3c4c7da5827","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"1d69b4d7_1817fcd9","updated":"2022-08-30 18:57:33.000000000","message":"ta","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6fee4adccf48b5e458ca61ab2f44ad00d45b37b7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"ab2d8c0f_7d932fcf","updated":"2022-08-30 19:44:50.000000000","message":"talking to dan im convinced this need to be reworkd to intoduce an rpc paramater\n\nthe lazy rebuild was proposed ot allow eventual consitency but i think dan is correct that seting this and then having it take effect 6 months later when the compute evenutally gets updated is not what we want.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"137f2dca4d00ebb90c7ab8ff5900d66717664b2e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":15,"id":"fb45239c_f7e85a56","in_reply_to":"083f9b96_50273e5b","updated":"2022-08-31 10:00:59.000000000","message":"Already assumed that from IRC messages. I\u0027m ok with splitting the feature into two separate patches and microversions, considering the mentioned issues with config drive regeneration.\n\nI will wait for new info from you regarding config drive and start reworking the patch to only include changes not touching config drives.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"137f2dca4d00ebb90c7ab8ff5900d66717664b2e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"b9f5f5f1_783b20f5","in_reply_to":"7bb857cd_79a451e6","updated":"2022-08-31 10:00:59.000000000","message":"Thanks for fixing this.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"5c611d04119d6c8de6c5f700af13945577e95893","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"6925f7c0_87bbb8b5","updated":"2022-09-01 19:31:46.000000000","message":"Putting a procedural hold as we agreed on the fact we missed a design issue when reviewing the spec.\n\nLet me explain the problem here, even if we already have the logs [1] : as we need to regenerate a configdrive if an instance uses it and the user wants to update the userdata, the user couldn\u0027t know whether the data is already updated when restarting the instance (as he wouldn\u0027t know whether the instance was using configdrive or anything else). Also, if a virt driver is not (yet) supporting to regenerate a configdrive, then the userdata wouldn\u0027t be updated and the user wouldn\u0027t know why.\n\nEventually, we then agreed on a direction : instead of using PUT /servers/UUID you could create a specific instance action POST /servers/UUID/action for updating the userdata.\n\nThat would mean the user could look at the instance action status to know when the userdata is modified (and if it needs to regenerate the configdrive, it would wait it until the status of this action is \"done\") before the user would restart the instance.\n\nFor virt drivers that won\u0027t support yet to regenerate (or if libvirt driver has problems when regenerating, eg. with permissions), then the action status would say something like \"failed\" so if the instance is restarted, it would continue to use the former userdata.\n\n\nPlease accordingly provide a spec revision against Antelope, and I\u0027ll remove this procedural -2 once we agreed on the spec revision.\n\nHTH and all the community is sorry about not finding this design issue before.\n-Sylvain\n\n\n[1] https://meetings.opendev.org/irclogs/%23openstack-nova/%23openstack-nova.2022-09-01.log.html#t2022-09-01T16:29:32","commit_id":"863e2e6ddfdd5f7ae2e8020b0d49ee121a1af3c4"}],"api-ref/source/parameters.yaml":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"816bae293f718e12a98ad3ae0a50d329e0989812","unresolved":true,"context_lines":[{"line_number":5938,"context_line":"    The config drive will automatically be rebuilt using the new user data."},{"line_number":5939,"context_line":"  in: body"},{"line_number":5940,"context_line":"  required: false"},{"line_number":5941,"context_line":"  type: string"},{"line_number":5942,"context_line":"reboot_type:"},{"line_number":5943,"context_line":"  description: |"},{"line_number":5944,"context_line":"    The type of the reboot action. The valid values are ``HARD`` and ``SOFT``."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"e7ba7630_2549cfdf","line":5941,"updated":"2022-08-09 08:04:02.000000000","message":"we need\n\n min_version: 2.93\n\nhere too","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"290aba9d3eda0151d94b76c28219d0765cabf1c6","unresolved":false,"context_lines":[{"line_number":5938,"context_line":"    The config drive will automatically be rebuilt using the new user data."},{"line_number":5939,"context_line":"  in: body"},{"line_number":5940,"context_line":"  required: false"},{"line_number":5941,"context_line":"  type: string"},{"line_number":5942,"context_line":"reboot_type:"},{"line_number":5943,"context_line":"  description: |"},{"line_number":5944,"context_line":"    The type of the reboot action. The valid values are ``HARD`` and ``SOFT``."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"8778daf9_6c9c5c95","line":5941,"in_reply_to":"e7ba7630_2549cfdf","updated":"2022-08-12 13:21:55.000000000","message":"Ack","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[{"line_number":5934,"context_line":"reboot_hard_with_user_data_update:"},{"line_number":5935,"context_line":"  description: |"},{"line_number":5936,"context_line":"    If the reboot type is ``HARD`` and the instance uses a config drive,"},{"line_number":5937,"context_line":"    user data can be updated via the ``user_data`` parameter."},{"line_number":5938,"context_line":"    The config drive will automatically be rebuilt using the new user data."},{"line_number":5939,"context_line":"  in: body"},{"line_number":5940,"context_line":"  required: false"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"b1cfebdb_7e44de84","line":5937,"updated":"2022-08-16 01:08:18.000000000","message":"Current code is allowing user data update for both config drive and non config drive.","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":5934,"context_line":"reboot_hard_with_user_data_update:"},{"line_number":5935,"context_line":"  description: |"},{"line_number":5936,"context_line":"    If the reboot type is ``HARD`` and the instance uses a config drive,"},{"line_number":5937,"context_line":"    user data can be updated via the ``user_data`` parameter."},{"line_number":5938,"context_line":"    The config drive will automatically be rebuilt using the new user data."},{"line_number":5939,"context_line":"  in: body"},{"line_number":5940,"context_line":"  required: false"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"9bb70be8_5b260c04","line":5937,"in_reply_to":"b1cfebdb_7e44de84","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[{"line_number":6692,"context_line":"  required: false"},{"line_number":6693,"context_line":"  type: string"},{"line_number":6694,"context_line":"  description: |"},{"line_number":6695,"context_line":"    Updated user_data to set for the instance."},{"line_number":6696,"context_line":"    Must be Base64 encoded. Restricted to 65535 bytes."},{"line_number":6697,"context_line":"    If ``null`` is specified, the existing user_data is unset."},{"line_number":6698,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":7,"id":"c9cf2053_0be446ed","line":6695,"updated":"2022-08-16 01:08:18.000000000","message":"Add words stating that this is only for instances not using a config drive? The API will reject with a 409.","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":6692,"context_line":"  required: false"},{"line_number":6693,"context_line":"  type: string"},{"line_number":6694,"context_line":"  description: |"},{"line_number":6695,"context_line":"    Updated user_data to set for the instance."},{"line_number":6696,"context_line":"    Must be Base64 encoded. Restricted to 65535 bytes."},{"line_number":6697,"context_line":"    If ``null`` is specified, the existing user_data is unset."},{"line_number":6698,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":7,"id":"5daf97bc_5897ce49","line":6695,"in_reply_to":"c9cf2053_0be446ed","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"}],"api-ref/source/servers.inc":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"e8047565881760c77290dbcefd9a1cd9df665ed5","unresolved":true,"context_lines":[{"line_number":836,"context_line":"  - accessIPv6: accessIPv6_in"},{"line_number":837,"context_line":"  - name: server_name_optional"},{"line_number":838,"context_line":"  - hostname: server_hostname_req"},{"line_number":839,"context_line":"  - user_data: server_user_data_update"},{"line_number":840,"context_line":"  - OS-DCF:diskConfig: OS-DCF:diskConfig"},{"line_number":841,"context_line":"  - description: server_description"},{"line_number":842,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":1,"id":"aba02a87_c67fc9af","line":839,"range":{"start_line":839,"start_character":15,"end_line":839,"end_character":38},"updated":"2021-11-01 16:03:32.000000000","message":"The user_data parameter is \"New in version 2.91\" instead of \"New in version 2.75\".\n\nhttps://e1066ed764372feffb00-43bef2b011f595598cf89d565fc6c894.ssl.cf5.rackcdn.com/816157/1/check/build-openstack-api-ref/7373390/docs/?expanded\u003dupdate-server-detail#update-server","commit_id":"f5aee1bd0fb74e24b401595858302d5a527b3e56"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6956d7aa394593ca01e887ef376b8b3cb2d63b83","unresolved":false,"context_lines":[{"line_number":836,"context_line":"  - accessIPv6: accessIPv6_in"},{"line_number":837,"context_line":"  - name: server_name_optional"},{"line_number":838,"context_line":"  - hostname: server_hostname_req"},{"line_number":839,"context_line":"  - user_data: server_user_data_update"},{"line_number":840,"context_line":"  - OS-DCF:diskConfig: OS-DCF:diskConfig"},{"line_number":841,"context_line":"  - description: server_description"},{"line_number":842,"context_line":""}],"source_content_type":"text/x-c++src","patch_set":1,"id":"389d5b77_528bd3e0","line":839,"range":{"start_line":839,"start_character":15,"end_line":839,"end_character":38},"in_reply_to":"aba02a87_c67fc9af","updated":"2022-08-26 16:06:39.000000000","message":"im not quite sure how that is relevent here.\n\nat least looking at this inc doc it does not appear to refence 2.91 or 2.75 to be.\n\nthis now correclty show 2.93\nhttps://storage.bhs.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_5b8/816157/9/check/build-openstack-api-ref/5b8a277/docs/?expanded\u003dreboot-server-reboot-action-detail#reboot-server-reboot-action\n\nso i think this can be marked resloved","commit_id":"f5aee1bd0fb74e24b401595858302d5a527b3e56"}],"doc/api_samples/servers/v2.93/server-action-reboot.json":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a6e7bb13376a32bc31abdd76a3f2b3c4c7da5827","unresolved":true,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"reboot\" : {"},{"line_number":3,"context_line":"        \"type\" : \"HARD\","},{"line_number":4,"context_line":"        \"user_data\": \"data\""},{"line_number":5,"context_line":"    }"},{"line_number":6,"context_line":"}"}],"source_content_type":"application/json","patch_set":15,"id":"cc8c4926_be538231","line":4,"updated":"2022-08-30 18:57:33.000000000","message":"The docs say this \"must be base64 encoded\", but \"data\" is not valid base64. I\u0027m sure this is copied from elsewhere, but I think it\u0027s probably wrong.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"137f2dca4d00ebb90c7ab8ff5900d66717664b2e","unresolved":true,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"reboot\" : {"},{"line_number":3,"context_line":"        \"type\" : \"HARD\","},{"line_number":4,"context_line":"        \"user_data\": \"data\""},{"line_number":5,"context_line":"    }"},{"line_number":6,"context_line":"}"}],"source_content_type":"application/json","patch_set":15,"id":"94acd849_72dcade7","line":4,"in_reply_to":"cc8c4926_be538231","updated":"2022-08-31 10:00:59.000000000","message":"Technically this is valid base64, but I see where you\u0027re going. Will change this value.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"}],"doc/api_samples/servers/v2.93/server-create-req.json":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[{"line_number":18,"context_line":"        \"networks\": \"auto\","},{"line_number":19,"context_line":"        \"hostname\": \"custom-hostname\""},{"line_number":20,"context_line":"    }"},{"line_number":21,"context_line":"}"}],"source_content_type":"application/json","patch_set":7,"id":"313db9fc_52acf833","line":21,"updated":"2022-08-16 01:08:18.000000000","message":"Why do we need to add this? There is no change to POST /servers. Do samples still have to be re-generated for a new microversion if the API hasn\u0027t changed?","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":18,"context_line":"        \"networks\": \"auto\","},{"line_number":19,"context_line":"        \"hostname\": \"custom-hostname\""},{"line_number":20,"context_line":"    }"},{"line_number":21,"context_line":"}"}],"source_content_type":"application/json","patch_set":7,"id":"46a31a70_4d09e8b7","line":21,"in_reply_to":"313db9fc_52acf833","updated":"2022-08-22 08:10:22.000000000","message":"Ack, this can probably be dropped","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"c947b84ad77155dddb60ca65d59ffa1c4b01ff53","unresolved":false,"context_lines":[{"line_number":18,"context_line":"        \"networks\": \"auto\","},{"line_number":19,"context_line":"        \"hostname\": \"custom-hostname\""},{"line_number":20,"context_line":"    }"},{"line_number":21,"context_line":"}"}],"source_content_type":"application/json","patch_set":7,"id":"64fd72c9_f0236ddd","line":21,"in_reply_to":"46a31a70_4d09e8b7","updated":"2022-08-28 16:26:00.000000000","message":"I just re-checked since functional tests were failing and turns out those are still required (probably that\u0027s why I added them in the first place last year). Re-added all API samples.","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a6e7bb13376a32bc31abdd76a3f2b3c4c7da5827","unresolved":true,"context_lines":[{"line_number":14,"context_line":"                \"name\": \"default\""},{"line_number":15,"context_line":"            }"},{"line_number":16,"context_line":"        ],"},{"line_number":17,"context_line":"        \"user_data\" : \"IyEvYmluL2Jhc2gKL2Jpbi9zdQplY2hvICJJIGFtIGluIHlvdSEiCg\u003d\u003d\","},{"line_number":18,"context_line":"        \"networks\": \"auto\","},{"line_number":19,"context_line":"        \"hostname\": \"custom-hostname\""},{"line_number":20,"context_line":"    }"}],"source_content_type":"application/json","patch_set":15,"id":"f9331337_1af3ff70","line":17,"updated":"2022-08-30 18:57:33.000000000","message":"^ base64 data :)","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"137f2dca4d00ebb90c7ab8ff5900d66717664b2e","unresolved":false,"context_lines":[{"line_number":14,"context_line":"                \"name\": \"default\""},{"line_number":15,"context_line":"            }"},{"line_number":16,"context_line":"        ],"},{"line_number":17,"context_line":"        \"user_data\" : \"IyEvYmluL2Jhc2gKL2Jpbi9zdQplY2hvICJJIGFtIGluIHlvdSEiCg\u003d\u003d\","},{"line_number":18,"context_line":"        \"networks\": \"auto\","},{"line_number":19,"context_line":"        \"hostname\": \"custom-hostname\""},{"line_number":20,"context_line":"    }"}],"source_content_type":"application/json","patch_set":15,"id":"415be2ee_d779c7c8","line":17,"in_reply_to":"f9331337_1af3ff70","updated":"2022-08-31 10:00:59.000000000","message":"Ack","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"}],"doc/api_samples/servers/v2.93/server-create-resp.json":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[{"line_number":19,"context_line":"            }"},{"line_number":20,"context_line":"        ]"},{"line_number":21,"context_line":"    }"},{"line_number":22,"context_line":"}"}],"source_content_type":"application/json","patch_set":7,"id":"c59373be_99c30ec8","line":22,"updated":"2022-08-16 01:08:18.000000000","message":"Same.","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":19,"context_line":"            }"},{"line_number":20,"context_line":"        ]"},{"line_number":21,"context_line":"    }"},{"line_number":22,"context_line":"}"}],"source_content_type":"application/json","patch_set":7,"id":"0b1f63bc_5f733ad0","line":22,"in_reply_to":"c59373be_99c30ec8","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"}],"doc/api_samples/servers/v2.93/server-get-resp.json":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[{"line_number":84,"context_line":"        \"updated\": \"2021-10-13T09:43:16Z\","},{"line_number":85,"context_line":"        \"user_id\": \"fake\""},{"line_number":86,"context_line":"    }"},{"line_number":87,"context_line":"}"}],"source_content_type":"application/json","patch_set":7,"id":"a93dfc4a_d41bfeef","line":87,"updated":"2022-08-16 01:08:18.000000000","message":"Same.","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        \"updated\": \"2021-10-13T09:43:16Z\","},{"line_number":85,"context_line":"        \"user_id\": \"fake\""},{"line_number":86,"context_line":"    }"},{"line_number":87,"context_line":"}"}],"source_content_type":"application/json","patch_set":7,"id":"e2107681_46f95a78","line":87,"in_reply_to":"a93dfc4a_d41bfeef","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"}],"doc/api_samples/servers/v2.93/server-update-req.json":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a6e7bb13376a32bc31abdd76a3f2b3c4c7da5827","unresolved":true,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"server\": {"},{"line_number":3,"context_line":"        \"user_data\": \"data\""},{"line_number":4,"context_line":"    }"},{"line_number":5,"context_line":"}"}],"source_content_type":"application/json","patch_set":15,"id":"3a147e87_5f915e50","line":3,"updated":"2022-08-30 18:57:33.000000000","message":"Same here.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"}],"doc/api_samples/servers/v2.93/servers-details-resp.json":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[{"line_number":91,"context_line":"            \"rel\": \"next\""},{"line_number":92,"context_line":"        }"},{"line_number":93,"context_line":"    ]"},{"line_number":94,"context_line":"}"}],"source_content_type":"application/json","patch_set":7,"id":"74c8e13d_131ba30c","line":94,"updated":"2022-08-16 01:08:18.000000000","message":"Same.","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            \"rel\": \"next\""},{"line_number":92,"context_line":"        }"},{"line_number":93,"context_line":"    ]"},{"line_number":94,"context_line":"}"}],"source_content_type":"application/json","patch_set":7,"id":"b2615bec_df1b166c","line":94,"in_reply_to":"74c8e13d_131ba30c","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"}],"doc/api_samples/servers/v2.93/servers-list-resp.json":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[{"line_number":21,"context_line":"            \"rel\": \"next\""},{"line_number":22,"context_line":"        }"},{"line_number":23,"context_line":"    ]"},{"line_number":24,"context_line":"}"}],"source_content_type":"application/json","patch_set":7,"id":"3f5857e1_aa933bf4","line":24,"updated":"2022-08-16 01:08:18.000000000","message":"Same.","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":21,"context_line":"            \"rel\": \"next\""},{"line_number":22,"context_line":"        }"},{"line_number":23,"context_line":"    ]"},{"line_number":24,"context_line":"}"}],"source_content_type":"application/json","patch_set":7,"id":"4b0eda1b_4229c281","line":24,"in_reply_to":"3f5857e1_aa933bf4","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"}],"nova/api/openstack/compute/schemas/servers.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"816bae293f718e12a98ad3ae0a50d329e0989812","unresolved":true,"context_lines":[{"line_number":394,"context_line":"update_v293 \u003d copy.deepcopy(update_v290)"},{"line_number":395,"context_line":"update_v293[\u0027properties\u0027][\u0027server\u0027]["},{"line_number":396,"context_line":"    \u0027properties\u0027][\u0027user_data\u0027] \u003d {"},{"line_number":397,"context_line":"    \u0027oneOf\u0027: [{\u0027type\u0027: \u0027string\u0027, \u0027format\u0027: \u0027base64\u0027, \u0027maxLength\u0027: 65535},"},{"line_number":398,"context_line":"              {\u0027type\u0027: \u0027null\u0027},"},{"line_number":399,"context_line":"    ]"},{"line_number":400,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":6,"id":"eb90e14c_84228ac3","line":397,"updated":"2022-08-09 08:04:02.000000000","message":"you can pull out this to a variable as it is now defined at least 3 times in this file","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"290aba9d3eda0151d94b76c28219d0765cabf1c6","unresolved":false,"context_lines":[{"line_number":394,"context_line":"update_v293 \u003d copy.deepcopy(update_v290)"},{"line_number":395,"context_line":"update_v293[\u0027properties\u0027][\u0027server\u0027]["},{"line_number":396,"context_line":"    \u0027properties\u0027][\u0027user_data\u0027] \u003d {"},{"line_number":397,"context_line":"    \u0027oneOf\u0027: [{\u0027type\u0027: \u0027string\u0027, \u0027format\u0027: \u0027base64\u0027, \u0027maxLength\u0027: 65535},"},{"line_number":398,"context_line":"              {\u0027type\u0027: \u0027null\u0027},"},{"line_number":399,"context_line":"    ]"},{"line_number":400,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":6,"id":"c8e9a443_cffdf7eb","line":397,"in_reply_to":"eb90e14c_84228ac3","updated":"2022-08-12 13:21:55.000000000","message":"Ack","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6956d7aa394593ca01e887ef376b8b3cb2d63b83","unresolved":true,"context_lines":[{"line_number":235,"context_line":"create_v20[\u0027properties\u0027][\u0027server\u0027][\u0027properties\u0027]["},{"line_number":236,"context_line":"    \u0027security_groups\u0027][\u0027items\u0027][\u0027properties\u0027][\u0027name\u0027] \u003d ("},{"line_number":237,"context_line":"    parameter_types.name_with_leading_trailing_spaces)"},{"line_number":238,"context_line":"create_v20[\u0027properties\u0027][\u0027server\u0027][\u0027properties\u0027][\u0027user_data\u0027] \u003d \\"},{"line_number":239,"context_line":"    parameter_types.user_data"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"create_v219 \u003d copy.deepcopy(create)"},{"line_number":242,"context_line":"create_v219[\u0027properties\u0027][\u0027server\u0027]["}],"source_content_type":"text/x-python","patch_set":8,"id":"e0976645_e7fec100","line":239,"range":{"start_line":238,"start_character":0,"end_line":239,"end_character":29},"updated":"2022-08-26 16:06:39.000000000","message":"nit: this can now fit on one line","commit_id":"86b6394d9ee2e818d09fed7b2adcd5fa4ef7498d"}],"nova/api/openstack/compute/servers.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"816bae293f718e12a98ad3ae0a50d329e0989812","unresolved":true,"context_lines":[{"line_number":934,"context_line":"            update_dict[\u0027hostname\u0027] \u003d server[\u0027hostname\u0027]"},{"line_number":935,"context_line":""},{"line_number":936,"context_line":"        if \u0027user_data\u0027 in server:"},{"line_number":937,"context_line":"            if instance[\u0027config_drive\u0027] \u003d\u003d \"\" or \\"},{"line_number":938,"context_line":"                    instance[\u0027config_drive\u0027] is None:"},{"line_number":939,"context_line":"                update_dict[\u0027user_data\u0027] \u003d server[\u0027user_data\u0027]"},{"line_number":940,"context_line":"            else:"},{"line_number":941,"context_line":"                raise exc.HTTPConflict(explanation\u003d"}],"source_content_type":"text/x-python","patch_set":6,"id":"918501e4_1c0f27de","line":938,"range":{"start_line":937,"start_character":1,"end_line":938,"end_character":53},"updated":"2022-08-09 08:04:02.000000000","message":"this can be shortened to \n    \n    if not instance[\u0027config_drive\u0027]","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"290aba9d3eda0151d94b76c28219d0765cabf1c6","unresolved":false,"context_lines":[{"line_number":934,"context_line":"            update_dict[\u0027hostname\u0027] \u003d server[\u0027hostname\u0027]"},{"line_number":935,"context_line":""},{"line_number":936,"context_line":"        if \u0027user_data\u0027 in server:"},{"line_number":937,"context_line":"            if instance[\u0027config_drive\u0027] \u003d\u003d \"\" or \\"},{"line_number":938,"context_line":"                    instance[\u0027config_drive\u0027] is None:"},{"line_number":939,"context_line":"                update_dict[\u0027user_data\u0027] \u003d server[\u0027user_data\u0027]"},{"line_number":940,"context_line":"            else:"},{"line_number":941,"context_line":"                raise exc.HTTPConflict(explanation\u003d"}],"source_content_type":"text/x-python","patch_set":6,"id":"490cdff9_06fb8fd7","line":938,"range":{"start_line":937,"start_character":1,"end_line":938,"end_character":53},"in_reply_to":"918501e4_1c0f27de","updated":"2022-08-12 13:21:55.000000000","message":"Ack","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"816bae293f718e12a98ad3ae0a50d329e0989812","unresolved":true,"context_lines":[{"line_number":1048,"context_line":"        if reboot_type \u003d\u003d \u0027HARD\u0027 and \u0027user_data\u0027 in body[\u0027reboot\u0027]:"},{"line_number":1049,"context_line":"            instance[\u0027user_data\u0027] \u003d body[\u0027reboot\u0027][\u0027user_data\u0027]"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"            if instance[\u0027config_drive\u0027] !\u003d \"\" and \\"},{"line_number":1052,"context_line":"                    instance[\u0027config_drive\u0027] is not None:"},{"line_number":1053,"context_line":"                instance.config_drive_dirty \u003d True"},{"line_number":1054,"context_line":""},{"line_number":1055,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"49093221_fbccb207","line":1052,"range":{"start_line":1051,"start_character":15,"end_line":1052,"end_character":56},"updated":"2022-08-09 08:04:02.000000000","message":"if instance[config_drive]","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"290aba9d3eda0151d94b76c28219d0765cabf1c6","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"        if reboot_type \u003d\u003d \u0027HARD\u0027 and \u0027user_data\u0027 in body[\u0027reboot\u0027]:"},{"line_number":1049,"context_line":"            instance[\u0027user_data\u0027] \u003d body[\u0027reboot\u0027][\u0027user_data\u0027]"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"            if instance[\u0027config_drive\u0027] !\u003d \"\" and \\"},{"line_number":1052,"context_line":"                    instance[\u0027config_drive\u0027] is not None:"},{"line_number":1053,"context_line":"                instance.config_drive_dirty \u003d True"},{"line_number":1054,"context_line":""},{"line_number":1055,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"99e714b6_f1dbd2ac","line":1052,"range":{"start_line":1051,"start_character":15,"end_line":1052,"end_character":56},"in_reply_to":"49093221_fbccb207","updated":"2022-08-12 13:21:55.000000000","message":"Ack","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"816bae293f718e12a98ad3ae0a50d329e0989812","unresolved":true,"context_lines":[{"line_number":1051,"context_line":"            if instance[\u0027config_drive\u0027] !\u003d \"\" and \\"},{"line_number":1052,"context_line":"                    instance[\u0027config_drive\u0027] is not None:"},{"line_number":1053,"context_line":"                instance.config_drive_dirty \u003d True"},{"line_number":1054,"context_line":""},{"line_number":1055,"context_line":"        try:"},{"line_number":1056,"context_line":"            self.compute_api.reboot(context, instance, reboot_type)"},{"line_number":1057,"context_line":"        except exception.InstanceIsLocked as e:"}],"source_content_type":"text/x-python","patch_set":6,"id":"0f3d4771_e7ba159e","line":1054,"updated":"2022-08-09 08:04:02.000000000","message":"I think we should raise 409 if user_data is provided with SOFT reboot and the instance has config_drive","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"290aba9d3eda0151d94b76c28219d0765cabf1c6","unresolved":true,"context_lines":[{"line_number":1051,"context_line":"            if instance[\u0027config_drive\u0027] !\u003d \"\" and \\"},{"line_number":1052,"context_line":"                    instance[\u0027config_drive\u0027] is not None:"},{"line_number":1053,"context_line":"                instance.config_drive_dirty \u003d True"},{"line_number":1054,"context_line":""},{"line_number":1055,"context_line":"        try:"},{"line_number":1056,"context_line":"            self.compute_api.reboot(context, instance, reboot_type)"},{"line_number":1057,"context_line":"        except exception.InstanceIsLocked as e:"}],"source_content_type":"text/x-python","patch_set":6,"id":"6cc32291_5d59116f","line":1054,"in_reply_to":"0f3d4771_e7ba159e","updated":"2022-08-12 13:21:55.000000000","message":"Actually, user data updates with SOFT reboots are currently silently dropped, regardless of whether a config drive is used or not.\nSo I think we should always raise 409 on user data updates with SOFT reboot. Code has been adjusted.","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[{"line_number":1051,"context_line":"            if instance[\u0027config_drive\u0027] !\u003d \"\" and \\"},{"line_number":1052,"context_line":"                    instance[\u0027config_drive\u0027] is not None:"},{"line_number":1053,"context_line":"                instance.config_drive_dirty \u003d True"},{"line_number":1054,"context_line":""},{"line_number":1055,"context_line":"        try:"},{"line_number":1056,"context_line":"            self.compute_api.reboot(context, instance, reboot_type)"},{"line_number":1057,"context_line":"        except exception.InstanceIsLocked as e:"}],"source_content_type":"text/x-python","patch_set":6,"id":"b2309437_2430a5c0","line":1054,"in_reply_to":"6cc32291_5d59116f","updated":"2022-08-16 01:08:18.000000000","message":"Hm, not requiring config drive in the validation means the reboot API can also be used by instances not using config drive to update user data.\n\nIf this is what we want to do, I think more words should be added to the doc paragraph for the reboot API that both config drive and non config drive instances can use it. The current doc makes it sound like config drive is reboot only and non config drive is PUT /servers/{server_id} only.","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"            if instance[\u0027config_drive\u0027] !\u003d \"\" and \\"},{"line_number":1052,"context_line":"                    instance[\u0027config_drive\u0027] is not None:"},{"line_number":1053,"context_line":"                instance.config_drive_dirty \u003d True"},{"line_number":1054,"context_line":""},{"line_number":1055,"context_line":"        try:"},{"line_number":1056,"context_line":"            self.compute_api.reboot(context, instance, reboot_type)"},{"line_number":1057,"context_line":"        except exception.InstanceIsLocked as e:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7e9912c1_117cc5c1","line":1054,"in_reply_to":"7a13a97c_cb4d8285","updated":"2022-08-22 08:10:22.000000000","message":"I also think it would be okay to allow updates for all instances via hard reboots. I\u0027ve added more words to the docs (reboot_hard_with_user_data_update) to emphasize this.","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f471df0c1f47824c078ee4ae85c59563b9bb848b","unresolved":true,"context_lines":[{"line_number":1051,"context_line":"            if instance[\u0027config_drive\u0027] !\u003d \"\" and \\"},{"line_number":1052,"context_line":"                    instance[\u0027config_drive\u0027] is not None:"},{"line_number":1053,"context_line":"                instance.config_drive_dirty \u003d True"},{"line_number":1054,"context_line":""},{"line_number":1055,"context_line":"        try:"},{"line_number":1056,"context_line":"            self.compute_api.reboot(context, instance, reboot_type)"},{"line_number":1057,"context_line":"        except exception.InstanceIsLocked as e:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a13a97c_cb4d8285","line":1054,"in_reply_to":"b2309437_2430a5c0","updated":"2022-08-17 09:35:57.000000000","message":"I\u0027m OK to restrict the user_data update to HARD reboot regardless of config drive. That creates a bit easier to understand API.","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f471df0c1f47824c078ee4ae85c59563b9bb848b","unresolved":true,"context_lines":[{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"        if \u0027user_data\u0027 in body[\u0027reboot\u0027]:"},{"line_number":1048,"context_line":"            if reboot_type \u003d\u003d \u0027HARD\u0027:"},{"line_number":1049,"context_line":"                instance[\u0027user_data\u0027] \u003d body[\u0027reboot\u0027][\u0027user_data\u0027]"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"                if instance[\u0027config_drive\u0027]:"},{"line_number":1052,"context_line":"                    instance.config_drive_dirty \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"1d3b49d4_4eccce36","line":1049,"updated":"2022-08-17 09:35:57.000000000","message":"nit: use instance.user_data and instance.config_drive instead of the dict access (at some point we want to remove the dict compatibility from the instance ovo).","commit_id":"86b6394d9ee2e818d09fed7b2adcd5fa4ef7498d"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"        if \u0027user_data\u0027 in body[\u0027reboot\u0027]:"},{"line_number":1048,"context_line":"            if reboot_type \u003d\u003d \u0027HARD\u0027:"},{"line_number":1049,"context_line":"                instance[\u0027user_data\u0027] \u003d body[\u0027reboot\u0027][\u0027user_data\u0027]"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"                if instance[\u0027config_drive\u0027]:"},{"line_number":1052,"context_line":"                    instance.config_drive_dirty \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"325c962b_941d2fd1","line":1049,"in_reply_to":"1d3b49d4_4eccce36","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"86b6394d9ee2e818d09fed7b2adcd5fa4ef7498d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f471df0c1f47824c078ee4ae85c59563b9bb848b","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"                if instance[\u0027config_drive\u0027]:"},{"line_number":1052,"context_line":"                    instance.config_drive_dirty \u003d True"},{"line_number":1053,"context_line":"            else:"},{"line_number":1054,"context_line":"                raise exc.HTTPConflict(explanation\u003d"},{"line_number":1055,"context_line":"                                       \"User data can only be updated \""},{"line_number":1056,"context_line":"                                       \"with a hard reboot via this API.\")"},{"line_number":1057,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"d0a18555_f7ccc135","line":1054,"updated":"2022-08-17 09:35:57.000000000","message":"thanks","commit_id":"86b6394d9ee2e818d09fed7b2adcd5fa4ef7498d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c0117419fd262c7060a783dcb32f3d39b856dede","unresolved":true,"context_lines":[{"line_number":938,"context_line":"                update_dict[\u0027user_data\u0027] \u003d server[\u0027user_data\u0027]"},{"line_number":939,"context_line":"            else:"},{"line_number":940,"context_line":"                raise exc.HTTPConflict(explanation\u003d"},{"line_number":941,"context_line":"                                \"User data cannot be updated via \""},{"line_number":942,"context_line":"                                \"this API when a config drive is configured. \""},{"line_number":943,"context_line":"                                \"Please use the Reboot Action API instead \""},{"line_number":944,"context_line":"                                \"and update user data with a hard reboot.\")"}],"source_content_type":"text/x-python","patch_set":14,"id":"be72b935_d93ab8b0","line":941,"range":{"start_line":941,"start_character":16,"end_line":941,"end_character":32},"updated":"2022-08-29 08:01:19.000000000","message":"nit: this is either under or over indented.\n\nI would wrap this like:\n\n                raise exc.HTTPConflict(\n                    explanation\u003d\"User data cannot be updated via \"\n                    \"this API when a config drive is configured. \"\n                    \"Please use the Reboot Action API instead \"\n                    \"and update user data with a hard reboot.\"\n                )","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"137f2dca4d00ebb90c7ab8ff5900d66717664b2e","unresolved":false,"context_lines":[{"line_number":938,"context_line":"                update_dict[\u0027user_data\u0027] \u003d server[\u0027user_data\u0027]"},{"line_number":939,"context_line":"            else:"},{"line_number":940,"context_line":"                raise exc.HTTPConflict(explanation\u003d"},{"line_number":941,"context_line":"                                \"User data cannot be updated via \""},{"line_number":942,"context_line":"                                \"this API when a config drive is configured. \""},{"line_number":943,"context_line":"                                \"Please use the Reboot Action API instead \""},{"line_number":944,"context_line":"                                \"and update user data with a hard reboot.\")"}],"source_content_type":"text/x-python","patch_set":14,"id":"d1efb82c_c17a9a79","line":941,"range":{"start_line":941,"start_character":16,"end_line":941,"end_character":32},"in_reply_to":"be72b935_d93ab8b0","updated":"2022-08-31 10:00:59.000000000","message":"Ack","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c0117419fd262c7060a783dcb32f3d39b856dede","unresolved":true,"context_lines":[{"line_number":1064,"context_line":"                    \u0027reboot\u0027, id)"},{"line_number":1065,"context_line":"        except exception.ConfigDriveRegenerationUnsupported:"},{"line_number":1066,"context_line":"            raise exc.HTTPConflict(explanation\u003d"},{"line_number":1067,"context_line":"                                       \"Unable to update user data: Config \""},{"line_number":1068,"context_line":"                                       \"drive cannot be regenerated because \""},{"line_number":1069,"context_line":"                                       \"compute driver lacks support.\")"},{"line_number":1070,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"033c59ff_53cd6b34","line":1067,"range":{"start_line":1067,"start_character":35,"end_line":1067,"end_character":39},"updated":"2022-08-29 08:01:19.000000000","message":"nit: indentation","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1da3b83bccf0bcd93a003a2fbb22bb1c5d5f0622","unresolved":true,"context_lines":[{"line_number":1064,"context_line":"                    \u0027reboot\u0027, id)"},{"line_number":1065,"context_line":"        except exception.ConfigDriveRegenerationUnsupported:"},{"line_number":1066,"context_line":"            raise exc.HTTPConflict(explanation\u003d"},{"line_number":1067,"context_line":"                                       \"Unable to update user data: Config \""},{"line_number":1068,"context_line":"                                       \"drive cannot be regenerated because \""},{"line_number":1069,"context_line":"                                       \"compute driver lacks support.\")"},{"line_number":1070,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"52c0d6e4_520b467e","line":1067,"range":{"start_line":1067,"start_character":35,"end_line":1067,"end_character":39},"in_reply_to":"033c59ff_53cd6b34","updated":"2022-08-30 20:01:04.000000000","message":"If we fail here, we have already set the flag and already updated the user_data, even though we\u0027re going to tell the user that we failed. If this happens because of an upgrade constraint, then this new user data could just pop into existence in six months when the operator upgrades the compute node. We should probably revert here, right?","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"62bbe4a85073c7567a2e0cb4b187552a6af6861a","unresolved":true,"context_lines":[{"line_number":1064,"context_line":"                    \u0027reboot\u0027, id)"},{"line_number":1065,"context_line":"        except exception.ConfigDriveRegenerationUnsupported:"},{"line_number":1066,"context_line":"            raise exc.HTTPConflict(explanation\u003d"},{"line_number":1067,"context_line":"                                       \"Unable to update user data: Config \""},{"line_number":1068,"context_line":"                                       \"drive cannot be regenerated because \""},{"line_number":1069,"context_line":"                                       \"compute driver lacks support.\")"},{"line_number":1070,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9757967e_2688ac27","line":1067,"range":{"start_line":1067,"start_character":35,"end_line":1067,"end_character":39},"in_reply_to":"52c0d6e4_520b467e","updated":"2022-08-31 12:47:16.000000000","message":"did we save the instance to the DB though or just updated a the in memory object?\n\nIf we did save it then I agree that we should move the check before that instance.save call","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"de4d5381f8418c90f5636752a4eb119448a425e2","unresolved":true,"context_lines":[{"line_number":1064,"context_line":"                    \u0027reboot\u0027, id)"},{"line_number":1065,"context_line":"        except exception.ConfigDriveRegenerationUnsupported:"},{"line_number":1066,"context_line":"            raise exc.HTTPConflict(explanation\u003d"},{"line_number":1067,"context_line":"                                       \"Unable to update user data: Config \""},{"line_number":1068,"context_line":"                                       \"drive cannot be regenerated because \""},{"line_number":1069,"context_line":"                                       \"compute driver lacks support.\")"},{"line_number":1070,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"2644e7ca_62261811","line":1067,"range":{"start_line":1067,"start_character":35,"end_line":1067,"end_character":39},"in_reply_to":"9757967e_2688ac27","updated":"2022-08-31 13:29:00.000000000","message":"Ah, so we are sending user_data over RPC, you\u0027re right. But, that means we\u0027ve added (potentially) 64k to the reboot RPC call, which is maybe not so good. I had in my head that this was saving that separately. In that case, we\u0027ve already got the obj_changes() to tell us that user_data is mutated and we don\u0027t need the sysmeta flag to do it. I\u0027m still not sure it\u0027s the best idea to send that over the wire, but...","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"}],"nova/api/validation/parameter_types.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f471df0c1f47824c078ee4ae85c59563b9bb848b","unresolved":true,"context_lines":[{"line_number":525,"context_line":"    \u0027oneOf\u0027: [{\u0027type\u0027: \u0027string\u0027, \u0027format\u0027: \u0027base64\u0027, \u0027maxLength\u0027: 65535},"},{"line_number":526,"context_line":"              {\u0027type\u0027: \u0027null\u0027},"},{"line_number":527,"context_line":"              ]"},{"line_number":528,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":8,"id":"a222548e_4076e437","line":528,"updated":"2022-08-17 09:35:57.000000000","message":"femto-nit: I would indent this as:\n\n user_data \u003d {\n     \"oneOf\": [\n         {\"type\": \"string\", \"format\": \"base64\", \"maxLength\": 65535},\n         {\"type\": \"null\"},\n     ]\n }","commit_id":"86b6394d9ee2e818d09fed7b2adcd5fa4ef7498d"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":525,"context_line":"    \u0027oneOf\u0027: [{\u0027type\u0027: \u0027string\u0027, \u0027format\u0027: \u0027base64\u0027, \u0027maxLength\u0027: 65535},"},{"line_number":526,"context_line":"              {\u0027type\u0027: \u0027null\u0027},"},{"line_number":527,"context_line":"              ]"},{"line_number":528,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":8,"id":"ea641cac_6f29fa76","line":528,"in_reply_to":"a222548e_4076e437","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"86b6394d9ee2e818d09fed7b2adcd5fa4ef7498d"}],"nova/compute/api.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c0117419fd262c7060a783dcb32f3d39b856dede","unresolved":false,"context_lines":[{"line_number":3576,"context_line":""},{"line_number":3577,"context_line":"            if os_traits.COMPUTE_CONFIG_DRIVE_REGENERATION not in traits:"},{"line_number":3578,"context_line":"                raise exception.ConfigDriveRegenerationUnsupported()"},{"line_number":3579,"context_line":""},{"line_number":3580,"context_line":"        instance.task_state \u003d task_states.REBOOTING_HARD"},{"line_number":3581,"context_line":"        instance.save(expected_task_state\u003dtask_states.ALLOW_REBOOT)"},{"line_number":3582,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"844a0ef4_9cd5cd48","line":3579,"updated":"2022-08-29 08:01:19.000000000","message":"+1 thanks you!","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a6e7bb13376a32bc31abdd76a3f2b3c4c7da5827","unresolved":true,"context_lines":[{"line_number":3572,"context_line":"            cn \u003d objects.ComputeNode.get_by_host_and_nodename("},{"line_number":3573,"context_line":"                context, instance.host, instance.node)"},{"line_number":3574,"context_line":"            traits \u003d self.placementclient.get_provider_traits("},{"line_number":3575,"context_line":"                context, cn.uuid).traits"},{"line_number":3576,"context_line":""},{"line_number":3577,"context_line":"            if os_traits.COMPUTE_CONFIG_DRIVE_REGENERATION not in traits:"},{"line_number":3578,"context_line":"                raise exception.ConfigDriveRegenerationUnsupported()"}],"source_content_type":"text/x-python","patch_set":15,"id":"d6ee320f_58a669f6","line":3575,"updated":"2022-08-30 18:57:33.000000000","message":"We really have to call to placement to know if we can do this on our own compute node? Can\u0027t we look up these capabilities in our own DB?","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4f996d7c08f4328d6bb21e67acc62328de7341b3","unresolved":true,"context_lines":[{"line_number":3572,"context_line":"            cn \u003d objects.ComputeNode.get_by_host_and_nodename("},{"line_number":3573,"context_line":"                context, instance.host, instance.node)"},{"line_number":3574,"context_line":"            traits \u003d self.placementclient.get_provider_traits("},{"line_number":3575,"context_line":"                context, cn.uuid).traits"},{"line_number":3576,"context_line":""},{"line_number":3577,"context_line":"            if os_traits.COMPUTE_CONFIG_DRIVE_REGENERATION not in traits:"},{"line_number":3578,"context_line":"                raise exception.ConfigDriveRegenerationUnsupported()"}],"source_content_type":"text/x-python","patch_set":15,"id":"d085c2a3_092e2fac","line":3575,"in_reply_to":"4945ef6f_7f6cf8d8","updated":"2022-08-31 14:01:47.000000000","message":"Yeah, I really thought we wrote these things (some of them) to our database for the scheduler because we had to filter on similar things before the days of placement. I guess I\u0027m thinking of the HostState stuff that the scheduler has access to, which doesn\u0027t apply here.\n\nThat said, every time we add something like this, we increase our dependence on placement for very simple things we should be able to do ourselves, like a reboot. That means that if we\u0027re in an upgrade or emergency situation, we have to have placement available in order to do some basic stuff, which I think is a less-desirable model. Especially in an edge type deployment, we need to consider the impact of how we\u0027d be restricted if an external service is not local and the network is not happy.\n\nBut, that\u0027s obviously a different conversation not directly related to this patch.\n\nIf we did reboot as a call, then we could let the compute tell us if it supports it or not, but that\u0027s a larger change that maybe we\u0027re not prepared to make.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"62bbe4a85073c7567a2e0cb4b187552a6af6861a","unresolved":true,"context_lines":[{"line_number":3572,"context_line":"            cn \u003d objects.ComputeNode.get_by_host_and_nodename("},{"line_number":3573,"context_line":"                context, instance.host, instance.node)"},{"line_number":3574,"context_line":"            traits \u003d self.placementclient.get_provider_traits("},{"line_number":3575,"context_line":"                context, cn.uuid).traits"},{"line_number":3576,"context_line":""},{"line_number":3577,"context_line":"            if os_traits.COMPUTE_CONFIG_DRIVE_REGENERATION not in traits:"},{"line_number":3578,"context_line":"                raise exception.ConfigDriveRegenerationUnsupported()"}],"source_content_type":"text/x-python","patch_set":15,"id":"4945ef6f_7f6cf8d8","line":3575,"in_reply_to":"d6ee320f_58a669f6","updated":"2022-08-31 12:47:16.000000000","message":"I suggested to do this based on the existing examples:\n* https://github.com/openstack/nova/blob/733a87e6126e4da8261eada74ba2cd0ec55f8a72/nova/compute/api.py#L4371\n* https://github.com/openstack/nova/blob/733a87e6126e4da8261eada74ba2cd0ec55f8a72/nova/compute/api.py#L4729\n\nI don\u0027t see we look up compute capabilities in the compute.api form the DB.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"}],"nova/objects/instance.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[{"line_number":1227,"context_line":"            if pci_req.request_id !\u003d pci_device.request_id]"},{"line_number":1228,"context_line":""},{"line_number":1229,"context_line":"    @property"},{"line_number":1230,"context_line":"    def config_drive_dirty(self):"},{"line_number":1231,"context_line":"        return \"True\" \u003d\u003d self.system_metadata.get(\u0027config_drive_dirty\u0027, False)"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"    @config_drive_dirty.setter"}],"source_content_type":"text/x-python","patch_set":7,"id":"60bd53e3_1cbdcf2b","line":1230,"range":{"start_line":1230,"start_character":21,"end_line":1230,"end_character":26},"updated":"2022-08-16 01:08:18.000000000","message":"The word \"changed\" would be more consistent with the current code, i.e. obj_what_changed().","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a6e7bb13376a32bc31abdd76a3f2b3c4c7da5827","unresolved":true,"context_lines":[{"line_number":1227,"context_line":"            if pci_req.request_id !\u003d pci_device.request_id]"},{"line_number":1228,"context_line":""},{"line_number":1229,"context_line":"    @property"},{"line_number":1230,"context_line":"    def config_drive_dirty(self):"},{"line_number":1231,"context_line":"        return \"True\" \u003d\u003d self.system_metadata.get(\u0027config_drive_dirty\u0027, False)"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"    @config_drive_dirty.setter"}],"source_content_type":"text/x-python","patch_set":7,"id":"cabc166d_9f78e7c9","line":1230,"range":{"start_line":1230,"start_character":21,"end_line":1230,"end_character":26},"in_reply_to":"032677a3_09db89f0","updated":"2022-08-30 18:57:33.000000000","message":"\"needs_rebuild\" would sound better to me. It\u0027s not dirty in the conventional cache-coherency sense of the word (IMHO) and agree it\u0027s not \"changed\" either.","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6956d7aa394593ca01e887ef376b8b3cb2d63b83","unresolved":true,"context_lines":[{"line_number":1227,"context_line":"            if pci_req.request_id !\u003d pci_device.request_id]"},{"line_number":1228,"context_line":""},{"line_number":1229,"context_line":"    @property"},{"line_number":1230,"context_line":"    def config_drive_dirty(self):"},{"line_number":1231,"context_line":"        return \"True\" \u003d\u003d self.system_metadata.get(\u0027config_drive_dirty\u0027, False)"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"    @config_drive_dirty.setter"}],"source_content_type":"text/x-python","patch_set":7,"id":"67ad0692_70aa2de3","line":1230,"range":{"start_line":1230,"start_character":21,"end_line":1230,"end_character":26},"in_reply_to":"4c707935_33e67e82","updated":"2022-08-26 16:06:39.000000000","message":"i could go either way with this\n\nthe idea of a dirty bit of flag is pretty standard termioly to convey that this data is invlaid and or the state is inconsitent and something need to be doen to resolve it.\n\ni kind of see where jan is coming from \"changed\" event like network-vif-chaged are set after the change has happend and in general since its past tence the \"has been updated\" conitation i think rights strong then need to be updated.\n\nso im ok with config_drive_dirty\n\nor config_drive_pending_rebuild perhaps, i think that would be even clearer.","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":true,"context_lines":[{"line_number":1227,"context_line":"            if pci_req.request_id !\u003d pci_device.request_id]"},{"line_number":1228,"context_line":""},{"line_number":1229,"context_line":"    @property"},{"line_number":1230,"context_line":"    def config_drive_dirty(self):"},{"line_number":1231,"context_line":"        return \"True\" \u003d\u003d self.system_metadata.get(\u0027config_drive_dirty\u0027, False)"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"    @config_drive_dirty.setter"}],"source_content_type":"text/x-python","patch_set":7,"id":"4c707935_33e67e82","line":1230,"range":{"start_line":1230,"start_character":21,"end_line":1230,"end_character":26},"in_reply_to":"60bd53e3_1cbdcf2b","updated":"2022-08-22 08:10:22.000000000","message":"In case we\u0027re talking about \"config_drive_changed\", I think this would rather imply whether the config drive has already been updated. If we want to stick to the word \"change\", maybe we could use config_drive_needs_change?","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"22dc070e05423a8c66f4fed1244bedc006d18d73","unresolved":true,"context_lines":[{"line_number":1227,"context_line":"            if pci_req.request_id !\u003d pci_device.request_id]"},{"line_number":1228,"context_line":""},{"line_number":1229,"context_line":"    @property"},{"line_number":1230,"context_line":"    def config_drive_dirty(self):"},{"line_number":1231,"context_line":"        return \"True\" \u003d\u003d self.system_metadata.get(\u0027config_drive_dirty\u0027, False)"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"    @config_drive_dirty.setter"}],"source_content_type":"text/x-python","patch_set":7,"id":"032677a3_09db89f0","line":1230,"range":{"start_line":1230,"start_character":21,"end_line":1230,"end_character":26},"in_reply_to":"67ad0692_70aa2de3","updated":"2022-08-26 18:43:07.000000000","message":"I like Sean\u0027s suggestion \"config_drive_pending_rebuild\" but am good with whatever the consensus is. I mentioned \"dirty\" because although it is standard terminology, it actually doesn\u0027t show up a ton in the nova code outside of code comments.","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a6e7bb13376a32bc31abdd76a3f2b3c4c7da5827","unresolved":true,"context_lines":[{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"    @config_drive_dirty.setter"},{"line_number":1234,"context_line":"    def config_drive_dirty(self, dirty):"},{"line_number":1235,"context_line":"        self.system_metadata[\u0027config_drive_dirty\u0027] \u003d dirty"},{"line_number":1236,"context_line":""},{"line_number":1237,"context_line":""},{"line_number":1238,"context_line":"def _make_instance_list(context, inst_list, db_inst_list, expected_attrs):"}],"source_content_type":"text/x-python","patch_set":15,"id":"f31f7593_ff5dd9fc","line":1235,"updated":"2022-08-30 18:57:33.000000000","message":"I also think (ab)using system metadata for this is not great either. While bytes are cheap these days, we\u0027ll end up with a ton of cruft in the database for a bunch of instances that are dirty\u003dFalse.\n\nSeems like it would be better to only store \u003dTrue, and pop it out if False. Either way, I guess I\u0027m not sure why this is an instance-resident thing instead of an RPC parameter. We only allow changing the configdrive if we\u0027re doing a hard reboot with the extra user_data right? Seems like we\u0027re setting the new data and this property to avoid needing to pass an RPC parameter, bump that version, etc. That means we have no way to ensure that an old compute will do this, or we know it can\u0027t .. right?","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"}],"nova/tests/functional/api_sample_tests/api_samples/servers/v2.93/server-action-reboot.json.tpl":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"daca8b9f_1483b2f5","line":7,"updated":"2022-08-16 01:08:18.000000000","message":"Seems like doc/api_samples/servers/v2.93/server-action-reboot.json is missing?","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"4e40082f_18f415aa","line":7,"in_reply_to":"daca8b9f_1483b2f5","updated":"2022-08-22 08:10:22.000000000","message":"Ack, added","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a6e7bb13376a32bc31abdd76a3f2b3c4c7da5827","unresolved":true,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"reboot\" : {"},{"line_number":3,"context_line":"        \"type\" : \"%(type)s\","},{"line_number":4,"context_line":"        \"user_data\": \"data\""},{"line_number":5,"context_line":"    }"},{"line_number":6,"context_line":"}"}],"source_content_type":"text/x-smarty","patch_set":15,"id":"245ab90f_4906b5d0","line":4,"updated":"2022-08-30 18:57:33.000000000","message":"same","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"}],"nova/tests/functional/api_sample_tests/api_samples/servers/v2.93/server-create-req.json.tpl":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"ffcf8a00_7a776369","line":22,"updated":"2022-08-16 01:08:18.000000000","message":"Seems like we don\u0027t need this? (API hasn\u0027t changed)","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"3ff63f9f_64b89f5c","line":22,"in_reply_to":"ffcf8a00_7a776369","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"}],"nova/tests/functional/api_sample_tests/api_samples/servers/v2.93/server-create-resp.json.tpl":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"70943053_40db3f52","line":23,"updated":"2022-08-16 01:08:18.000000000","message":"Same.","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"923403c6_2789af30","line":23,"in_reply_to":"70943053_40db3f52","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"}],"nova/tests/functional/api_sample_tests/api_samples/servers/v2.93/server-get-resp.json.tpl":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"75a115e9_08904807","line":82,"updated":"2022-08-16 01:08:18.000000000","message":"Same.","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"9755dff1_3a701703","line":82,"in_reply_to":"75a115e9_08904807","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"}],"nova/tests/functional/api_sample_tests/api_samples/servers/v2.93/server-update-req.json.tpl":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"bc72ae49_7cacc029","line":8,"updated":"2022-08-16 01:08:18.000000000","message":"Seems like doc/api_samples/servers/v2.93/server-update-req.json is missing?","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"c2f3816c_e8cc3f98","line":8,"in_reply_to":"bc72ae49_7cacc029","updated":"2022-08-22 08:10:22.000000000","message":"Ack, added","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"}],"nova/tests/functional/api_sample_tests/api_samples/servers/v2.93/server-update-resp.json.tpl":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"4117aa53_cfdec31f","line":79,"updated":"2022-08-16 01:08:18.000000000","message":"Seems like we don\u0027t need this? (API hasn\u0027t changed)","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"a7525b3d_bc3729f2","line":79,"in_reply_to":"4117aa53_cfdec31f","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"}],"nova/tests/functional/api_sample_tests/api_samples/servers/v2.93/servers-details-resp.json.tpl":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"8e59409e_bc9e9f9b","line":89,"updated":"2022-08-16 01:08:18.000000000","message":"Seems like we don\u0027t need this? (API hasn\u0027t changed)","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"5b7414e5_f663d2f8","line":89,"in_reply_to":"8e59409e_bc9e9f9b","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"}],"nova/tests/functional/api_sample_tests/api_samples/servers/v2.93/servers-list-resp.json.tpl":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"6c1be6fd_53071480","line":25,"updated":"2022-08-16 01:08:18.000000000","message":"Seems like we don\u0027t need this? (API hasn\u0027t changed)","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"45c6d023_818d0225","line":25,"in_reply_to":"6c1be6fd_53071480","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"}],"nova/tests/functional/api_sample_tests/test_servers.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"fda2b5c4b39b49f3721e5b062dc5d43ec58a622b","unresolved":true,"context_lines":[{"line_number":621,"context_line":"class ServersSampleJson293Test(ServersSampleJsonTest):"},{"line_number":622,"context_line":"    microversion \u003d \u00272.93\u0027"},{"line_number":623,"context_line":"    scenarios \u003d [(\u0027v2_93\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"},{"line_number":624,"context_line":"    use_common_server_post \u003d False"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    ADMIN_API \u003d False"},{"line_number":627,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"59e59a92_8cf1d36a","line":624,"range":{"start_line":624,"start_character":29,"end_line":624,"end_character":34},"updated":"2022-08-30 23:21:30.000000000","message":"I think this is why the func tests are requiring an unnecessary template and sample for server-create, based on some local testing. The server-get, server-details, and server-list appear to be unavoidable though.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"fda2b5c4b39b49f3721e5b062dc5d43ec58a622b","unresolved":true,"context_lines":[{"line_number":623,"context_line":"    scenarios \u003d [(\u0027v2_93\u0027, {\u0027api_major_version\u0027: \u0027v2.1\u0027})]"},{"line_number":624,"context_line":"    use_common_server_post \u003d False"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    ADMIN_API \u003d False"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"class ServersUpdateSampleJsonTest(ServersSampleBase):"}],"source_content_type":"text/x-python","patch_set":15,"id":"f25841cd_b2f5ff7c","line":626,"range":{"start_line":626,"start_character":16,"end_line":626,"end_character":21},"updated":"2022-08-30 23:21:30.000000000","message":"I think we may want to set this to True because user_data is returned in the PUT /servers/{server_id} response for admin-only, by default. We may be able to assert that the newly specified user_data matches in the response.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"}],"nova/tests/unit/api/openstack/compute/test_server_actions.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"816bae293f718e12a98ad3ae0a50d329e0989812","unresolved":true,"context_lines":[{"line_number":258,"context_line":"                          self.req, FAKE_UUID, body\u003dbody)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def test_reboot_hard_with_user_data_update(self):"},{"line_number":261,"context_line":"        with mock.patch(\"nova.objects.Instance.config_drive_dirty\","},{"line_number":262,"context_line":"                        new_callable\u003dmock.PropertyMock) as \\"},{"line_number":263,"context_line":"                mock_config_drive_dirty:"},{"line_number":264,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"},{"line_number":265,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":266,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"},{"line_number":267,"context_line":"            self.assertFalse(mock_config_drive_dirty.called)"}],"source_content_type":"text/x-python","patch_set":6,"id":"6f4c135b_ebc85831","line":264,"range":{"start_line":261,"start_character":8,"end_line":264,"end_character":67},"updated":"2022-08-09 08:04:02.000000000","message":"you can format this like:\n\n  with mock.patch(\n      ...\n  ) as mock_config_drive_dirty:\n      ...","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"290aba9d3eda0151d94b76c28219d0765cabf1c6","unresolved":false,"context_lines":[{"line_number":258,"context_line":"                          self.req, FAKE_UUID, body\u003dbody)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def test_reboot_hard_with_user_data_update(self):"},{"line_number":261,"context_line":"        with mock.patch(\"nova.objects.Instance.config_drive_dirty\","},{"line_number":262,"context_line":"                        new_callable\u003dmock.PropertyMock) as \\"},{"line_number":263,"context_line":"                mock_config_drive_dirty:"},{"line_number":264,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"},{"line_number":265,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":266,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"},{"line_number":267,"context_line":"            self.assertFalse(mock_config_drive_dirty.called)"}],"source_content_type":"text/x-python","patch_set":6,"id":"8e06b016_0fdff35c","line":264,"range":{"start_line":261,"start_character":8,"end_line":264,"end_character":67},"in_reply_to":"6f4c135b_ebc85831","updated":"2022-08-12 13:21:55.000000000","message":"Ack","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"816bae293f718e12a98ad3ae0a50d329e0989812","unresolved":true,"context_lines":[{"line_number":264,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"},{"line_number":265,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":266,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"},{"line_number":267,"context_line":"            self.assertFalse(mock_config_drive_dirty.called)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def test_reboot_hard_with_user_data_update_and_config_drive(self):"},{"line_number":270,"context_line":"        # Mock an instance with config drive"}],"source_content_type":"text/x-python","patch_set":6,"id":"84376a01_149963fd","line":267,"updated":"2022-08-09 08:04:02.000000000","message":"please add a note here that the dirty flag is not set as the instance has no config drive","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"290aba9d3eda0151d94b76c28219d0765cabf1c6","unresolved":false,"context_lines":[{"line_number":264,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"},{"line_number":265,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":266,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"},{"line_number":267,"context_line":"            self.assertFalse(mock_config_drive_dirty.called)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def test_reboot_hard_with_user_data_update_and_config_drive(self):"},{"line_number":270,"context_line":"        # Mock an instance with config drive"}],"source_content_type":"text/x-python","patch_set":6,"id":"a6a31ae6_4c633a9f","line":267,"in_reply_to":"84376a01_149963fd","updated":"2022-08-12 13:21:55.000000000","message":"Ack","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"816bae293f718e12a98ad3ae0a50d329e0989812","unresolved":true,"context_lines":[{"line_number":278,"context_line":"        with mock.patch(\"nova.objects.Instance.config_drive_dirty\","},{"line_number":279,"context_line":"                        new_callable\u003dmock.PropertyMock) as \\"},{"line_number":280,"context_line":"                mock_config_drive_dirty:"},{"line_number":281,"context_line":"            self.stub_out(\"nova.compute.api.API.get\", wrap_get)"},{"line_number":282,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"},{"line_number":283,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":284,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":6,"id":"8db47876_43fe1939","line":281,"updated":"2022-08-09 08:04:02.000000000","message":"you can follow the pattern in this file by using\n\n        fakes.fake_compute_get(config_drive\u003dTrue)\n\ninstead of rolling your own wrap_get","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"290aba9d3eda0151d94b76c28219d0765cabf1c6","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        with mock.patch(\"nova.objects.Instance.config_drive_dirty\","},{"line_number":279,"context_line":"                        new_callable\u003dmock.PropertyMock) as \\"},{"line_number":280,"context_line":"                mock_config_drive_dirty:"},{"line_number":281,"context_line":"            self.stub_out(\"nova.compute.api.API.get\", wrap_get)"},{"line_number":282,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"},{"line_number":283,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":284,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":6,"id":"0acc13d4_84bb0920","line":281,"in_reply_to":"8db47876_43fe1939","updated":"2022-08-12 13:21:55.000000000","message":"Ack","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[{"line_number":281,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":282,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"},{"line_number":283,"context_line":"            mock_config_drive_dirty.assert_called_with(True)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def _test_rebuild_preserve_ephemeral(self, value\u003dNone):"},{"line_number":286,"context_line":"        return_server \u003d fakes.fake_compute_get("},{"line_number":287,"context_line":"                project_id\u003dfakes.FAKE_PROJECT_ID,"}],"source_content_type":"text/x-python","patch_set":7,"id":"debc275c_f833ac15","line":284,"updated":"2022-08-16 01:08:18.000000000","message":"Need test verifying 409 response when calling with SOFT reboot + user_data. Do we also need an old microversion test? (I see that there is one for PUT /servers/{server_id})","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":281,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":282,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"},{"line_number":283,"context_line":"            mock_config_drive_dirty.assert_called_with(True)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def _test_rebuild_preserve_ephemeral(self, value\u003dNone):"},{"line_number":286,"context_line":"        return_server \u003d fakes.fake_compute_get("},{"line_number":287,"context_line":"                project_id\u003dfakes.FAKE_PROJECT_ID,"}],"source_content_type":"text/x-python","patch_set":7,"id":"582b4a64_03d651fd","line":284,"in_reply_to":"debc275c_f833ac15","updated":"2022-08-22 08:10:22.000000000","message":"Added one new test for soft rebooting with user data update, and one for hard rebooting with an older microversion to check the validation schemas.","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c0117419fd262c7060a783dcb32f3d39b856dede","unresolved":true,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def test_reboot_hard_with_user_data_update(self):"},{"line_number":261,"context_line":"        with mock.patch("},{"line_number":262,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":263,"context_line":"                new_callable\u003dmock.PropertyMock"},{"line_number":264,"context_line":"        ) as mock_config_drive_dirty:"},{"line_number":265,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"}],"source_content_type":"text/x-python","patch_set":14,"id":"c203660c_cc53e6ec","line":262,"range":{"start_line":262,"start_character":8,"end_line":262,"end_character":16},"updated":"2022-08-29 08:01:19.000000000","message":"nit: a single level of indent would be enough","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"137f2dca4d00ebb90c7ab8ff5900d66717664b2e","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def test_reboot_hard_with_user_data_update(self):"},{"line_number":261,"context_line":"        with mock.patch("},{"line_number":262,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":263,"context_line":"                new_callable\u003dmock.PropertyMock"},{"line_number":264,"context_line":"        ) as mock_config_drive_dirty:"},{"line_number":265,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"}],"source_content_type":"text/x-python","patch_set":14,"id":"29de693b_5cb2a5e1","line":262,"range":{"start_line":262,"start_character":8,"end_line":262,"end_character":16},"in_reply_to":"c203660c_cc53e6ec","updated":"2022-08-31 10:00:59.000000000","message":"Ack","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c0017ca585e11092c8c0dc44c5b533c395513434","unresolved":true,"context_lines":[{"line_number":258,"context_line":"                          self.req, FAKE_UUID, body\u003dbody)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def test_reboot_hard_with_user_data_update(self):"},{"line_number":261,"context_line":"        with mock.patch("},{"line_number":262,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":263,"context_line":"                new_callable\u003dmock.PropertyMock"},{"line_number":264,"context_line":"        ) as mock_config_drive_dirty:"},{"line_number":265,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"},{"line_number":266,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":267,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":14,"id":"b781cb8b_283bed6c","line":264,"range":{"start_line":261,"start_character":7,"end_line":264,"end_character":37},"updated":"2022-08-29 17:09:52.000000000","message":"the test failure is actully because of this property mock\n\nif i remove it and the assert it passes.","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c95644c0eb4ca4e01f575b05177a11b98024e037","unresolved":false,"context_lines":[{"line_number":258,"context_line":"                          self.req, FAKE_UUID, body\u003dbody)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def test_reboot_hard_with_user_data_update(self):"},{"line_number":261,"context_line":"        with mock.patch("},{"line_number":262,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":263,"context_line":"                new_callable\u003dmock.PropertyMock"},{"line_number":264,"context_line":"        ) as mock_config_drive_dirty:"},{"line_number":265,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"},{"line_number":266,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":267,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae720f4_c6e5e29e","line":264,"range":{"start_line":261,"start_character":7,"end_line":264,"end_character":37},"in_reply_to":"3a41c557_8b26f7ce","updated":"2022-08-29 18:14:21.000000000","message":"Done","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2e44a25e49528799924f58c896deeb9b5554142c","unresolved":true,"context_lines":[{"line_number":258,"context_line":"                          self.req, FAKE_UUID, body\u003dbody)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def test_reboot_hard_with_user_data_update(self):"},{"line_number":261,"context_line":"        with mock.patch("},{"line_number":262,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":263,"context_line":"                new_callable\u003dmock.PropertyMock"},{"line_number":264,"context_line":"        ) as mock_config_drive_dirty:"},{"line_number":265,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"},{"line_number":266,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":267,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a41c557_8b26f7ce","line":264,"range":{"start_line":261,"start_character":7,"end_line":264,"end_character":37},"in_reply_to":"b781cb8b_283bed6c","updated":"2022-08-29 17:33:23.000000000","message":"ok to fix these tests you just need to add\n\n fake_reboot \u003d mock.Mock()\n self.stub_out(\u0027nova.compute.api.API.reboot\u0027, fake_reboot)\n \n optionally you can assert that fack_reboot is called with an isntance object that has the dirty flag set if it should be set.","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8adf57dd24ea5cc0ff11f92fa625c9d99feea8c3","unresolved":true,"context_lines":[{"line_number":257,"context_line":"                          self.controller._action_reboot,"},{"line_number":258,"context_line":"                          self.req, FAKE_UUID, body\u003dbody)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def test_reboot_hard_with_user_data_update(self):"},{"line_number":261,"context_line":"        with mock.patch("},{"line_number":262,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":263,"context_line":"                new_callable\u003dmock.PropertyMock"},{"line_number":264,"context_line":"        ) as mock_config_drive_dirty:"},{"line_number":265,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"},{"line_number":266,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":267,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"            # Assert this is not set as the instance has no config drive"},{"line_number":270,"context_line":"            self.assertFalse(mock_config_drive_dirty.called)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def test_reboot_hard_with_user_data_update_and_config_drive(self):"},{"line_number":273,"context_line":"        with mock.patch("},{"line_number":274,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":275,"context_line":"                new_callable\u003dmock.PropertyMock"},{"line_number":276,"context_line":"        ) as mock_config_drive_dirty:"},{"line_number":277,"context_line":"            # Mock an instance with config drive"},{"line_number":278,"context_line":"            self.stub_out(\"nova.compute.api.API.get\","},{"line_number":279,"context_line":"                          fakes.fake_compute_get(config_drive\u003dTrue))"},{"line_number":280,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"},{"line_number":281,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":282,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"},{"line_number":283,"context_line":"            mock_config_drive_dirty.assert_called_with(True)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def test_reboot_soft_with_user_data_update_raises_conflict(self):"},{"line_number":286,"context_line":"        body \u003d dict(reboot\u003ddict(type\u003d\"SOFT\", user_data\u003d\"data\"))"}],"source_content_type":"text/x-python","patch_set":14,"id":"609784d0_fc72e690","line":283,"range":{"start_line":260,"start_character":4,"end_line":283,"end_character":60},"updated":"2022-08-29 16:48:59.000000000","message":"these are failing with \n\nTraceback (most recent call last):\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/api/openstack/wsgi.py\", line 664, in wrapped\n    return f(*args, **kwargs)\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/api/validation/__init__.py\", line 110, in wrapper\n    return func(*args, **kwargs)\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/api/validation/__init__.py\", line 110, in wrapper\n    return func(*args, **kwargs)\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/api/openstack/compute/servers.py\", line 1059, in _action_reboot\n    self.compute_api.reboot(context, instance, reboot_type)\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/compute/api.py\", line 241, in inner\n    return function(self, context, instance, *args, **kwargs)\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/compute/api.py\", line 3552, in reboot\n    self._hard_reboot(context, instance)\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/compute/api.py\", line 167, in inner\n    return f(self, context, instance, *args, **kw)\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/compute/api.py\", line 3572, in _hard_reboot\n    cn \u003d objects.ComputeNode.get_by_host_and_nodename(\n  File \"/home/zuul/src/opendev.org/openstack/nova/.tox/py38/lib/python3.8/site-packages/oslo_versionedobjects/base.py\", line 184, in wrapper\n    result \u003d fn(cls, context, *args, **kwargs)\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/objects/compute_node.py\", line 274, in get_by_host_and_nodename\n    db_compute \u003d db.compute_node_get_by_host_and_nodename(\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/db/main/api.py\", line 224, in wrapper\n    return f(context, *args, **kwargs)\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/db/main/api.py\", line 695, in compute_node_get_by_host_and_nodename\n    raise exception.ComputeHostNotFound(host\u003dhost)\nnova.exception.ComputeHostNotFound: Compute host fake_host could not be found.\n\n\n\nthe only delta of imporantce that i notice form \n\n    def test_reboot_hard(self):\n        body \u003d dict(reboot\u003ddict(type\u003d\"HARD\"))\n        self.controller._action_reboot(self.req, FAKE_UUID, body\u003dbody)\n        \nis that self.req has the project_id set\n\n        self.req \u003d fakes.HTTPRequest.blank(\u0027\u0027,\n                                           project_id\u003dfakes.FAKE_PROJECT_ID)\n                                           \nso i wonder if that is causing the issue here.","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"013582b0c7495526d0bc1db8b11a3a0a984fb847","unresolved":true,"context_lines":[{"line_number":257,"context_line":"                          self.controller._action_reboot,"},{"line_number":258,"context_line":"                          self.req, FAKE_UUID, body\u003dbody)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def test_reboot_hard_with_user_data_update(self):"},{"line_number":261,"context_line":"        with mock.patch("},{"line_number":262,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":263,"context_line":"                new_callable\u003dmock.PropertyMock"},{"line_number":264,"context_line":"        ) as mock_config_drive_dirty:"},{"line_number":265,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"},{"line_number":266,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":267,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"            # Assert this is not set as the instance has no config drive"},{"line_number":270,"context_line":"            self.assertFalse(mock_config_drive_dirty.called)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def test_reboot_hard_with_user_data_update_and_config_drive(self):"},{"line_number":273,"context_line":"        with mock.patch("},{"line_number":274,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":275,"context_line":"                new_callable\u003dmock.PropertyMock"},{"line_number":276,"context_line":"        ) as mock_config_drive_dirty:"},{"line_number":277,"context_line":"            # Mock an instance with config drive"},{"line_number":278,"context_line":"            self.stub_out(\"nova.compute.api.API.get\","},{"line_number":279,"context_line":"                          fakes.fake_compute_get(config_drive\u003dTrue))"},{"line_number":280,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"},{"line_number":281,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":282,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"},{"line_number":283,"context_line":"            mock_config_drive_dirty.assert_called_with(True)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def test_reboot_soft_with_user_data_update_raises_conflict(self):"},{"line_number":286,"context_line":"        body \u003d dict(reboot\u003ddict(type\u003d\"SOFT\", user_data\u003d\"data\"))"}],"source_content_type":"text/x-python","patch_set":14,"id":"f189ce02_30c969b2","line":283,"range":{"start_line":260,"start_character":4,"end_line":283,"end_character":60},"in_reply_to":"609784d0_fc72e690","updated":"2022-08-29 16:54:44.000000000","message":"actully thinking about this that is likely not the issue this api should not be calling deaply into the db layer. so you are likely missing mocking that should be presnt","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c95644c0eb4ca4e01f575b05177a11b98024e037","unresolved":false,"context_lines":[{"line_number":257,"context_line":"                          self.controller._action_reboot,"},{"line_number":258,"context_line":"                          self.req, FAKE_UUID, body\u003dbody)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def test_reboot_hard_with_user_data_update(self):"},{"line_number":261,"context_line":"        with mock.patch("},{"line_number":262,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":263,"context_line":"                new_callable\u003dmock.PropertyMock"},{"line_number":264,"context_line":"        ) as mock_config_drive_dirty:"},{"line_number":265,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"},{"line_number":266,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":267,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"            # Assert this is not set as the instance has no config drive"},{"line_number":270,"context_line":"            self.assertFalse(mock_config_drive_dirty.called)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def test_reboot_hard_with_user_data_update_and_config_drive(self):"},{"line_number":273,"context_line":"        with mock.patch("},{"line_number":274,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":275,"context_line":"                new_callable\u003dmock.PropertyMock"},{"line_number":276,"context_line":"        ) as mock_config_drive_dirty:"},{"line_number":277,"context_line":"            # Mock an instance with config drive"},{"line_number":278,"context_line":"            self.stub_out(\"nova.compute.api.API.get\","},{"line_number":279,"context_line":"                          fakes.fake_compute_get(config_drive\u003dTrue))"},{"line_number":280,"context_line":"            body \u003d dict(reboot\u003ddict(type\u003d\"HARD\", user_data\u003d\"data\"))"},{"line_number":281,"context_line":"            req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.93\u0027)"},{"line_number":282,"context_line":"            self.controller._action_reboot(req, FAKE_UUID, body\u003dbody)"},{"line_number":283,"context_line":"            mock_config_drive_dirty.assert_called_with(True)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def test_reboot_soft_with_user_data_update_raises_conflict(self):"},{"line_number":286,"context_line":"        body \u003d dict(reboot\u003ddict(type\u003d\"SOFT\", user_data\u003d\"data\"))"}],"source_content_type":"text/x-python","patch_set":14,"id":"c476400e_938af4e7","line":283,"range":{"start_line":260,"start_character":4,"end_line":283,"end_character":60},"in_reply_to":"f189ce02_30c969b2","updated":"2022-08-29 18:14:21.000000000","message":"Done","commit_id":"72d9e90e2c67378c5d2b1bd1bab757f724c29cc5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"49307dc2c71ba41ba120aa7c76940a92a54aea3f","unresolved":true,"context_lines":[{"line_number":258,"context_line":"                          self.req, FAKE_UUID, body\u003dbody)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def test_reboot_hard_with_user_data_update(self):"},{"line_number":261,"context_line":"        fake_reboot \u003d mock.Mock()"},{"line_number":262,"context_line":"        self.stub_out(\u0027nova.compute.api.API.reboot\u0027, fake_reboot)"},{"line_number":263,"context_line":"        with mock.patch("},{"line_number":264,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":265,"context_line":"                new_callable\u003dmock.PropertyMock"}],"source_content_type":"text/x-python","patch_set":15,"id":"69748f78_b9d4b9b1","line":262,"range":{"start_line":261,"start_character":0,"end_line":262,"end_character":65},"updated":"2022-08-30 08:02:36.000000000","message":"this is equivalent with:\nself.useFixture(fixtures.MockPatch(\u0027nova.compute.api.API.reboot\u0027))\n\nbut let a the mock library do the replacement and restoration of the reboot call","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"137f2dca4d00ebb90c7ab8ff5900d66717664b2e","unresolved":false,"context_lines":[{"line_number":258,"context_line":"                          self.req, FAKE_UUID, body\u003dbody)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def test_reboot_hard_with_user_data_update(self):"},{"line_number":261,"context_line":"        fake_reboot \u003d mock.Mock()"},{"line_number":262,"context_line":"        self.stub_out(\u0027nova.compute.api.API.reboot\u0027, fake_reboot)"},{"line_number":263,"context_line":"        with mock.patch("},{"line_number":264,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":265,"context_line":"                new_callable\u003dmock.PropertyMock"}],"source_content_type":"text/x-python","patch_set":15,"id":"2a6710b5_4a860927","line":262,"range":{"start_line":261,"start_character":0,"end_line":262,"end_character":65},"in_reply_to":"69748f78_b9d4b9b1","updated":"2022-08-31 10:00:59.000000000","message":"Ack","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5284ad14014ebf22551f03e14305540c8b1dea9f","unresolved":true,"context_lines":[{"line_number":258,"context_line":"                          self.req, FAKE_UUID, body\u003dbody)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def test_reboot_hard_with_user_data_update(self):"},{"line_number":261,"context_line":"        fake_reboot \u003d mock.Mock()"},{"line_number":262,"context_line":"        self.stub_out(\u0027nova.compute.api.API.reboot\u0027, fake_reboot)"},{"line_number":263,"context_line":"        with mock.patch("},{"line_number":264,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":265,"context_line":"                new_callable\u003dmock.PropertyMock"}],"source_content_type":"text/x-python","patch_set":15,"id":"30fa9825_f9b46c7a","line":262,"range":{"start_line":261,"start_character":0,"end_line":262,"end_character":65},"in_reply_to":"69748f78_b9d4b9b1","updated":"2022-08-30 14:42:29.000000000","message":"yes you are right\ni used self.stub_out just because it was bing used by the other test in this file but i also prefer to self.useFixture(fixtures.MockPatch(\u0027nova.compute.api.API.reboot\u0027))\nas that does not need you to understand the nova specific stub_out function\n\ni think this could be adress in a followup however with the other nits.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"49307dc2c71ba41ba120aa7c76940a92a54aea3f","unresolved":true,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":"    def test_reboot_hard_with_user_data_update_and_config_drive(self):"},{"line_number":275,"context_line":"        fake_reboot \u003d mock.Mock()"},{"line_number":276,"context_line":"        self.stub_out(\u0027nova.compute.api.API.reboot\u0027, fake_reboot)"},{"line_number":277,"context_line":"        with mock.patch("},{"line_number":278,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":279,"context_line":"                new_callable\u003dmock.PropertyMock"}],"source_content_type":"text/x-python","patch_set":15,"id":"d662af73_fab2e885","line":276,"updated":"2022-08-30 08:02:36.000000000","message":"ditto","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5284ad14014ebf22551f03e14305540c8b1dea9f","unresolved":false,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":"    def test_reboot_hard_with_user_data_update_and_config_drive(self):"},{"line_number":275,"context_line":"        fake_reboot \u003d mock.Mock()"},{"line_number":276,"context_line":"        self.stub_out(\u0027nova.compute.api.API.reboot\u0027, fake_reboot)"},{"line_number":277,"context_line":"        with mock.patch("},{"line_number":278,"context_line":"                \"nova.objects.Instance.config_drive_dirty\","},{"line_number":279,"context_line":"                new_callable\u003dmock.PropertyMock"}],"source_content_type":"text/x-python","patch_set":15,"id":"2d9b0df0_81ca2580","line":276,"in_reply_to":"d662af73_fab2e885","updated":"2022-08-30 14:42:29.000000000","message":"Ack","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"}],"nova/tests/unit/api/openstack/compute/test_servers.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7b72483f394933f9380797b405c83465e9801a3f","unresolved":true,"context_lines":[{"line_number":4213,"context_line":"            req, FAKE_UUID, body\u003dbody)"},{"line_number":4214,"context_line":"        self.assertIn(\u0027user_data\u0027, str(ex))"},{"line_number":4215,"context_line":""},{"line_number":4216,"context_line":"    def test_update_server_user_data_with_config_drive_fails(self):"},{"line_number":4217,"context_line":"        # Mock an instance with config drive"},{"line_number":4218,"context_line":"        orig_get \u003d compute_api.API.get"},{"line_number":4219,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"611748fc_83fd51b0","line":4216,"updated":"2022-08-04 12:14:22.000000000","message":"This test fails on the gate","commit_id":"41e5ccd21cf5a70c182e2c2ce2d1cd654875902b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"816bae293f718e12a98ad3ae0a50d329e0989812","unresolved":false,"context_lines":[{"line_number":4213,"context_line":"            req, FAKE_UUID, body\u003dbody)"},{"line_number":4214,"context_line":"        self.assertIn(\u0027user_data\u0027, str(ex))"},{"line_number":4215,"context_line":""},{"line_number":4216,"context_line":"    def test_update_server_user_data_with_config_drive_fails(self):"},{"line_number":4217,"context_line":"        # Mock an instance with config drive"},{"line_number":4218,"context_line":"        orig_get \u003d compute_api.API.get"},{"line_number":4219,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5bca73c0_8df2fde3","line":4216,"in_reply_to":"611748fc_83fd51b0","updated":"2022-08-09 08:04:02.000000000","message":"Done","commit_id":"41e5ccd21cf5a70c182e2c2ce2d1cd654875902b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"816bae293f718e12a98ad3ae0a50d329e0989812","unresolved":true,"context_lines":[{"line_number":4222,"context_line":"            instance.config_drive \u003d True"},{"line_number":4223,"context_line":"            return instance"},{"line_number":4224,"context_line":""},{"line_number":4225,"context_line":"        self.stub_out(\u0027nova.compute.api.API.get\u0027, wrap_get)"},{"line_number":4226,"context_line":""},{"line_number":4227,"context_line":"        body \u003d {\u0027server\u0027: {\u0027user_data\u0027: \u0027data\u0027}}"},{"line_number":4228,"context_line":"        req \u003d self._get_request(body)"}],"source_content_type":"text/x-python","patch_set":6,"id":"f90c468c_31d4f7a0","line":4225,"updated":"2022-08-09 08:04:02.000000000","message":"please configure self.mock_get.side_effect instead","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"290aba9d3eda0151d94b76c28219d0765cabf1c6","unresolved":false,"context_lines":[{"line_number":4222,"context_line":"            instance.config_drive \u003d True"},{"line_number":4223,"context_line":"            return instance"},{"line_number":4224,"context_line":""},{"line_number":4225,"context_line":"        self.stub_out(\u0027nova.compute.api.API.get\u0027, wrap_get)"},{"line_number":4226,"context_line":""},{"line_number":4227,"context_line":"        body \u003d {\u0027server\u0027: {\u0027user_data\u0027: \u0027data\u0027}}"},{"line_number":4228,"context_line":"        req \u003d self._get_request(body)"}],"source_content_type":"text/x-python","patch_set":6,"id":"2f275e40_fec7899e","line":4225,"in_reply_to":"f90c468c_31d4f7a0","updated":"2022-08-12 13:21:55.000000000","message":"Ack","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"}],"nova/virt/driver.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b99cc659e22c94a8d6a7153d6e0ec64a1b25cabc","unresolved":true,"context_lines":[{"line_number":1825,"context_line":""},{"line_number":1826,"context_line":"    def regenerate_configdrive(self, context, instance):"},{"line_number":1827,"context_line":"        \"\"\"Regenerate the instance\u0027s config drive.\"\"\""},{"line_number":1828,"context_line":"        raise NotImplementedError()"},{"line_number":1829,"context_line":""},{"line_number":1830,"context_line":""},{"line_number":1831,"context_line":"def load_compute_driver(virtapi, compute_driver\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"ec6129f9_4b055448","line":1828,"updated":"2022-09-01 15:12:04.000000000","message":"What about other drivers ?\nI\u0027m afraid this feature won\u0027t work silently if you don\u0027t support it for every driver.\n\nAlso, the spec wasn\u0027t not telling about this https://review.opendev.org/c/openstack/nova-specs/+/816542/7/","commit_id":"863e2e6ddfdd5f7ae2e8020b0d49ee121a1af3c4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a4131caf6e98aefcdca5fc486d0dcb3b058a8ae8","unresolved":true,"context_lines":[{"line_number":1825,"context_line":""},{"line_number":1826,"context_line":"    def regenerate_configdrive(self, context, instance):"},{"line_number":1827,"context_line":"        \"\"\"Regenerate the instance\u0027s config drive.\"\"\""},{"line_number":1828,"context_line":"        raise NotImplementedError()"},{"line_number":1829,"context_line":""},{"line_number":1830,"context_line":""},{"line_number":1831,"context_line":"def load_compute_driver(virtapi, compute_driver\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"8d12a6e3_8805520c","line":1828,"in_reply_to":"ec6129f9_4b055448","updated":"2022-09-01 15:14:45.000000000","message":"I guess this is a good reason to keep the traits-based check. I still don\u0027t like bringing in the requirement that placement be up and working for basic things like reboot to proceed, but that would at least give us the ability to refuse the reboot to the user if the virt driver does not support it. I guess as long as we only do the trait check when we need to for this feature, it\u0027s better than nothing.","commit_id":"863e2e6ddfdd5f7ae2e8020b0d49ee121a1af3c4"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"816bae293f718e12a98ad3ae0a50d329e0989812","unresolved":true,"context_lines":[{"line_number":3883,"context_line":"        re-creates the domain to ensure the reboot happens, as the guest"},{"line_number":3884,"context_line":"        OS cannot ignore this action."},{"line_number":3885,"context_line":"        \"\"\""},{"line_number":3886,"context_line":"        if instance.config_drive_dirty \u003d\u003d \"True\":"},{"line_number":3887,"context_line":"            LOG.info(\"Instance has dirty config drive, will regenerate.\")"},{"line_number":3888,"context_line":""},{"line_number":3889,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"97592f9c_7e5643fd","line":3886,"range":{"start_line":3886,"start_character":42,"end_line":3886,"end_character":48},"updated":"2022-08-09 08:04:02.000000000","message":"can we store bools in sysmeta instead? if not then please convert the string to boolean at the object layer.","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"290aba9d3eda0151d94b76c28219d0765cabf1c6","unresolved":true,"context_lines":[{"line_number":3883,"context_line":"        re-creates the domain to ensure the reboot happens, as the guest"},{"line_number":3884,"context_line":"        OS cannot ignore this action."},{"line_number":3885,"context_line":"        \"\"\""},{"line_number":3886,"context_line":"        if instance.config_drive_dirty \u003d\u003d \"True\":"},{"line_number":3887,"context_line":"            LOG.info(\"Instance has dirty config drive, will regenerate.\")"},{"line_number":3888,"context_line":""},{"line_number":3889,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"a4800d3c_d7bb40bd","line":3886,"range":{"start_line":3886,"start_character":42,"end_line":3886,"end_character":48},"in_reply_to":"97592f9c_7e5643fd","updated":"2022-08-12 13:21:55.000000000","message":"The property setter for config_drive_dirty already stores a bool, but self.system_metadata.get() seems to always return whatever was saved as a string.\nIt is now converted to bool at the object layer.","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f471df0c1f47824c078ee4ae85c59563b9bb848b","unresolved":false,"context_lines":[{"line_number":3883,"context_line":"        re-creates the domain to ensure the reboot happens, as the guest"},{"line_number":3884,"context_line":"        OS cannot ignore this action."},{"line_number":3885,"context_line":"        \"\"\""},{"line_number":3886,"context_line":"        if instance.config_drive_dirty \u003d\u003d \"True\":"},{"line_number":3887,"context_line":"            LOG.info(\"Instance has dirty config drive, will regenerate.\")"},{"line_number":3888,"context_line":""},{"line_number":3889,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"adeda352_a98d35d1","line":3886,"range":{"start_line":3886,"start_character":42,"end_line":3886,"end_character":48},"in_reply_to":"a4800d3c_d7bb40bd","updated":"2022-08-17 09:35:57.000000000","message":"Ack","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"816bae293f718e12a98ad3ae0a50d329e0989812","unresolved":true,"context_lines":[{"line_number":3887,"context_line":"            LOG.info(\"Instance has dirty config drive, will regenerate.\")"},{"line_number":3888,"context_line":""},{"line_number":3889,"context_line":"            try:"},{"line_number":3890,"context_line":"                self._create_configdrive(context, instance,"},{"line_number":3891,"context_line":"                             injection_info\u003dInjectionInfo(admin_pass\u003dNone,"},{"line_number":3892,"context_line":"                                                          network_info\u003dNone,"},{"line_number":3893,"context_line":"                                                          files\u003dNone),"},{"line_number":3894,"context_line":"                                         force_creation\u003dTrue)"},{"line_number":3895,"context_line":"                LOG.info(\"Config drive regeneration successful!\")"},{"line_number":3896,"context_line":"                instance.config_drive_dirty \u003d False"},{"line_number":3897,"context_line":"            except Exception:"}],"source_content_type":"text/x-python","patch_set":6,"id":"19ff7a63_d931bc00","line":3894,"range":{"start_line":3890,"start_character":1,"end_line":3894,"end_character":61},"updated":"2022-08-09 08:04:02.000000000","message":"you can indent it like:\n\n                self._create_configdrive(\n                    context, \n                    instance,\n                    injection_info\u003dInjectionInfo(\n                        admin_pass\u003dNone,\n                        network_info\u003dNone,\n                        files\u003dNone\n                    ),\n                    force_creation\u003dTrue\n                )","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"290aba9d3eda0151d94b76c28219d0765cabf1c6","unresolved":false,"context_lines":[{"line_number":3887,"context_line":"            LOG.info(\"Instance has dirty config drive, will regenerate.\")"},{"line_number":3888,"context_line":""},{"line_number":3889,"context_line":"            try:"},{"line_number":3890,"context_line":"                self._create_configdrive(context, instance,"},{"line_number":3891,"context_line":"                             injection_info\u003dInjectionInfo(admin_pass\u003dNone,"},{"line_number":3892,"context_line":"                                                          network_info\u003dNone,"},{"line_number":3893,"context_line":"                                                          files\u003dNone),"},{"line_number":3894,"context_line":"                                         force_creation\u003dTrue)"},{"line_number":3895,"context_line":"                LOG.info(\"Config drive regeneration successful!\")"},{"line_number":3896,"context_line":"                instance.config_drive_dirty \u003d False"},{"line_number":3897,"context_line":"            except Exception:"}],"source_content_type":"text/x-python","patch_set":6,"id":"e7f647f8_4cd5e85f","line":3894,"range":{"start_line":3890,"start_character":1,"end_line":3894,"end_character":61},"in_reply_to":"19ff7a63_d931bc00","updated":"2022-08-12 13:21:55.000000000","message":"Ack","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"816bae293f718e12a98ad3ae0a50d329e0989812","unresolved":true,"context_lines":[{"line_number":3892,"context_line":"                                                          network_info\u003dNone,"},{"line_number":3893,"context_line":"                                                          files\u003dNone),"},{"line_number":3894,"context_line":"                                         force_creation\u003dTrue)"},{"line_number":3895,"context_line":"                LOG.info(\"Config drive regeneration successful!\")"},{"line_number":3896,"context_line":"                instance.config_drive_dirty \u003d False"},{"line_number":3897,"context_line":"            except Exception:"},{"line_number":3898,"context_line":"                LOG.info(\"Config drive regeneration failed!\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"be6f791b_ed0bf7f5","line":3895,"updated":"2022-08-09 08:04:02.000000000","message":"we don\u0027t need to log this or not on info level","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"290aba9d3eda0151d94b76c28219d0765cabf1c6","unresolved":false,"context_lines":[{"line_number":3892,"context_line":"                                                          network_info\u003dNone,"},{"line_number":3893,"context_line":"                                                          files\u003dNone),"},{"line_number":3894,"context_line":"                                         force_creation\u003dTrue)"},{"line_number":3895,"context_line":"                LOG.info(\"Config drive regeneration successful!\")"},{"line_number":3896,"context_line":"                instance.config_drive_dirty \u003d False"},{"line_number":3897,"context_line":"            except Exception:"},{"line_number":3898,"context_line":"                LOG.info(\"Config drive regeneration failed!\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff88d776_4171d429","line":3895,"in_reply_to":"be6f791b_ed0bf7f5","updated":"2022-08-12 13:21:55.000000000","message":"Ack","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"816bae293f718e12a98ad3ae0a50d329e0989812","unresolved":true,"context_lines":[{"line_number":3895,"context_line":"                LOG.info(\"Config drive regeneration successful!\")"},{"line_number":3896,"context_line":"                instance.config_drive_dirty \u003d False"},{"line_number":3897,"context_line":"            except Exception:"},{"line_number":3898,"context_line":"                LOG.info(\"Config drive regeneration failed!\")"},{"line_number":3899,"context_line":""},{"line_number":3900,"context_line":"        # NOTE(sbauza): Since we undefine the guest XML when destroying, we"},{"line_number":3901,"context_line":"        # need to remember the existing mdevs for reusing them."}],"source_content_type":"text/x-python","patch_set":6,"id":"0002dc3b_911bc8a7","line":3898,"updated":"2022-08-09 08:04:02.000000000","message":"please use LOG.exception so the stacktrace is logged too","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"290aba9d3eda0151d94b76c28219d0765cabf1c6","unresolved":false,"context_lines":[{"line_number":3895,"context_line":"                LOG.info(\"Config drive regeneration successful!\")"},{"line_number":3896,"context_line":"                instance.config_drive_dirty \u003d False"},{"line_number":3897,"context_line":"            except Exception:"},{"line_number":3898,"context_line":"                LOG.info(\"Config drive regeneration failed!\")"},{"line_number":3899,"context_line":""},{"line_number":3900,"context_line":"        # NOTE(sbauza): Since we undefine the guest XML when destroying, we"},{"line_number":3901,"context_line":"        # need to remember the existing mdevs for reusing them."}],"source_content_type":"text/x-python","patch_set":6,"id":"24b1d7b1_f12628c8","line":3898,"in_reply_to":"0002dc3b_911bc8a7","updated":"2022-08-12 13:21:55.000000000","message":"Ack","commit_id":"a93b0ec18f76e7bc6f9a52340e269b567a8c1d7b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f471df0c1f47824c078ee4ae85c59563b9bb848b","unresolved":true,"context_lines":[{"line_number":3891,"context_line":"                    context,"},{"line_number":3892,"context_line":"                    instance,"},{"line_number":3893,"context_line":"                    injection_info\u003dInjectionInfo("},{"line_number":3894,"context_line":"                                        admin_pass\u003dNone,"},{"line_number":3895,"context_line":"                                        network_info\u003dNone,"},{"line_number":3896,"context_line":"                                        files\u003dNone"},{"line_number":3897,"context_line":"                    ),"}],"source_content_type":"text/x-python","patch_set":8,"id":"53dc6f97_38f5aac1","line":3894,"range":{"start_line":3894,"start_character":0,"end_line":3894,"end_character":40},"updated":"2022-08-17 09:35:57.000000000","message":"over indent, a single level of indent compared to inject_info is enough here","commit_id":"86b6394d9ee2e818d09fed7b2adcd5fa4ef7498d"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":3891,"context_line":"                    context,"},{"line_number":3892,"context_line":"                    instance,"},{"line_number":3893,"context_line":"                    injection_info\u003dInjectionInfo("},{"line_number":3894,"context_line":"                                        admin_pass\u003dNone,"},{"line_number":3895,"context_line":"                                        network_info\u003dNone,"},{"line_number":3896,"context_line":"                                        files\u003dNone"},{"line_number":3897,"context_line":"                    ),"}],"source_content_type":"text/x-python","patch_set":8,"id":"d810f469_42c2f527","line":3894,"range":{"start_line":3894,"start_character":0,"end_line":3894,"end_character":40},"in_reply_to":"53dc6f97_38f5aac1","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"86b6394d9ee2e818d09fed7b2adcd5fa4ef7498d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be32fc92b8df6f3f1780d4b0cbdef7772c1b217a","unresolved":true,"context_lines":[{"line_number":3884,"context_line":"        re-creates the domain to ensure the reboot happens, as the guest"},{"line_number":3885,"context_line":"        OS cannot ignore this action."},{"line_number":3886,"context_line":"        \"\"\""},{"line_number":3887,"context_line":"        if instance.config_drive_dirty:"},{"line_number":3888,"context_line":"            try:"},{"line_number":3889,"context_line":"                self.regenerate_configdrive(context, instance)"},{"line_number":3890,"context_line":"                instance.config_drive_dirty \u003d False"}],"source_content_type":"text/x-python","patch_set":15,"id":"3d76dcd0_73df5cdb","line":3887,"updated":"2022-08-31 06:56:51.000000000","message":"ok we cant do this here.\n\nthe vm is still running at this point so the config drive file is in use and that cuases the permission denied error.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1da3b83bccf0bcd93a003a2fbb22bb1c5d5f0622","unresolved":true,"context_lines":[{"line_number":3889,"context_line":"                self.regenerate_configdrive(context, instance)"},{"line_number":3890,"context_line":"                instance.config_drive_dirty \u003d False"},{"line_number":3891,"context_line":"            except Exception:"},{"line_number":3892,"context_line":"                LOG.exception(\"Config drive regeneration failed!\")"},{"line_number":3893,"context_line":""},{"line_number":3894,"context_line":"        # NOTE(sbauza): Since we undefine the guest XML when destroying, we"},{"line_number":3895,"context_line":"        # need to remember the existing mdevs for reusing them."}],"source_content_type":"text/x-python","patch_set":15,"id":"43ca53c6_25a67f92","line":3892,"updated":"2022-08-30 20:01:04.000000000","message":"Am I missing where the test coverage for this is?","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"137f2dca4d00ebb90c7ab8ff5900d66717664b2e","unresolved":true,"context_lines":[{"line_number":3889,"context_line":"                self.regenerate_configdrive(context, instance)"},{"line_number":3890,"context_line":"                instance.config_drive_dirty \u003d False"},{"line_number":3891,"context_line":"            except Exception:"},{"line_number":3892,"context_line":"                LOG.exception(\"Config drive regeneration failed!\")"},{"line_number":3893,"context_line":""},{"line_number":3894,"context_line":"        # NOTE(sbauza): Since we undefine the guest XML when destroying, we"},{"line_number":3895,"context_line":"        # need to remember the existing mdevs for reusing them."}],"source_content_type":"text/x-python","patch_set":15,"id":"ca4b0277_360f0387","line":3892,"in_reply_to":"43ca53c6_25a67f92","updated":"2022-08-31 10:00:59.000000000","message":"No, it\u0027s not there yet (like mentioned in previous comments).","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"be32fc92b8df6f3f1780d4b0cbdef7772c1b217a","unresolved":true,"context_lines":[{"line_number":3905,"context_line":"        self.destroy(context, instance, network_info, destroy_disks\u003dFalse,"},{"line_number":3906,"context_line":"                     block_device_info\u003dblock_device_info,"},{"line_number":3907,"context_line":"                     destroy_secrets\u003dFalse)"},{"line_number":3908,"context_line":""},{"line_number":3909,"context_line":"        # Convert the system metadata to image metadata"},{"line_number":3910,"context_line":"        # NOTE(mdbooth): This is a workaround for stateless Nova compute"},{"line_number":3911,"context_line":"        #                https://bugs.launchpad.net/nova/+bug/1349978"}],"source_content_type":"text/x-python","patch_set":15,"id":"15718964_a1946fff","line":3908,"updated":"2022-08-31 06:56:51.000000000","message":"so we need to regenerate the config drive here after calling destroy","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"fda2b5c4b39b49f3721e5b062dc5d43ec58a622b","unresolved":true,"context_lines":[{"line_number":4998,"context_line":"            context,"},{"line_number":4999,"context_line":"            instance,"},{"line_number":5000,"context_line":"            injection_info\u003dInjectionInfo("},{"line_number":5001,"context_line":"                admin_pass\u003dNone,"},{"line_number":5002,"context_line":"                network_info\u003dNone,"},{"line_number":5003,"context_line":"                files\u003dNone"},{"line_number":5004,"context_line":"            ),"}],"source_content_type":"text/x-python","patch_set":15,"id":"24ecd347_071502da","line":5001,"range":{"start_line":5001,"start_character":27,"end_line":5001,"end_character":31},"updated":"2022-08-30 23:21:30.000000000","message":"Can anyone confirm if the admin password is retained after creating the drive with these params? I tried unsuccessfully to figure this out by code inspection.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f40082dfdfdbf76b26b9ef24cb463bcd87ffcf25","unresolved":true,"context_lines":[{"line_number":4998,"context_line":"            context,"},{"line_number":4999,"context_line":"            instance,"},{"line_number":5000,"context_line":"            injection_info\u003dInjectionInfo("},{"line_number":5001,"context_line":"                admin_pass\u003dNone,"},{"line_number":5002,"context_line":"                network_info\u003dNone,"},{"line_number":5003,"context_line":"                files\u003dNone"},{"line_number":5004,"context_line":"            ),"}],"source_content_type":"text/x-python","patch_set":15,"id":"777d722f_846b9a92","line":5001,"range":{"start_line":5001,"start_character":27,"end_line":5001,"end_character":31},"in_reply_to":"24ecd347_071502da","updated":"2022-08-31 07:49:07.000000000","message":"im going to push a followup to fix this whch can then be squashed if we want\nbut im not locally calling this as the post xml callback in spawn and passing the injection_info so the admin passward should now be preserved.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5ebb64ef9fdc4c0ae8e2e9745da360fdd663d53c","unresolved":true,"context_lines":[{"line_number":4998,"context_line":"            context,"},{"line_number":4999,"context_line":"            instance,"},{"line_number":5000,"context_line":"            injection_info\u003dInjectionInfo("},{"line_number":5001,"context_line":"                admin_pass\u003dNone,"},{"line_number":5002,"context_line":"                network_info\u003dNone,"},{"line_number":5003,"context_line":"                files\u003dNone"},{"line_number":5004,"context_line":"            ),"}],"source_content_type":"text/x-python","patch_set":15,"id":"5484443a_66f495f6","line":5001,"range":{"start_line":5001,"start_character":27,"end_line":5001,"end_character":31},"in_reply_to":"777d722f_846b9a92","updated":"2022-08-31 08:24:09.000000000","message":"actully i cand do this via spawn but we do need to use the post xml hook\n\nthe admin password is not actully stored in teh config drive its injected into the /etc/shadow and /etc/passwd files i think\n\nhttps://github.com/openstack/nova/blob/606d588e3eca1d88ad26b4c2cfa3f2e1d5ed553e/nova/virt/disk/api.py#L571-L599\n\nso that will survie hard reboot\ni can pass the network info since we have that so i will.\nwe do not support file injetion anymore so that can be None.","commit_id":"4e07ca137b2518d0cdba9839f2466b295e9989ea"}],"releasenotes/notes/add-support-for-updating-user-data-dd685e577d03574f.yaml":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Add support for updating user_data via ``/servers/{server_id}`` API, or"},{"line_number":5,"context_line":"    ``/servers/{server_id}/action`` API if a config drive is used"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"9a2b4efc_04555ccd","line":4,"range":{"start_line":4,"start_character":45,"end_line":4,"end_character":65},"updated":"2022-08-16 01:08:18.000000000","message":"PUT /servers/{server_id}","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Add support for updating user_data via ``/servers/{server_id}`` API, or"},{"line_number":5,"context_line":"    ``/servers/{server_id}/action`` API if a config drive is used"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"0af56fed_53ceebe3","line":4,"range":{"start_line":4,"start_character":45,"end_line":4,"end_character":65},"in_reply_to":"9a2b4efc_04555ccd","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Add support for updating user_data via ``/servers/{server_id}`` API, or"},{"line_number":5,"context_line":"    ``/servers/{server_id}/action`` API if a config drive is used"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"c52ed1f5_a31fdbf6","line":5,"range":{"start_line":5,"start_character":45,"end_line":5,"end_character":65},"updated":"2022-08-16 01:08:18.000000000","message":"Current code is updating user_data for hard reboot for both config drives and non config drives, so this is omitting a bit. (This is why personally I think it might be better to make the two mutually exclusive and reject non config drives here because the \"one API for config drive, two APIs for non config drives\" seems a little confusing IMHO).","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Add support for updating user_data via ``/servers/{server_id}`` API, or"},{"line_number":5,"context_line":"    ``/servers/{server_id}/action`` API if a config drive is used"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"ac0e4591_38817a68","line":5,"range":{"start_line":5,"start_character":6,"end_line":5,"end_character":33},"updated":"2022-08-16 01:08:18.000000000","message":"Might be worth adding POST for consistency even though all server actions are POSTs.","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b49860adf72d441fedf71877b2fda853fe7381dc","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Add support for updating user_data via ``/servers/{server_id}`` API, or"},{"line_number":5,"context_line":"    ``/servers/{server_id}/action`` API if a config drive is used"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"d8b854a5_c08e4c5d","line":5,"range":{"start_line":5,"start_character":36,"end_line":5,"end_character":39},"updated":"2022-08-16 01:08:18.000000000","message":"reboot API or hard reboot API","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Add support for updating user_data via ``/servers/{server_id}`` API, or"},{"line_number":5,"context_line":"    ``/servers/{server_id}/action`` API if a config drive is used"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"bc31f467_58c865ee","line":5,"range":{"start_line":5,"start_character":6,"end_line":5,"end_character":33},"in_reply_to":"ac0e4591_38817a68","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Add support for updating user_data via ``/servers/{server_id}`` API, or"},{"line_number":5,"context_line":"    ``/servers/{server_id}/action`` API if a config drive is used"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"05d8ee1e_8e91882d","line":5,"range":{"start_line":5,"start_character":45,"end_line":5,"end_character":65},"in_reply_to":"c52ed1f5_a31fdbf6","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"},{"author":{"_account_id":33634,"name":"Jan Hartkopf","email":"j@hartkopf.io","username":"jhartkopf"},"change_message_id":"70c3e0636219d4bb4c634b64cabdb94e8f946b98","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Add support for updating user_data via ``/servers/{server_id}`` API, or"},{"line_number":5,"context_line":"    ``/servers/{server_id}/action`` API if a config drive is used"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"7d314b09_9c87d300","line":5,"range":{"start_line":5,"start_character":36,"end_line":5,"end_character":39},"in_reply_to":"d8b854a5_c08e4c5d","updated":"2022-08-22 08:10:22.000000000","message":"Ack","commit_id":"9eb30ed38c281c5cd99ff2a037b0fe1bf976bfbb"}]}
