)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"61908ae04c23df771d19355b06fc380a92eae307","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"bc35c875_7d6d9205","updated":"2025-12-11 19:50:20.000000000","message":"LGTM","commit_id":"30853959affeff04cc39ef579e6ef49ea68c8b59"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"24658c804ec866cc2f28bdce25cc1aed6fe3c86d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"a5f10867_d044ec1d","updated":"2025-12-18 18:35:06.000000000","message":"recheck metal3-integration seems to be passing now","commit_id":"52300e0a62733be8da613fbc4c0b54fd90b1ae0e"}],"ironic/common/image_service.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"73065e77c54d5a4bbe1de8295e39d3018d27259f","unresolved":true,"context_lines":[{"line_number":992,"context_line":"    # While that wouldn\u0027t necessarily be right here in the code, it would"},{"line_number":993,"context_line":"    # likely need to be able to be picked up for user based authentication."},{"line_number":994,"context_line":"    if permit_user_auth and \u0027image_pull_secret\u0027 in node.instance_info:"},{"line_number":995,"context_line":"        cred \u003d node.instance_info.get(\u0027image_pull_secret\u0027)"},{"line_number":996,"context_line":"        if \u0027:\u0027 in cred:"},{"line_number":997,"context_line":"            split_cred \u003d cred.split(\u0027:\u0027, 1)"},{"line_number":998,"context_line":"            if len(split_cred) \u003d\u003d 2:"},{"line_number":999,"context_line":"                return {\u0027username\u0027: split_cred[0],"},{"line_number":1000,"context_line":"                        \u0027password\u0027: split_cred[1]}"},{"line_number":1001,"context_line":"        return {"},{"line_number":1002,"context_line":"            # Pull secrets appear to leverage basic auth, but provide a blank"},{"line_number":1003,"context_line":"            # username, where the password is understood to be the pre-shared"}],"source_content_type":"text/x-python","patch_set":8,"id":"024dbb5d_3ea2dcab","line":1000,"range":{"start_line":995,"start_character":6,"end_line":1000,"end_character":50},"updated":"2025-12-04 15:11:33.000000000","message":"So, we likely want to mirror this on node.driver_info handling, and in just general, but I\u0027ll leave the question up here for discussion.","commit_id":"51254fe4451e5aa3b5b6b161e45df0cb024b9a50"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e15b776b51f92e40e498920e30551a819f3c16a3","unresolved":false,"context_lines":[{"line_number":992,"context_line":"    # While that wouldn\u0027t necessarily be right here in the code, it would"},{"line_number":993,"context_line":"    # likely need to be able to be picked up for user based authentication."},{"line_number":994,"context_line":"    if permit_user_auth and \u0027image_pull_secret\u0027 in node.instance_info:"},{"line_number":995,"context_line":"        cred \u003d node.instance_info.get(\u0027image_pull_secret\u0027)"},{"line_number":996,"context_line":"        if \u0027:\u0027 in cred:"},{"line_number":997,"context_line":"            split_cred \u003d cred.split(\u0027:\u0027, 1)"},{"line_number":998,"context_line":"            if len(split_cred) \u003d\u003d 2:"},{"line_number":999,"context_line":"                return {\u0027username\u0027: split_cred[0],"},{"line_number":1000,"context_line":"                        \u0027password\u0027: split_cred[1]}"},{"line_number":1001,"context_line":"        return {"},{"line_number":1002,"context_line":"            # Pull secrets appear to leverage basic auth, but provide a blank"},{"line_number":1003,"context_line":"            # username, where the password is understood to be the pre-shared"}],"source_content_type":"text/x-python","patch_set":8,"id":"014d906d_9fbec2f0","line":1000,"range":{"start_line":995,"start_character":6,"end_line":1000,"end_character":50},"in_reply_to":"024dbb5d_3ea2dcab","updated":"2025-12-04 18:21:05.000000000","message":"Done","commit_id":"51254fe4451e5aa3b5b6b161e45df0cb024b9a50"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"78258f2f77ce3e6cdb557995a884c982fa8025e4","unresolved":true,"context_lines":[{"line_number":998,"context_line":"            # There is no value present here, we can"},{"line_number":999,"context_line":"            # return None to indicate nothing is present."},{"line_number":1000,"context_line":"            return None"},{"line_number":1001,"context_line":"        split_secret \u003d secret.split(\u0027:\u0027, 1)"},{"line_number":1002,"context_line":"        if \u0027:\u0027 not in secret:"},{"line_number":1003,"context_line":"            # Shortcut to just return the secret if it doesn\u0027t"},{"line_number":1004,"context_line":"            # look like delimited values."}],"source_content_type":"text/x-python","patch_set":10,"id":"6f208048_185af009","line":1001,"updated":"2025-12-04 21:26:39.000000000","message":"Nit: this could go after `if \u0027:\u0027 not in secret:` and before `elif len(split_secret) \u003d\u003d 2:`\n\nFurther nit: No need for `elif` if every block will return.","commit_id":"db8e9a16157754f41fe8c28a4f455fc1b2bcd010"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"48f9b27c346e6ed004bc90375f1b197ed87734a7","unresolved":false,"context_lines":[{"line_number":998,"context_line":"            # There is no value present here, we can"},{"line_number":999,"context_line":"            # return None to indicate nothing is present."},{"line_number":1000,"context_line":"            return None"},{"line_number":1001,"context_line":"        split_secret \u003d secret.split(\u0027:\u0027, 1)"},{"line_number":1002,"context_line":"        if \u0027:\u0027 not in secret:"},{"line_number":1003,"context_line":"            # Shortcut to just return the secret if it doesn\u0027t"},{"line_number":1004,"context_line":"            # look like delimited values."}],"source_content_type":"text/x-python","patch_set":10,"id":"e4771e2e_18841405","line":1001,"in_reply_to":"6f208048_185af009","updated":"2025-12-15 21:14:56.000000000","message":"Done","commit_id":"db8e9a16157754f41fe8c28a4f455fc1b2bcd010"},{"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":"55613dda846bf25ed73343da53718086adcc10c6","unresolved":true,"context_lines":[{"line_number":1018,"context_line":"        return None"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"    possible_secret \u003d None"},{"line_number":1021,"context_line":"    if permit_user_auth and \u0027image_pull_secret\u0027 in node.instance_info:"},{"line_number":1022,"context_line":"        # If the user is permitted to provide authentication details,"},{"line_number":1023,"context_line":"        # attempt to extract it from the instance_info."},{"line_number":1024,"context_line":"        possible_secret \u003d __extract_secret(node.instance_info)"}],"source_content_type":"text/x-python","patch_set":10,"id":"e986d219_21321615","line":1021,"updated":"2025-12-04 18:15:05.000000000","message":"Just generally curious: why would an operator want to forbid use of your own secrets? Preventing the deployment of a node with an unsupported image?","commit_id":"db8e9a16157754f41fe8c28a4f455fc1b2bcd010"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e15b776b51f92e40e498920e30551a819f3c16a3","unresolved":true,"context_lines":[{"line_number":1018,"context_line":"        return None"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"    possible_secret \u003d None"},{"line_number":1021,"context_line":"    if permit_user_auth and \u0027image_pull_secret\u0027 in node.instance_info:"},{"line_number":1022,"context_line":"        # If the user is permitted to provide authentication details,"},{"line_number":1023,"context_line":"        # attempt to extract it from the instance_info."},{"line_number":1024,"context_line":"        possible_secret \u003d __extract_secret(node.instance_info)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ebfe98f5_d22318f9","line":1021,"in_reply_to":"e986d219_21321615","updated":"2025-12-04 18:21:05.000000000","message":"If memory serves, the flag gets set to false if we\u0027re downloading artifacts for ironic\u0027s own work.\n\nSo it provides the guard rail, for lack of a better expression, to handle both artifact download cases, and the caller knows which one it needs to be and sets the value for it.","commit_id":"db8e9a16157754f41fe8c28a4f455fc1b2bcd010"},{"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":"76340d701ed86322b9b16bf64c3c6caa3c5edddf","unresolved":true,"context_lines":[{"line_number":1018,"context_line":"        return None"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"    possible_secret \u003d None"},{"line_number":1021,"context_line":"    if permit_user_auth and \u0027image_pull_secret\u0027 in node.instance_info:"},{"line_number":1022,"context_line":"        # If the user is permitted to provide authentication details,"},{"line_number":1023,"context_line":"        # attempt to extract it from the instance_info."},{"line_number":1024,"context_line":"        possible_secret \u003d __extract_secret(node.instance_info)"}],"source_content_type":"text/x-python","patch_set":10,"id":"a26965a5_f93f11e7","line":1021,"in_reply_to":"ebfe98f5_d22318f9","updated":"2025-12-09 20:00:47.000000000","message":"Good explanation, thanks for preserving it in the docstring.","commit_id":"db8e9a16157754f41fe8c28a4f455fc1b2bcd010"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"48f9b27c346e6ed004bc90375f1b197ed87734a7","unresolved":false,"context_lines":[{"line_number":1018,"context_line":"        return None"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"    possible_secret \u003d None"},{"line_number":1021,"context_line":"    if permit_user_auth and \u0027image_pull_secret\u0027 in node.instance_info:"},{"line_number":1022,"context_line":"        # If the user is permitted to provide authentication details,"},{"line_number":1023,"context_line":"        # attempt to extract it from the instance_info."},{"line_number":1024,"context_line":"        possible_secret \u003d __extract_secret(node.instance_info)"}],"source_content_type":"text/x-python","patch_set":10,"id":"859522f0_f6ed68b4","line":1021,"in_reply_to":"ebfe98f5_d22318f9","updated":"2025-12-15 21:14:56.000000000","message":"clarifying the method docstring and inline comments.","commit_id":"db8e9a16157754f41fe8c28a4f455fc1b2bcd010"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"78258f2f77ce3e6cdb557995a884c982fa8025e4","unresolved":true,"context_lines":[{"line_number":1035,"context_line":"            \u0027password\u0027: CONF.deploy.image_server_password,"},{"line_number":1036,"context_line":"        }"},{"line_number":1037,"context_line":"    if possible_secret:"},{"line_number":1038,"context_line":"        return possible_secret"},{"line_number":1039,"context_line":"    else:"},{"line_number":1040,"context_line":"        return None"},{"line_number":1041,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"64c62541_5f48828f","line":1038,"updated":"2025-12-04 21:26:39.000000000","message":"Would it be useful to log where we ultimate drew the secret from? ie `driver_info`, `instance_info`, or deploy configuration?","commit_id":"db8e9a16157754f41fe8c28a4f455fc1b2bcd010"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4ebc46da7314893e1894f17c7985d8e95c490dec","unresolved":true,"context_lines":[{"line_number":1035,"context_line":"            \u0027password\u0027: CONF.deploy.image_server_password,"},{"line_number":1036,"context_line":"        }"},{"line_number":1037,"context_line":"    if possible_secret:"},{"line_number":1038,"context_line":"        return possible_secret"},{"line_number":1039,"context_line":"    else:"},{"line_number":1040,"context_line":"        return None"},{"line_number":1041,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"c80e2160_f59cdd8b","line":1038,"in_reply_to":"64c62541_5f48828f","updated":"2025-12-05 18:42:25.000000000","message":"That is a super useful point. I think it does make sense to possibly log something.","commit_id":"db8e9a16157754f41fe8c28a4f455fc1b2bcd010"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"48f9b27c346e6ed004bc90375f1b197ed87734a7","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"            \u0027password\u0027: CONF.deploy.image_server_password,"},{"line_number":1036,"context_line":"        }"},{"line_number":1037,"context_line":"    if possible_secret:"},{"line_number":1038,"context_line":"        return possible_secret"},{"line_number":1039,"context_line":"    else:"},{"line_number":1040,"context_line":"        return None"},{"line_number":1041,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bf736ca0_bcb5a1bf","line":1038,"in_reply_to":"c80e2160_f59cdd8b","updated":"2025-12-15 21:14:56.000000000","message":"Done","commit_id":"db8e9a16157754f41fe8c28a4f455fc1b2bcd010"}],"ironic/drivers/modules/agent.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e15b776b51f92e40e498920e30551a819f3c16a3","unresolved":true,"context_lines":[{"line_number":109,"context_line":"    :param task: a TaskManager instance containing the node to act on."},{"line_number":110,"context_line":"    :raises: InvalidParameterValue if size of the image is greater than"},{"line_number":111,"context_line":"        the available ram size."},{"line_number":112,"context_line":"    \"\"\""},{"line_number":113,"context_line":"    node \u003d task.node"},{"line_number":114,"context_line":"    properties \u003d node.properties"},{"line_number":115,"context_line":"    image_source \u003d node.instance_info.get(\u0027image_source\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"f6784acb_a5a08c21","line":112,"updated":"2025-12-04 18:21:05.000000000","message":"step 0: add a debug entry to this method.\nstep 1: add a todo, to consider merging or moving in line with the prior call flow.","commit_id":"9835e1b79d7bcda284ef56c20e7a45cd21f1e389"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e15b776b51f92e40e498920e30551a819f3c16a3","unresolved":true,"context_lines":[{"line_number":109,"context_line":"    :param task: a TaskManager instance containing the node to act on."},{"line_number":110,"context_line":"    :raises: InvalidParameterValue if size of the image is greater than"},{"line_number":111,"context_line":"        the available ram size."},{"line_number":112,"context_line":"    \"\"\""},{"line_number":113,"context_line":"    node \u003d task.node"},{"line_number":114,"context_line":"    properties \u003d node.properties"},{"line_number":115,"context_line":"    image_source \u003d node.instance_info.get(\u0027image_source\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3252a921_93d001f4","line":112,"updated":"2025-12-04 18:21:05.000000000","message":"x","commit_id":"9835e1b79d7bcda284ef56c20e7a45cd21f1e389"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"48f9b27c346e6ed004bc90375f1b197ed87734a7","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    :param task: a TaskManager instance containing the node to act on."},{"line_number":110,"context_line":"    :raises: InvalidParameterValue if size of the image is greater than"},{"line_number":111,"context_line":"        the available ram size."},{"line_number":112,"context_line":"    \"\"\""},{"line_number":113,"context_line":"    node \u003d task.node"},{"line_number":114,"context_line":"    properties \u003d node.properties"},{"line_number":115,"context_line":"    image_source \u003d node.instance_info.get(\u0027image_source\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"a0cc23bf_470c1be6","line":112,"in_reply_to":"3252a921_93d001f4","updated":"2025-12-15 21:14:56.000000000","message":"Done","commit_id":"9835e1b79d7bcda284ef56c20e7a45cd21f1e389"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"48f9b27c346e6ed004bc90375f1b197ed87734a7","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    :param task: a TaskManager instance containing the node to act on."},{"line_number":110,"context_line":"    :raises: InvalidParameterValue if size of the image is greater than"},{"line_number":111,"context_line":"        the available ram size."},{"line_number":112,"context_line":"    \"\"\""},{"line_number":113,"context_line":"    node \u003d task.node"},{"line_number":114,"context_line":"    properties \u003d node.properties"},{"line_number":115,"context_line":"    image_source \u003d node.instance_info.get(\u0027image_source\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ab528cf_17402c0c","line":112,"in_reply_to":"f6784acb_a5a08c21","updated":"2025-12-15 21:14:56.000000000","message":"Done","commit_id":"9835e1b79d7bcda284ef56c20e7a45cd21f1e389"},{"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":"55613dda846bf25ed73343da53718086adcc10c6","unresolved":true,"context_lines":[{"line_number":134,"context_line":"    except exception.OciImageNotSpecific:"},{"line_number":135,"context_line":"        # In the event of a tag reference, this exception can be raised"},{"line_number":136,"context_line":"        # however if we have a tag at this point we\u0027re not downloading,"},{"line_number":137,"context_line":"        # and the rest of this method can just noop."},{"line_number":138,"context_line":"        return"},{"line_number":139,"context_line":"    if CONF.agent.stream_raw_images and (image_show.get(\u0027disk_format\u0027) \u003d\u003d \u0027raw\u0027"},{"line_number":140,"context_line":"                                         or image_disk_format \u003d\u003d \u0027raw\u0027):"}],"source_content_type":"text/x-python","patch_set":10,"id":"2e2aa205_66ce21e4","line":137,"updated":"2025-12-04 18:15:05.000000000","message":"I\u0027m not sure I fully grok this comment?","commit_id":"db8e9a16157754f41fe8c28a4f455fc1b2bcd010"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e15b776b51f92e40e498920e30551a819f3c16a3","unresolved":true,"context_lines":[{"line_number":134,"context_line":"    except exception.OciImageNotSpecific:"},{"line_number":135,"context_line":"        # In the event of a tag reference, this exception can be raised"},{"line_number":136,"context_line":"        # however if we have a tag at this point we\u0027re not downloading,"},{"line_number":137,"context_line":"        # and the rest of this method can just noop."},{"line_number":138,"context_line":"        return"},{"line_number":139,"context_line":"    if CONF.agent.stream_raw_images and (image_show.get(\u0027disk_format\u0027) \u003d\u003d \u0027raw\u0027"},{"line_number":140,"context_line":"                                         or image_disk_format \u003d\u003d \u0027raw\u0027):"}],"source_content_type":"text/x-python","patch_set":10,"id":"a590f790_0afacef1","line":137,"in_reply_to":"2e2aa205_66ce21e4","updated":"2025-12-04 18:21:05.000000000","message":"So, an earlier method saves an image_url for the agent to use. But if we convert it, we convert the file over to being a file on local disk. So this is sort of a late check without credentials which can fail when there is a tag because it can\u0027t resolve all the way in. So, sort of a case of a weird exception which can be raised, but overall this entire method likely needs to be refacotredinto build_instance_info_for_deploy.","commit_id":"db8e9a16157754f41fe8c28a4f455fc1b2bcd010"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"48f9b27c346e6ed004bc90375f1b197ed87734a7","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    except exception.OciImageNotSpecific:"},{"line_number":135,"context_line":"        # In the event of a tag reference, this exception can be raised"},{"line_number":136,"context_line":"        # however if we have a tag at this point we\u0027re not downloading,"},{"line_number":137,"context_line":"        # and the rest of this method can just noop."},{"line_number":138,"context_line":"        return"},{"line_number":139,"context_line":"    if CONF.agent.stream_raw_images and (image_show.get(\u0027disk_format\u0027) \u003d\u003d \u0027raw\u0027"},{"line_number":140,"context_line":"                                         or image_disk_format \u003d\u003d \u0027raw\u0027):"}],"source_content_type":"text/x-python","patch_set":10,"id":"739d3c91_6c874665","line":137,"in_reply_to":"a590f790_0afacef1","updated":"2025-12-15 21:14:56.000000000","message":"Done","commit_id":"db8e9a16157754f41fe8c28a4f455fc1b2bcd010"}]}
