)]}'
{"ironic/common/kickstart_utils.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"48f5b5a5ed2341081606e00dd80e78952ad3868d","unresolved":true,"context_lines":[{"line_number":113,"context_line":"            \"Can\u0027t download the configdrive content from \u0027%(url)s\u0027. \""},{"line_number":114,"context_line":"            \"Reason: %(reason)s\" %"},{"line_number":115,"context_line":"            {\u0027url\u0027: url, \u0027reason\u0027: e})"},{"line_number":116,"context_line":"    config_drive_iso \u003d decode_and_extract_config_drive_iso(config_drive)"},{"line_number":117,"context_line":"    return read_iso9600_config_drive(config_drive_iso)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"3187541e_fb9a5cc1","line":116,"updated":"2021-07-03 00:09:06.000000000","message":"I did some digging, because I know that configdrives can also be (in the general sense) a fat filesystem. AFAICT, the configdrive passed through to the driver will always be one built by openstack.baremetal.configdrive.pack() ( https://github.com/openstack/openstacksdk/blob/master/openstack/baremetal/configdrive.py#L89 ) which is always a gzipped ISO that is base64 encoded.\n\nThis makes me a little curious what the case is where the configdrive can be binary in decode_and_extract_config_drive_iso, but it\u0027s not harmful to handle it.","commit_id":"b5f066abd8538a564e06f576a7c20b15764ec5bb"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"2404647a45cfb2cc7a648c72edbd20d777174953","unresolved":true,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    :param config_drive: Config drive in iso9600 format"},{"line_number":66,"context_line":"    :returns: A dict containing path as key and contents of the configdrive"},{"line_number":67,"context_line":"    file as value."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    \"\"\""},{"line_number":70,"context_line":"    config_drive_dict \u003d dict()"}],"source_content_type":"text/x-python","patch_set":20,"id":"03d1ca53_7a19c376","line":67,"updated":"2021-07-03 22:27:06.000000000","message":"this is failing the doc job:\n/home/zuul/src/opendev.org/openstack/ironic/ironic/common/kickstart_utils.py:docstring of ironic.common.kickstart_utils.read_iso9600_config_drive:5:Field list ends without a blank line; unexpected unindent.\n\nI think for these, you need to hanging indent the second line, and don\u0027t add a blank line at the end. You might want to check throughout (I\u0027m not sure the docs job keeps going on error).","commit_id":"85ba0b110489c691a6cf3ff76fc53529a8ec183a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2427be2dce4187b5932445094549107364cdbb1e","unresolved":true,"context_lines":[{"line_number":76,"context_line":"            _get_config_drive_dict_from_iso(iso_reader, config_drive_dict)"},{"line_number":77,"context_line":"            iso_reader.close()"},{"line_number":78,"context_line":"        except Exception as e:"},{"line_number":79,"context_line":"            msg \u003d \"Error reading the config drive iso: %s\" % e"},{"line_number":80,"context_line":"            LOG.error(msg)"},{"line_number":81,"context_line":"    return config_drive_dict"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"b2aafd8b_afb89167","line":80,"range":{"start_line":79,"start_character":0,"end_line":80,"end_character":26},"updated":"2021-07-06 15:38:30.000000000","message":"fwiw, this could have just been passed in as a dictionary argument into the logger.","commit_id":"4ac8340fb613de77484de0e8cf3bc687c6b644c4"}],"ironic/common/pxe_utils.py":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"de68e4be5d2ed0aaa33ed46d62f863c2e537752f","unresolved":true,"context_lines":[{"line_number":1280,"context_line":"    if not config_drive:"},{"line_number":1281,"context_line":"        return ks_config_drive"},{"line_number":1282,"context_line":""},{"line_number":1283,"context_line":"    config_drive_iso \u003d _decode_and_extract_config_drive(config_drive)"},{"line_number":1284,"context_line":"    config_drive_dict \u003d _read_iso9600(config_drive_iso)"},{"line_number":1285,"context_line":""},{"line_number":1286,"context_line":"    for key in sorted(config_drive_dict.keys()):"}],"source_content_type":"text/x-python","patch_set":16,"id":"421b6be8_b1a09d7b","line":1283,"updated":"2021-04-06 05:34:35.000000000","message":"Am I right in thinking the format of configdrive is not an ISO, its gzipped base64 encoding? (or a swift URL to the same)\n\nSee: https://opendev.org/openstack/ironic/src/branch/master/ironic/conductor/utils.py#L980","commit_id":"f0e95b502f8c5a6955e0a3500d9f9a8678f140c6"},{"author":{"_account_id":12640,"name":"Arun S A G","email":"sagarun@gmail.com","username":"sagarun"},"change_message_id":"72dcda8c2a10cf472a6be9a253af2ceeb04be8b1","unresolved":false,"context_lines":[{"line_number":1280,"context_line":"    if not config_drive:"},{"line_number":1281,"context_line":"        return ks_config_drive"},{"line_number":1282,"context_line":""},{"line_number":1283,"context_line":"    config_drive_iso \u003d _decode_and_extract_config_drive(config_drive)"},{"line_number":1284,"context_line":"    config_drive_dict \u003d _read_iso9600(config_drive_iso)"},{"line_number":1285,"context_line":""},{"line_number":1286,"context_line":"    for key in sorted(config_drive_dict.keys()):"}],"source_content_type":"text/x-python","patch_set":16,"id":"8dcb29e5_6b119c8c","line":1283,"in_reply_to":"421b6be8_b1a09d7b","updated":"2021-04-06 06:23:48.000000000","message":"If you dig deeper the os_config_drive.build leads to https://github.com/openstack/openstacksdk/blob/master/openstack/baremetal/configdrive.py#L86. The pack function uses \u0027genisoimage\u0027 to construct an ISO image, gzips it and base64 encodes it.\n\nThe docstrings in #L980 are misleading.","commit_id":"f0e95b502f8c5a6955e0a3500d9f9a8678f140c6"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"5abeaddb7f36a3d4660c134667508c3fc1359e5e","unresolved":true,"context_lines":[{"line_number":1184,"context_line":""},{"line_number":1185,"context_line":""},{"line_number":1186,"context_line":"def _write_config_drive_content(content, file_path):"},{"line_number":1187,"context_line":"    \"\"\"Generate post ks script to write each usedata content.\"\"\""},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":"    content \u003d base64.b64encode(str.encode(content))"},{"line_number":1190,"context_line":"    kickstart_data \u003d []"}],"source_content_type":"text/x-python","patch_set":17,"id":"22ac5d42_549e4e12","line":1187,"updated":"2021-06-25 04:13:00.000000000","message":"nit: userdata","commit_id":"40190995a810091268b929b7f8813c095b1b8686"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"5abeaddb7f36a3d4660c134667508c3fc1359e5e","unresolved":true,"context_lines":[{"line_number":1197,"context_line":"    kickstart_data.append(\"CONTENT\u003d\u0027{content}\u0027\\n\".format("},{"line_number":1198,"context_line":"        content\u003dcontent))"},{"line_number":1199,"context_line":"    kickstart_data.append(\"echo $CONTENT | \""},{"line_number":1200,"context_line":"                          \"/usr/bin/base64 --decode \u003e \""},{"line_number":1201,"context_line":"                          \"{file_path}\".format(file_path\u003dfile_path))"},{"line_number":1202,"context_line":"    kickstart_data.append(\"\\n\")"},{"line_number":1203,"context_line":"    kickstart_data.append(\"%end\\n\\n\")"}],"source_content_type":"text/x-python","patch_set":17,"id":"84061288_95692f83","line":1200,"updated":"2021-06-25 04:13:00.000000000","message":"We need to consider permissions here; can we explicitly set the permissions for root-only access and add that check to the unit test.","commit_id":"40190995a810091268b929b7f8813c095b1b8686"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"2bb07a74b0e924c2cfcb6122238566dfc2abd960","unresolved":true,"context_lines":[{"line_number":1184,"context_line":""},{"line_number":1185,"context_line":""},{"line_number":1186,"context_line":"def _write_config_drive_content(content, file_path):"},{"line_number":1187,"context_line":"    \"\"\"Generate post ks script to write each usedata content.\"\"\""},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":"    content \u003d base64.b64encode(str.encode(content))"},{"line_number":1190,"context_line":"    kickstart_data \u003d []"}],"source_content_type":"text/x-python","patch_set":18,"id":"cb7e2f08_ce119042","line":1187,"updated":"2021-07-01 16:27:12.000000000","message":"still needs s/usedata/userdata/, but won\u0027t hold my approval for spelling 😊","commit_id":"1f0c4ebe7f60cfc4efdabc82e9bc910ffdfb359e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"02188957a1843c2b03ff639aa155f44c751ccc23","unresolved":true,"context_lines":[{"line_number":1184,"context_line":""},{"line_number":1185,"context_line":""},{"line_number":1186,"context_line":"def _write_config_drive_content(content, file_path):"},{"line_number":1187,"context_line":"    \"\"\"Generate post ks script to write each usedata content.\"\"\""},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":"    content \u003d base64.b64encode(str.encode(content))"},{"line_number":1190,"context_line":"    kickstart_data \u003d []"}],"source_content_type":"text/x-python","patch_set":18,"id":"1e72c09a_48524c3d","line":1187,"in_reply_to":"cb7e2f08_ce119042","updated":"2021-07-01 16:44:36.000000000","message":"Follow-ups are easy 😊","commit_id":"1f0c4ebe7f60cfc4efdabc82e9bc910ffdfb359e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"02188957a1843c2b03ff639aa155f44c751ccc23","unresolved":true,"context_lines":[{"line_number":1213,"context_line":"    \"\"\"Prepare config_drive for writing to kickstart file\"\"\""},{"line_number":1214,"context_line":"    LOG.debug(\"Preparing config_drive to write to kickstart file\")"},{"line_number":1215,"context_line":"    node \u003d task.node"},{"line_number":1216,"context_line":"    config_drive \u003d node.instance_info.get(\u0027configdrive\u0027)"},{"line_number":1217,"context_line":"    ks_config_drive \u003d \u0027\u0027"},{"line_number":1218,"context_line":"    if not config_drive:"},{"line_number":1219,"context_line":"        return ks_config_drive"},{"line_number":1220,"context_line":""},{"line_number":1221,"context_line":"    for key in sorted(config_drive.keys()):"},{"line_number":1222,"context_line":"        target_path \u003d os.path.join(config_drive_path, key)"}],"source_content_type":"text/x-python","patch_set":18,"id":"cf65bcfc_072316bf","line":1219,"range":{"start_line":1216,"start_character":5,"end_line":1219,"end_character":30},"updated":"2021-07-01 16:44:36.000000000","message":"so, this... *might* be problematic.  This field can be a URL or the actual data. If storage in swift is enabled, it just becomes a url.","commit_id":"1f0c4ebe7f60cfc4efdabc82e9bc910ffdfb359e"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"d8cdce4c76ea8965ceecbfc50a4e2be1de50099c","unresolved":true,"context_lines":[{"line_number":1213,"context_line":"    \"\"\"Prepare config_drive for writing to kickstart file\"\"\""},{"line_number":1214,"context_line":"    LOG.debug(\"Preparing config_drive to write to kickstart file\")"},{"line_number":1215,"context_line":"    node \u003d task.node"},{"line_number":1216,"context_line":"    config_drive \u003d node.instance_info.get(\u0027configdrive\u0027)"},{"line_number":1217,"context_line":"    ks_config_drive \u003d \u0027\u0027"},{"line_number":1218,"context_line":"    if not config_drive:"},{"line_number":1219,"context_line":"        return ks_config_drive"},{"line_number":1220,"context_line":""},{"line_number":1221,"context_line":"    for key in sorted(config_drive.keys()):"},{"line_number":1222,"context_line":"        target_path \u003d os.path.join(config_drive_path, key)"}],"source_content_type":"text/x-python","patch_set":18,"id":"28f9a344_f7f8e9fa","line":1219,"range":{"start_line":1216,"start_character":5,"end_line":1219,"end_character":30},"in_reply_to":"cf65bcfc_072316bf","updated":"2021-07-01 16:56:08.000000000","message":"Generally speaking, it\u0027s expected the conductor fetches that URL, right? So the fix for this needs to be here (as opposed to the KS file itself fetching the configdrive)?","commit_id":"1f0c4ebe7f60cfc4efdabc82e9bc910ffdfb359e"}],"ironic/tests/unit/common/test_pxe_utils.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"bd03cbbfab7206092a6ff4f60789594d988dcee0","unresolved":true,"context_lines":[{"line_number":2064,"context_line":"                os.path.join(CONF.deploy.http_root, self.node.uuid))"},{"line_number":2065,"context_line":""},{"line_number":2066,"context_line":"    @contextmanager"},{"line_number":2067,"context_line":"    def tempdir(self):"},{"line_number":2068,"context_line":"        tmpdir \u003d tempfile.mkdtemp()"},{"line_number":2069,"context_line":"        try:"},{"line_number":2070,"context_line":"            yield tmpdir"}],"source_content_type":"text/x-python","patch_set":15,"id":"71072c6c_4726f497","line":2067,"updated":"2021-04-04 18:07:54.000000000","message":"Please take this method out of the test class.","commit_id":"26bca891f4d9bc9a0aa40d26ed541a947edb5fb5"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"bd03cbbfab7206092a6ff4f60789594d988dcee0","unresolved":true,"context_lines":[{"line_number":2074,"context_line":"            except OSError:"},{"line_number":2075,"context_line":"                pass"},{"line_number":2076,"context_line":""},{"line_number":2077,"context_line":"    def get_a_config_drive(self):"},{"line_number":2078,"context_line":"        return (\u0027H4sICDw0S2AC/3RtcGhYdnFvdADt3X1vFMcdAOBZkwbTIquiL6oiJ9kkkJBKN\u0027"},{"line_number":2079,"context_line":"                \u0027mcTkTiVKl3Oa3uTe9PdOYK/0AmOvNqO4IJatZWav5pK/UztV8kXiPoR2tm98x\u0027"},{"line_number":2080,"context_line":"                \u0027s+fCQQMPA8i71zs7Mz4/VJvx0vMxcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"908a91ab_8b2478b9","line":2077,"updated":"2021-04-04 18:07:54.000000000","message":"nit: maybe just make this a module-level constant? I don\u0027t think there\u0027s a need to wrap this in a method. Either way it probably shouldn\u0027t be in the test class.","commit_id":"26bca891f4d9bc9a0aa40d26ed541a947edb5fb5"}],"releasenotes/notes/configdrive-support-in-anaconda-deploy-f2aad59b4ff809ec.yaml":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"02188957a1843c2b03ff639aa155f44c751ccc23","unresolved":true,"context_lines":[{"line_number":7,"context_line":"    should be able to pick up the the config drive information and process"},{"line_number":8,"context_line":"    them. Because the config drive is extracted on to disk as plain text files"},{"line_number":9,"context_line":"    tools like glean will not work with this deploy interface."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":18,"id":"3d084758_fc51f23b","line":10,"updated":"2021-07-01 16:44:36.000000000","message":"So, likely need a known limitation or issue w/r/t config drive url/content issue noted elsewhere.","commit_id":"1f0c4ebe7f60cfc4efdabc82e9bc910ffdfb359e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"02188957a1843c2b03ff639aa155f44c751ccc23","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":18,"id":"93db2f8f_4acb9182","line":11,"updated":"2021-07-01 16:44:36.000000000","message":"nit: excess lines.","commit_id":"1f0c4ebe7f60cfc4efdabc82e9bc910ffdfb359e"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"48f5b5a5ed2341081606e00dd80e78952ad3868d","unresolved":true,"context_lines":[{"line_number":6,"context_line":"    directory by the driver via kickstart files %post section. cloud-init"},{"line_number":7,"context_line":"    should be able to pick up the the config drive information and process"},{"line_number":8,"context_line":"    them. Because the config drive is extracted on to disk as plain text files"},{"line_number":9,"context_line":"    tools like glean will not work with this deploy interface."}],"source_content_type":"text/x-yaml","patch_set":19,"id":"154588be_bef5c6f3","line":9,"updated":"2021-07-03 00:09:06.000000000","message":"This isn\u0027t really a review feedback, but it might be worth considering just filing a feature request (or maybe just even a small merge request) to glean to support this folder as well.","commit_id":"b5f066abd8538a564e06f576a7c20b15764ec5bb"}]}
