)]}'
{"doc/source/install/configure-pxe.rst":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"d5b4094a6f13f91ad33749bfb6e2dd8e94de723d","unresolved":true,"context_lines":[{"line_number":540,"context_line":"-------------"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"Ironic features the capability to load PXE artifacts into the conductor"},{"line_number":543,"context_line":"startup, minmizing the need for external installation and configuration"},{"line_number":544,"context_line":"management tooling from having to do additional work to facilitate."},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"While this is an advanced feature, and destination file names must match"}],"source_content_type":"text/x-rst","patch_set":6,"id":"6870292c_115931ca","line":543,"range":{"start_line":543,"start_character":9,"end_line":543,"end_character":18},"updated":"2021-09-15 02:58:24.000000000","message":"minimizing","commit_id":"de2fd6aa3d593c6eeeaf33b43d891d65e3b41c96"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"5646e30f1f1a747ab33b333aae4b3f484abf2cc4","unresolved":true,"context_lines":[{"line_number":552,"context_line":".. code-block:: ini"},{"line_number":553,"context_line":""},{"line_number":554,"context_line":"   [pxe]"},{"line_number":555,"context_line":"   loader_file_paths \u003d ipxe.efi:/usr/share/ipxe/ipxe-snponly-x86_64.efi,undionly.kpxe:/usr/share/ipxe/undionly.kpxe,bootx64.efi,/boot/efi/EFI/boot/grubx64.efi,bootx64.efi:/boot/efi/EFI/boot/BOOTX64.EFI"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"If you choose to use relative paths as part of your destination,"},{"line_number":558,"context_line":"those paths will be created using configuration parameter"}],"source_content_type":"text/x-rst","patch_set":7,"id":"29426e1e_7f032e64","line":555,"updated":"2021-09-15 21:48:03.000000000","message":"I wonder if we can present this with some newlines","commit_id":"33173320dc61e4884c84257c7042c74ba8e5b33c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"8ac5ff8a3f7668f929e9ac5b180e118f7e2b2ca9","unresolved":true,"context_lines":[{"line_number":552,"context_line":".. code-block:: ini"},{"line_number":553,"context_line":""},{"line_number":554,"context_line":"   [pxe]"},{"line_number":555,"context_line":"   loader_file_paths \u003d ipxe.efi:/usr/share/ipxe/ipxe-snponly-x86_64.efi,undionly.kpxe:/usr/share/ipxe/undionly.kpxe,bootx64.efi,/boot/efi/EFI/boot/grubx64.efi,bootx64.efi:/boot/efi/EFI/boot/BOOTX64.EFI"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"If you choose to use relative paths as part of your destination,"},{"line_number":558,"context_line":"those paths will be created using configuration parameter"}],"source_content_type":"text/x-rst","patch_set":7,"id":"0a846d27_08462c39","line":555,"in_reply_to":"29426e1e_7f032e64","updated":"2021-09-15 23:23:06.000000000","message":"I don\u0027t think there is a way to wrap it.","commit_id":"33173320dc61e4884c84257c7042c74ba8e5b33c"}],"ironic/common/pxe_utils.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2e2ebbce02396067b344edb267f4cffe20cad07e","unresolved":false,"context_lines":[{"line_number":1279,"context_line":""},{"line_number":1280,"context_line":"    try:"},{"line_number":1281,"context_line":"        for dest in loaders.keys():"},{"line_number":1282,"context_line":"            src \u003d loaders[dest]"},{"line_number":1283,"context_line":"            full_dest \u003d os.path.join(base_path, dest)"},{"line_number":1284,"context_line":"            if not os.path.isfile(src):"},{"line_number":1285,"context_line":"                LOG.warning(\u0027Was not able to find source path %(src)s \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"f8dc2ee3_c5ef7dab","line":1282,"updated":"2021-09-10 07:54:37.000000000","message":"nit:\n\n for src, dest in loaders.items():","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"69364d67b87d8479b93cf85d2d1cca5773f25508","unresolved":false,"context_lines":[{"line_number":1279,"context_line":""},{"line_number":1280,"context_line":"    try:"},{"line_number":1281,"context_line":"        for dest in loaders.keys():"},{"line_number":1282,"context_line":"            src \u003d loaders[dest]"},{"line_number":1283,"context_line":"            full_dest \u003d os.path.join(base_path, dest)"},{"line_number":1284,"context_line":"            if not os.path.isfile(src):"},{"line_number":1285,"context_line":"                LOG.warning(\u0027Was not able to find source path %(src)s \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"752f6897_089b7640","line":1282,"in_reply_to":"f8dc2ee3_c5ef7dab","updated":"2021-09-13 14:39:23.000000000","message":"Done.","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2e2ebbce02396067b344edb267f4cffe20cad07e","unresolved":false,"context_lines":[{"line_number":1282,"context_line":"            src \u003d loaders[dest]"},{"line_number":1283,"context_line":"            full_dest \u003d os.path.join(base_path, dest)"},{"line_number":1284,"context_line":"            if not os.path.isfile(src):"},{"line_number":1285,"context_line":"                LOG.warning(\u0027Was not able to find source path %(src)s \u0027"},{"line_number":1286,"context_line":"                            \u0027to copy to %(dest)s\u0027,"},{"line_number":1287,"context_line":"                            {\u0027src\u0027: src, \u0027dest\u0027: full_dest})"},{"line_number":1288,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":4,"id":"c615f576_cd8773d4","line":1285,"updated":"2021-09-10 07:54:37.000000000","message":"We tend to blow up on invalid configuration, this may be tricky to debug otherwise","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"69364d67b87d8479b93cf85d2d1cca5773f25508","unresolved":false,"context_lines":[{"line_number":1282,"context_line":"            src \u003d loaders[dest]"},{"line_number":1283,"context_line":"            full_dest \u003d os.path.join(base_path, dest)"},{"line_number":1284,"context_line":"            if not os.path.isfile(src):"},{"line_number":1285,"context_line":"                LOG.warning(\u0027Was not able to find source path %(src)s \u0027"},{"line_number":1286,"context_line":"                            \u0027to copy to %(dest)s\u0027,"},{"line_number":1287,"context_line":"                            {\u0027src\u0027: src, \u0027dest\u0027: full_dest})"},{"line_number":1288,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":4,"id":"bcba4f18_94d89134","line":1285,"in_reply_to":"c615f576_cd8773d4","updated":"2021-09-13 14:39:23.000000000","message":"I guess we *could*... I mean if configured. It *could* make a lot of sense to just bomb out. i.e. if vendor ships default of grub and ipxe, then it would be misconfigured, and we would blow up... if not installed.  Hmm!","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2e2ebbce02396067b344edb267f4cffe20cad07e","unresolved":false,"context_lines":[{"line_number":1287,"context_line":"                            {\u0027src\u0027: src, \u0027dest\u0027: full_dest})"},{"line_number":1288,"context_line":"                continue"},{"line_number":1289,"context_line":"            if os.path.isfile(full_dest):"},{"line_number":1290,"context_line":"                LOG.info(\u0027Overwriting %(dest)s from the base configured path \u0027"},{"line_number":1291,"context_line":"                         \u0027%(src)s\u0027, {\u0027src\u0027: src, \u0027dest\u0027: full_dest})"},{"line_number":1292,"context_line":"            else:"},{"line_number":1293,"context_line":"                LOG.debug(\u0027Copying bootloader %(dest)s from %(src)s.\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9e0e8ea5_ba44852b","line":1290,"updated":"2021-09-10 07:54:37.000000000","message":"This is going to be logged every restart after the 1st clean start. Do we really need it?","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"69364d67b87d8479b93cf85d2d1cca5773f25508","unresolved":false,"context_lines":[{"line_number":1287,"context_line":"                            {\u0027src\u0027: src, \u0027dest\u0027: full_dest})"},{"line_number":1288,"context_line":"                continue"},{"line_number":1289,"context_line":"            if os.path.isfile(full_dest):"},{"line_number":1290,"context_line":"                LOG.info(\u0027Overwriting %(dest)s from the base configured path \u0027"},{"line_number":1291,"context_line":"                         \u0027%(src)s\u0027, {\u0027src\u0027: src, \u0027dest\u0027: full_dest})"},{"line_number":1292,"context_line":"            else:"},{"line_number":1293,"context_line":"                LOG.debug(\u0027Copying bootloader %(dest)s from %(src)s.\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"50ab0c97_a2a70628","line":1290,"in_reply_to":"9e0e8ea5_ba44852b","updated":"2021-09-13 14:39:23.000000000","message":"Guess i just becomes noise.","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2e2ebbce02396067b344edb267f4cffe20cad07e","unresolved":false,"context_lines":[{"line_number":1297,"context_line":"                if CONF.pxe.dir_permission:"},{"line_number":1298,"context_line":"                    os.chmod(full_dest, CONF.pxe.dir_permission)"},{"line_number":1299,"context_line":"            except OSError as e:"},{"line_number":1300,"context_line":"                LOG.warning(\u0027Error encoutnered while attempting to \u0027"},{"line_number":1301,"context_line":"                            \u0027copy a configured bootloader into \u0027"},{"line_number":1302,"context_line":"                            \u0027the requested destination. Error %s\u0027, e)"},{"line_number":1303,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":4,"id":"d46c6569_a80f9222","line":1300,"updated":"2021-09-10 07:54:37.000000000","message":"\"encountered\"","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2e2ebbce02396067b344edb267f4cffe20cad07e","unresolved":false,"context_lines":[{"line_number":1299,"context_line":"            except OSError as e:"},{"line_number":1300,"context_line":"                LOG.warning(\u0027Error encoutnered while attempting to \u0027"},{"line_number":1301,"context_line":"                            \u0027copy a configured bootloader into \u0027"},{"line_number":1302,"context_line":"                            \u0027the requested destination. Error %s\u0027, e)"},{"line_number":1303,"context_line":"                continue"},{"line_number":1304,"context_line":"    except KeyError as e:"},{"line_number":1305,"context_line":"        LOG.warning(\u0027Error encountered while attempting to store bootloader \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f87d25e_da4356c7","line":1302,"updated":"2021-09-10 07:54:37.000000000","message":"nit: s/Error //","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"69364d67b87d8479b93cf85d2d1cca5773f25508","unresolved":false,"context_lines":[{"line_number":1299,"context_line":"            except OSError as e:"},{"line_number":1300,"context_line":"                LOG.warning(\u0027Error encoutnered while attempting to \u0027"},{"line_number":1301,"context_line":"                            \u0027copy a configured bootloader into \u0027"},{"line_number":1302,"context_line":"                            \u0027the requested destination. Error %s\u0027, e)"},{"line_number":1303,"context_line":"                continue"},{"line_number":1304,"context_line":"    except KeyError as e:"},{"line_number":1305,"context_line":"        LOG.warning(\u0027Error encountered while attempting to store bootloader \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"6525742b_e4b75bc9","line":1302,"in_reply_to":"9f87d25e_da4356c7","updated":"2021-09-13 14:39:23.000000000","message":"Done.","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2e2ebbce02396067b344edb267f4cffe20cad07e","unresolved":false,"context_lines":[{"line_number":1300,"context_line":"                LOG.warning(\u0027Error encoutnered while attempting to \u0027"},{"line_number":1301,"context_line":"                            \u0027copy a configured bootloader into \u0027"},{"line_number":1302,"context_line":"                            \u0027the requested destination. Error %s\u0027, e)"},{"line_number":1303,"context_line":"                continue"},{"line_number":1304,"context_line":"    except KeyError as e:"},{"line_number":1305,"context_line":"        LOG.warning(\u0027Error encountered while attempting to store bootloader \u0027"},{"line_number":1306,"context_line":"                    \u0027for deployment. Error %s\u0027, e)"}],"source_content_type":"text/x-python","patch_set":4,"id":"871f2ded_98398996","line":1303,"updated":"2021-09-10 07:54:37.000000000","message":"nit: unneeded","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"69364d67b87d8479b93cf85d2d1cca5773f25508","unresolved":false,"context_lines":[{"line_number":1300,"context_line":"                LOG.warning(\u0027Error encoutnered while attempting to \u0027"},{"line_number":1301,"context_line":"                            \u0027copy a configured bootloader into \u0027"},{"line_number":1302,"context_line":"                            \u0027the requested destination. Error %s\u0027, e)"},{"line_number":1303,"context_line":"                continue"},{"line_number":1304,"context_line":"    except KeyError as e:"},{"line_number":1305,"context_line":"        LOG.warning(\u0027Error encountered while attempting to store bootloader \u0027"},{"line_number":1306,"context_line":"                    \u0027for deployment. Error %s\u0027, e)"}],"source_content_type":"text/x-python","patch_set":4,"id":"37fe92cc_0f6959d6","line":1303,"in_reply_to":"871f2ded_98398996","updated":"2021-09-13 14:39:23.000000000","message":"Done.","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2e2ebbce02396067b344edb267f4cffe20cad07e","unresolved":false,"context_lines":[{"line_number":1303,"context_line":"                continue"},{"line_number":1304,"context_line":"    except KeyError as e:"},{"line_number":1305,"context_line":"        LOG.warning(\u0027Error encountered while attempting to store bootloader \u0027"},{"line_number":1306,"context_line":"                    \u0027for deployment. Error %s\u0027, e)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9b8bc744_63cf6323","line":1306,"updated":"2021-09-10 07:54:37.000000000","message":"The message of KeyError is the missing key. I\u0027m not even sure what you\u0027re catching here and why?","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"423ff6b2c9440e8dfe96bd99d06ff7757acceb66","unresolved":false,"context_lines":[{"line_number":1303,"context_line":"                continue"},{"line_number":1304,"context_line":"    except KeyError as e:"},{"line_number":1305,"context_line":"        LOG.warning(\u0027Error encountered while attempting to store bootloader \u0027"},{"line_number":1306,"context_line":"                    \u0027for deployment. Error %s\u0027, e)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bb4a0ecc_7790eea8","line":1306,"in_reply_to":"9b8bc744_63cf6323","updated":"2021-09-10 19:37:23.000000000","message":"ahh, yeah, that was my initial two passes when steve and I were still talking through doing this.","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"d5b4094a6f13f91ad33749bfb6e2dd8e94de723d","unresolved":true,"context_lines":[{"line_number":1287,"context_line":"            raise exception.IncorrectConfiguration(error\u003dmsg)"},{"line_number":1288,"context_line":""},{"line_number":1289,"context_line":"        LOG.debug(\u0027Copying bootloader %(dest)s from %(src)s.\u0027,"},{"line_number":1290,"context_line":"                  {\u0027src\u0027: src, \u0027dest\u0027: full_dest})"},{"line_number":1291,"context_line":"        try:"},{"line_number":1292,"context_line":"            shutil.copy2(src, full_dest)"},{"line_number":1293,"context_line":"            if CONF.pxe.dir_permission:"}],"source_content_type":"text/x-python","patch_set":6,"id":"378ddf87_f1665c18","line":1290,"updated":"2021-09-15 02:58:24.000000000","message":"There might be dest paths which are a subdirectory of the root (like /tftproot/grub/grub.cfg), so there will need to be an ensure_tree and a chmod here (this could be a future thing)","commit_id":"de2fd6aa3d593c6eeeaf33b43d891d65e3b41c96"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"8ac5ff8a3f7668f929e9ac5b180e118f7e2b2ca9","unresolved":true,"context_lines":[{"line_number":1287,"context_line":"            raise exception.IncorrectConfiguration(error\u003dmsg)"},{"line_number":1288,"context_line":""},{"line_number":1289,"context_line":"        LOG.debug(\u0027Copying bootloader %(dest)s from %(src)s.\u0027,"},{"line_number":1290,"context_line":"                  {\u0027src\u0027: src, \u0027dest\u0027: full_dest})"},{"line_number":1291,"context_line":"        try:"},{"line_number":1292,"context_line":"            shutil.copy2(src, full_dest)"},{"line_number":1293,"context_line":"            if CONF.pxe.dir_permission:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3c52a0e3_77e49259","line":1290,"in_reply_to":"08ab6c3c_cb0c7799","updated":"2021-09-15 23:23:06.000000000","message":"So... what *is* the appropriate beverage to enjoy with Grub?","commit_id":"de2fd6aa3d593c6eeeaf33b43d891d65e3b41c96"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"be18f80b21939aff00649f5424a04f950c959c13","unresolved":true,"context_lines":[{"line_number":1287,"context_line":"            raise exception.IncorrectConfiguration(error\u003dmsg)"},{"line_number":1288,"context_line":""},{"line_number":1289,"context_line":"        LOG.debug(\u0027Copying bootloader %(dest)s from %(src)s.\u0027,"},{"line_number":1290,"context_line":"                  {\u0027src\u0027: src, \u0027dest\u0027: full_dest})"},{"line_number":1291,"context_line":"        try:"},{"line_number":1292,"context_line":"            shutil.copy2(src, full_dest)"},{"line_number":1293,"context_line":"            if CONF.pxe.dir_permission:"}],"source_content_type":"text/x-python","patch_set":6,"id":"86af775e_4a51214b","line":1290,"in_reply_to":"378ddf87_f1665c18","updated":"2021-09-15 14:30:31.000000000","message":"Hmm, good point. Although, grub should read off the root of wherever the files are placed if memory serves.","commit_id":"de2fd6aa3d593c6eeeaf33b43d891d65e3b41c96"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"77d818dc7ef5d2cb21a9bc6ebe8fbd8d7c155d8a","unresolved":true,"context_lines":[{"line_number":1287,"context_line":"            raise exception.IncorrectConfiguration(error\u003dmsg)"},{"line_number":1288,"context_line":""},{"line_number":1289,"context_line":"        LOG.debug(\u0027Copying bootloader %(dest)s from %(src)s.\u0027,"},{"line_number":1290,"context_line":"                  {\u0027src\u0027: src, \u0027dest\u0027: full_dest})"},{"line_number":1291,"context_line":"        try:"},{"line_number":1292,"context_line":"            shutil.copy2(src, full_dest)"},{"line_number":1293,"context_line":"            if CONF.pxe.dir_permission:"}],"source_content_type":"text/x-python","patch_set":6,"id":"08ab6c3c_cb0c7799","line":1290,"in_reply_to":"86af775e_4a51214b","updated":"2021-09-15 21:14:36.000000000","message":"ubuntu grub only fetches /grub/grub.cfg and ultimately I\u0027d like to use this mechanism to write it from $pybasedir/drivers/modules, but we can tackle writing files packaged with ironic later.","commit_id":"de2fd6aa3d593c6eeeaf33b43d891d65e3b41c96"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"d5b4094a6f13f91ad33749bfb6e2dd8e94de723d","unresolved":true,"context_lines":[{"line_number":1291,"context_line":"        try:"},{"line_number":1292,"context_line":"            shutil.copy2(src, full_dest)"},{"line_number":1293,"context_line":"            if CONF.pxe.dir_permission:"},{"line_number":1294,"context_line":"                os.chmod(full_dest, CONF.pxe.dir_permission)"},{"line_number":1295,"context_line":"        except OSError as e:"},{"line_number":1296,"context_line":"            msg \u003d (\u0027Error encountered while attempting to \u0027"},{"line_number":1297,"context_line":"                   \u0027copy a configured bootloader into \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"b62f51ec_febba3cb","line":1294,"updated":"2021-09-15 02:58:24.000000000","message":"We probably shouldn\u0027t chmod a file with a permission intended for directories. I\u0027m currently looking at an unrelated permissions issue [1] and I think there is a good case for adding a [pxe]file_permission option which defaults to 0o644 (like here[2]) and use that to chmod every file we\u0027re writing to tftp and http root.\n\n[1] https://zuul.opendev.org/t/openstack/build/269cc992ef054c298ad392ea56e02552/log/logs/dnsmasq.log#82\n[2] https://opendev.org/openstack/ironic/src/branch/master/ironic/conf/redfish.py#L75","commit_id":"de2fd6aa3d593c6eeeaf33b43d891d65e3b41c96"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"be18f80b21939aff00649f5424a04f950c959c13","unresolved":true,"context_lines":[{"line_number":1291,"context_line":"        try:"},{"line_number":1292,"context_line":"            shutil.copy2(src, full_dest)"},{"line_number":1293,"context_line":"            if CONF.pxe.dir_permission:"},{"line_number":1294,"context_line":"                os.chmod(full_dest, CONF.pxe.dir_permission)"},{"line_number":1295,"context_line":"        except OSError as e:"},{"line_number":1296,"context_line":"            msg \u003d (\u0027Error encountered while attempting to \u0027"},{"line_number":1297,"context_line":"                   \u0027copy a configured bootloader into \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"d1f09e38_6b332508","line":1294,"in_reply_to":"b62f51ec_febba3cb","updated":"2021-09-15 14:30:31.000000000","message":"ugh, I need to change that since octal !\u003d hex.\n\nAlso, yes from a standpoint of not having as executable since the folder needs to be executable for bash commands like ls to work, where as the file doesn\u0027t care nor matter with an absolute path.","commit_id":"de2fd6aa3d593c6eeeaf33b43d891d65e3b41c96"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"20fec23ba351f0f79b64cab1479fa0e2dc9af6cf","unresolved":true,"context_lines":[{"line_number":1291,"context_line":"        try:"},{"line_number":1292,"context_line":"            shutil.copy2(src, full_dest)"},{"line_number":1293,"context_line":"            if CONF.pxe.dir_permission:"},{"line_number":1294,"context_line":"                os.chmod(full_dest, CONF.pxe.dir_permission)"},{"line_number":1295,"context_line":"        except OSError as e:"},{"line_number":1296,"context_line":"            msg \u003d (\u0027Error encountered while attempting to \u0027"},{"line_number":1297,"context_line":"                   \u0027copy a configured bootloader into \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"5acaf8a7_b4fcaa66","line":1294,"in_reply_to":"d1f09e38_6b332508","updated":"2021-09-15 21:02:05.000000000","message":"Okay, I think I must have or someone did. I noticed a reference was wrong recently.","commit_id":"de2fd6aa3d593c6eeeaf33b43d891d65e3b41c96"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"5646e30f1f1a747ab33b333aae4b3f484abf2cc4","unresolved":true,"context_lines":[{"line_number":1280,"context_line":"    for dest, src in loaders.items():"},{"line_number":1281,"context_line":"        (head, _tail) \u003d os.path.split(dest)"},{"line_number":1282,"context_line":"        if head:"},{"line_number":1283,"context_line":"            if head.startswith(\u0027/\u0027):"},{"line_number":1284,"context_line":"                msg \u003d (\u0027File paths configured for [pxe]loader_file_paths \u0027"},{"line_number":1285,"context_line":"                       \u0027must be relative paths. Entry: %s\u0027) % dest"},{"line_number":1286,"context_line":"                raise exception.IncorrectConfiguration(msg)"}],"source_content_type":"text/x-python","patch_set":7,"id":"0f996759_296648e4","line":1283,"updated":"2021-09-15 21:48:03.000000000","message":"Should we also check for ../? It would safest to just resolve the full absolute path and validate that it is inside base_path","commit_id":"33173320dc61e4884c84257c7042c74ba8e5b33c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"8ac5ff8a3f7668f929e9ac5b180e118f7e2b2ca9","unresolved":true,"context_lines":[{"line_number":1280,"context_line":"    for dest, src in loaders.items():"},{"line_number":1281,"context_line":"        (head, _tail) \u003d os.path.split(dest)"},{"line_number":1282,"context_line":"        if head:"},{"line_number":1283,"context_line":"            if head.startswith(\u0027/\u0027):"},{"line_number":1284,"context_line":"                msg \u003d (\u0027File paths configured for [pxe]loader_file_paths \u0027"},{"line_number":1285,"context_line":"                       \u0027must be relative paths. Entry: %s\u0027) % dest"},{"line_number":1286,"context_line":"                raise exception.IncorrectConfiguration(msg)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fce960d6_3ae08a1f","line":1283,"in_reply_to":"0f996759_296648e4","updated":"2021-09-15 23:23:06.000000000","message":"Hmm... The motivator or driver was to keep it as relative as possible as targets can be /tftpboot and /httpboot, or other configured folders. I don\u0027t think relative path usage really breaks that... although I\u0027d want to channel my inner monty taylor and summon the wet cats should someone ever file a bug report over it.","commit_id":"33173320dc61e4884c84257c7042c74ba8e5b33c"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"5646e30f1f1a747ab33b333aae4b3f484abf2cc4","unresolved":true,"context_lines":[{"line_number":1288,"context_line":"                try:"},{"line_number":1289,"context_line":"                    os.makedirs("},{"line_number":1290,"context_line":"                        os.path.join(base_path, head),"},{"line_number":1291,"context_line":"                        mode\u003dCONF.pxe.dir_permission, exist_ok\u003dTrue)"},{"line_number":1292,"context_line":"                except OSError as e:"},{"line_number":1293,"context_line":"                    msg \u003d (\u0027Failed to create supplied directories in \u0027"},{"line_number":1294,"context_line":"                           \u0027asset copy paths. Error: %s\u0027) % e"}],"source_content_type":"text/x-python","patch_set":7,"id":"6298b516_b3d9e314","line":1291,"range":{"start_line":1291,"start_character":34,"end_line":1291,"end_character":52},"updated":"2021-09-15 21:48:03.000000000","message":"dir_permission is None by default, and makedirs requires mode to be an integer. Maybe \u0027mode\u003dCONF.pxe.dir_permission or 0o755\u0027. \n\nDoing this would be nicer than the fileutils.ensure_tree then chmod pattern that is done elsewhere. Maybe we need our own ensure_tree function which conveniently handles the mode being None.","commit_id":"33173320dc61e4884c84257c7042c74ba8e5b33c"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"84e3468997f3c00c9961a28796d784c463d7a473","unresolved":true,"context_lines":[{"line_number":1288,"context_line":"                try:"},{"line_number":1289,"context_line":"                    os.makedirs("},{"line_number":1290,"context_line":"                        os.path.join(base_path, head),"},{"line_number":1291,"context_line":"                        mode\u003dCONF.pxe.dir_permission, exist_ok\u003dTrue)"},{"line_number":1292,"context_line":"                except OSError as e:"},{"line_number":1293,"context_line":"                    msg \u003d (\u0027Failed to create supplied directories in \u0027"},{"line_number":1294,"context_line":"                           \u0027asset copy paths. Error: %s\u0027) % e"}],"source_content_type":"text/x-python","patch_set":7,"id":"84ead590_abcc889c","line":1291,"range":{"start_line":1291,"start_character":34,"end_line":1291,"end_character":52},"in_reply_to":"6298b516_b3d9e314","updated":"2021-09-15 23:06:08.000000000","message":"I implemented a local ensure_tree https://review.opendev.org/c/openstack/ironic/+/809294","commit_id":"33173320dc61e4884c84257c7042c74ba8e5b33c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"8ac5ff8a3f7668f929e9ac5b180e118f7e2b2ca9","unresolved":true,"context_lines":[{"line_number":1288,"context_line":"                try:"},{"line_number":1289,"context_line":"                    os.makedirs("},{"line_number":1290,"context_line":"                        os.path.join(base_path, head),"},{"line_number":1291,"context_line":"                        mode\u003dCONF.pxe.dir_permission, exist_ok\u003dTrue)"},{"line_number":1292,"context_line":"                except OSError as e:"},{"line_number":1293,"context_line":"                    msg \u003d (\u0027Failed to create supplied directories in \u0027"},{"line_number":1294,"context_line":"                           \u0027asset copy paths. Error: %s\u0027) % e"}],"source_content_type":"text/x-python","patch_set":7,"id":"765df81b_4be88c76","line":1291,"range":{"start_line":1291,"start_character":34,"end_line":1291,"end_character":52},"in_reply_to":"6298b516_b3d9e314","updated":"2021-09-15 23:23:06.000000000","message":"I think 0o755 is reasonable, and it keeps things relatively simple.","commit_id":"33173320dc61e4884c84257c7042c74ba8e5b33c"}],"ironic/conductor/base_manager.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2e2ebbce02396067b344edb267f4cffe20cad07e","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        self.dbapi.clear_node_target_power_state(self.host)"},{"line_number":112,"context_line":"        # clear all locks held by this conductor before registering"},{"line_number":113,"context_line":"        self.dbapi.clear_node_reservations_for_conductor(self.host)"},{"line_number":114,"context_line":"        pxe_utils.place_loaders_for_boot(CONF.pxe.tftp_root)"},{"line_number":115,"context_line":"        pxe_utils.place_loaders_for_boot(CONF.deploy.http_root)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def init_host(self, admin_context\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9b5b23b7_3693c3fa","line":114,"updated":"2021-09-10 07:54:37.000000000","message":"Maybe do it in __init__ for the respective interfaces? In theory, PXE/iPXE can be disabled.","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"69364d67b87d8479b93cf85d2d1cca5773f25508","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        self.dbapi.clear_node_target_power_state(self.host)"},{"line_number":112,"context_line":"        # clear all locks held by this conductor before registering"},{"line_number":113,"context_line":"        self.dbapi.clear_node_reservations_for_conductor(self.host)"},{"line_number":114,"context_line":"        pxe_utils.place_loaders_for_boot(CONF.pxe.tftp_root)"},{"line_number":115,"context_line":"        pxe_utils.place_loaders_for_boot(CONF.deploy.http_root)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def init_host(self, admin_context\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"d6cfad32_12441220","line":114,"in_reply_to":"9b5b23b7_3693c3fa","updated":"2021-09-13 14:39:23.000000000","message":"I thought about that and actually started there. Yeah, they can be disabled, I dunno. I guess my worry is if we take the logical path forward with pxe interfaces, we may end up with a bit more delineation there, and we already have some overlap.  i.e. one *can* kind of use both folder paths with grub and ipxe, but it really depends on what is there.\n\nI think __init__ makes a bit more sense from a standpoint of dropping templates and the like. Speaking of which, that reminds me of my next patch.","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"}],"ironic/conf/pxe.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2e2ebbce02396067b344edb267f4cffe20cad07e","unresolved":false,"context_lines":[{"line_number":179,"context_line":"                       \u0027boot. Mostly useful for standalone ironic since \u0027"},{"line_number":180,"context_line":"                       \u0027Neutron will prevent incorrect PXE boot.\u0027)),"},{"line_number":181,"context_line":"    cfg.DictOpt(\u0027loader_file_paths\u0027,"},{"line_number":182,"context_line":"                default\u003d{},"},{"line_number":183,"context_line":"                help\u003d_(\u0027Dictionary describing the bootloaders to load into \u0027"},{"line_number":184,"context_line":"                       \u0027conductor PXE/iPXE boot folders values from the host \u0027"},{"line_number":185,"context_line":"                       \u0027operating system. Formatted as key of destination \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"04183cf8_51c942bc","line":182,"updated":"2021-09-10 07:54:37.000000000","message":"By default DictOpt does not allow escaping, which may be important for paths. You need to use this magic: https://opendev.org/openstack/ironic-lib/src/branch/master/ironic_lib/mdns.py#L46","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1c37927ccf5c6806fabf3919f716f8f65c4601eb","unresolved":false,"context_lines":[{"line_number":179,"context_line":"                       \u0027boot. Mostly useful for standalone ironic since \u0027"},{"line_number":180,"context_line":"                       \u0027Neutron will prevent incorrect PXE boot.\u0027)),"},{"line_number":181,"context_line":"    cfg.DictOpt(\u0027loader_file_paths\u0027,"},{"line_number":182,"context_line":"                default\u003d{},"},{"line_number":183,"context_line":"                help\u003d_(\u0027Dictionary describing the bootloaders to load into \u0027"},{"line_number":184,"context_line":"                       \u0027conductor PXE/iPXE boot folders values from the host \u0027"},{"line_number":185,"context_line":"                       \u0027operating system. Formatted as key of destination \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"150c6316_31a68987","line":182,"in_reply_to":"04183cf8_51c942bc","updated":"2021-09-10 19:43:35.000000000","message":"oh, thanks! I was not aware of that.","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"5646e30f1f1a747ab33b333aae4b3f484abf2cc4","unresolved":true,"context_lines":[{"line_number":103,"context_line":"                      \"system\u0027s umask to be utilized for the creation of new \""},{"line_number":104,"context_line":"                      \"tftp folders. It is required that an octal \""},{"line_number":105,"context_line":"                      \"representation is specified. For example: 0o755\")),"},{"line_number":106,"context_line":"    cfg.IntOpt(\u0027file_permission\u0027,"},{"line_number":107,"context_line":"               help\u003d_(\u0027The permission which is used on files created as part \u0027"},{"line_number":108,"context_line":"                      \u0027of configuration and setup of file assets for PXE \u0027"},{"line_number":109,"context_line":"                      \u0027based operations. Setting to \u003cNone\u003e will have no \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"00c929d3_a4e342bd","line":106,"updated":"2021-09-15 21:48:03.000000000","message":"Can this have default\u003d0o644, just like https://opendev.org/openstack/ironic/src/branch/master/ironic/conf/ilo.py#L107 ?","commit_id":"33173320dc61e4884c84257c7042c74ba8e5b33c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"8ac5ff8a3f7668f929e9ac5b180e118f7e2b2ca9","unresolved":true,"context_lines":[{"line_number":103,"context_line":"                      \"system\u0027s umask to be utilized for the creation of new \""},{"line_number":104,"context_line":"                      \"tftp folders. It is required that an octal \""},{"line_number":105,"context_line":"                      \"representation is specified. For example: 0o755\")),"},{"line_number":106,"context_line":"    cfg.IntOpt(\u0027file_permission\u0027,"},{"line_number":107,"context_line":"               help\u003d_(\u0027The permission which is used on files created as part \u0027"},{"line_number":108,"context_line":"                      \u0027of configuration and setup of file assets for PXE \u0027"},{"line_number":109,"context_line":"                      \u0027based operations. Setting to \u003cNone\u003e will have no \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"38f7cbdf_e401f2b1","line":106,"in_reply_to":"00c929d3_a4e342bd","updated":"2021-09-15 23:23:06.000000000","message":"I guess that is a good point, my concern, in part would be that if we don\u0027t we expect the operator umask to be right... but we also had someone file that as a bug once.","commit_id":"33173320dc61e4884c84257c7042c74ba8e5b33c"}],"releasenotes/notes/bootloader-copy-for-network-boot-190c713cb5e872d8.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2e2ebbce02396067b344edb267f4cffe20cad07e","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    network boot path. This capability can be opted in by using the"},{"line_number":6,"context_line":"    ``[pxe]loader_file_paths`` by being set to a list of key, value pairs"},{"line_number":7,"context_line":"    of destination filename, and source file path."},{"line_number":8,"context_line":"    For example: ``bootx64.efi:/path/to/shimx64.efi,grubx64i.efi:/path/to/grubx64.efi``"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"8c553e1c_4f268f49","line":8,"updated":"2021-09-10 07:54:37.000000000","message":"nit: missing dot in the end. or rather: maybe provide a full example?\n\n .. code-block:: ini\n\n    [pxe]\n    loader_file_paths \u003d ...","commit_id":"f4a76fcdef75634a5d2e8ffaf021e811f9a099dc"}]}
