)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"8d6175bc0a280d2efd4538fe565c488c0d2317b8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"72cda851_18c2e231","updated":"2025-11-21 18:04:31.000000000","message":"I\u0027d,honestly change the sort order, but otherwise LGTM. Highlighting with -1 to signal a request for revision in that direction.","commit_id":"c3f7060112c14e127ca10e58b41463416acb6020"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"dc6d201056f25f3a65550d36c7058c00ce95ea24","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":11,"id":"b81c2ba8_c24602d0","updated":"2025-11-25 21:46:14.000000000","message":"Without code comments on the function signatures I think we could use typing annotations to help figure this out for our future selves. I had to really read the implementation to figure out the types and I\u0027m not even sure I got them correct.\n\nI think the \u0027port\u0027 and \u0027portgroup\u0027 string to could be a `StrEnum` as well if we wanna use match and such.","commit_id":"5c3097efb42e74cd135865d6d6e798326b03fa55"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"0576451838379a2a2fa8093b192ac6e787b24e28","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"60d1f7dd_4bed3c85","updated":"2025-11-25 14:37:21.000000000","message":"recheck CI flake","commit_id":"5c3097efb42e74cd135865d6d6e798326b03fa55"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"3cb5c322b3a6a214b82a88549412581168027c38","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"b08f66aa_a6086e62","updated":"2025-12-02 21:03:00.000000000","message":"recheck ci flake","commit_id":"b1d37e11090be09786491da5d6b45756e851c900"},{"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":"19c68f69c95a9c6fe859f2ebfa336c6aaecd7fe5","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":13,"id":"4f32f984_86b7a446","updated":"2025-12-04 18:02:22.000000000","message":"recheck fatal: [localhost]: FAILED! \u003d\u003e {\"changed\": false, \"dest\": \"/tmp/go1.24.3.linux-amd64.tar.gz\", \"elapsed\": 0, \"msg\": \"Request failed\", \"response\": \"HTTP Error 403: Forbidden\", \"status_code\": 403, \"url\": \"https://storage.googleapis.com/golang/go1.24.3.linux-amd64.tar.gz\"}\u001b[0m in the metal3 job","commit_id":"b1d37e11090be09786491da5d6b45756e851c900"}],"ironic/common/trait_based_networking/plan.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":"48d6efbfe1075dd529475e73aa09bbb98fc7fbc4","unresolved":true,"context_lines":[{"line_number":26,"context_line":"    # Order ports and portgroups by UUID."},{"line_number":27,"context_line":"    # TODO(clif) Is this OK? Should this be configurable?"},{"line_number":28,"context_line":"    node_ports.sort(key\u003dlambda port: port.uuid)"},{"line_number":29,"context_line":"    node_portgroups.sort(key\u003dlambda portgroup: portgroup.uuid)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    portlikes \u003d [base.Port.from_ironic_port(port) for port in node_ports]"},{"line_number":32,"context_line":"    portgrouplikes \u003d [base.Portgroup.from_ironic_portgroup(portgroup)"}],"source_content_type":"text/x-python","patch_set":6,"id":"c20b228e_59ab2c21","line":29,"updated":"2025-11-12 23:19:48.000000000","message":"nit: UUID is probably the worst thing to choose or order on. At least ordering by the integer id would allow you to make older or newer ports preferred.","commit_id":"83f84d383a2683831bfdf4c3998e0951ee3fc76a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"8d6175bc0a280d2efd4538fe565c488c0d2317b8","unresolved":true,"context_lines":[{"line_number":26,"context_line":"    # Order ports and portgroups by UUID."},{"line_number":27,"context_line":"    # TODO(clif) Is this OK? Should this be configurable?"},{"line_number":28,"context_line":"    node_ports.sort(key\u003dlambda port: port.uuid)"},{"line_number":29,"context_line":"    node_portgroups.sort(key\u003dlambda portgroup: portgroup.uuid)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    portlikes \u003d [base.Port.from_ironic_port(port) for port in node_ports]"},{"line_number":32,"context_line":"    portgrouplikes \u003d [base.Portgroup.from_ironic_portgroup(portgroup)"}],"source_content_type":"text/x-python","patch_set":6,"id":"c85b0ee3_6de2ccde","line":29,"in_reply_to":"c20b228e_59ab2c21","updated":"2025-11-21 18:04:31.000000000","message":"This is almost going to sound weird, but I\u0027d focus on newer over older by the ID key. That means if someone deletes/removes, they end up with predictable behavior of using the thing they just added, versus the uuid which ends up being wherever it lands.","commit_id":"83f84d383a2683831bfdf4c3998e0951ee3fc76a"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"c809fc3220eb164339c271b56568b14645c6239c","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    # Order ports and portgroups by UUID."},{"line_number":27,"context_line":"    # TODO(clif) Is this OK? Should this be configurable?"},{"line_number":28,"context_line":"    node_ports.sort(key\u003dlambda port: port.uuid)"},{"line_number":29,"context_line":"    node_portgroups.sort(key\u003dlambda portgroup: portgroup.uuid)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    portlikes \u003d [base.Port.from_ironic_port(port) for port in node_ports]"},{"line_number":32,"context_line":"    portgrouplikes \u003d [base.Portgroup.from_ironic_portgroup(portgroup)"}],"source_content_type":"text/x-python","patch_set":6,"id":"e847e4a6_c8665b25","line":29,"in_reply_to":"c85b0ee3_6de2ccde","updated":"2025-12-01 21:28:50.000000000","message":"Done","commit_id":"83f84d383a2683831bfdf4c3998e0951ee3fc76a"},{"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":"48d6efbfe1075dd529475e73aa09bbb98fc7fbc4","unresolved":true,"context_lines":[{"line_number":75,"context_line":"    if len(actions) \u003d\u003d 0:"},{"line_number":76,"context_line":"        return [base.NoMatch(trait_action,"},{"line_number":77,"context_line":"                             node_uuid,"},{"line_number":78,"context_line":"                             f\"No ({type_name}s, network) pairs matched \""},{"line_number":79,"context_line":"                             \"rule.\")]"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    if (trait_action.min_count is not None"}],"source_content_type":"text/x-python","patch_set":6,"id":"680fda3a_d7750df8","line":78,"updated":"2025-11-12 23:19:48.000000000","message":"All these operator facing strings need to be i18n-ized, e.g.:\n\nmsg \u003d _(\"No ({type_name}s, network) pairs matched rule\")\nreturn [base.NoMatch(action, uuid, msg)]","commit_id":"83f84d383a2683831bfdf4c3998e0951ee3fc76a"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"c147591575e8a5792cf5257c8205c1161662c72e","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    if len(actions) \u003d\u003d 0:"},{"line_number":76,"context_line":"        return [base.NoMatch(trait_action,"},{"line_number":77,"context_line":"                             node_uuid,"},{"line_number":78,"context_line":"                             f\"No ({type_name}s, network) pairs matched \""},{"line_number":79,"context_line":"                             \"rule.\")]"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    if (trait_action.min_count is not None"}],"source_content_type":"text/x-python","patch_set":6,"id":"d837ad8a_f604959a","line":78,"in_reply_to":"680fda3a_d7750df8","updated":"2025-11-24 18:42:09.000000000","message":"Done","commit_id":"83f84d383a2683831bfdf4c3998e0951ee3fc76a"},{"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":"5563ca4d48fe16bc38d44b1e2a5599655967c7e3","unresolved":true,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # Order ports and portgroups by UUID."},{"line_number":28,"context_line":"    # TODO(clif) Is this OK? Should this be configurable?"},{"line_number":29,"context_line":"    node_ports.sort(key\u003dlambda port: port.uuid, reverse\u003dTrue)"},{"line_number":30,"context_line":"    node_portgroups.sort(key\u003dlambda portgroup: portgroup.uuid, reverse\u003dTrue)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    portlikes \u003d [base.Port.from_ironic_port(port) for port in node_ports]"}],"source_content_type":"text/x-python","patch_set":10,"id":"feecc657_065515aa","line":29,"updated":"2025-11-21 21:01:58.000000000","message":"This has to be updated to use integer ID to do sorting in the way Julia suggests","commit_id":"1409b8feb3d63e5a82963a53da6876d9b41a34a7"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"c147591575e8a5792cf5257c8205c1161662c72e","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # Order ports and portgroups by UUID."},{"line_number":28,"context_line":"    # TODO(clif) Is this OK? Should this be configurable?"},{"line_number":29,"context_line":"    node_ports.sort(key\u003dlambda port: port.uuid, reverse\u003dTrue)"},{"line_number":30,"context_line":"    node_portgroups.sort(key\u003dlambda portgroup: portgroup.uuid, reverse\u003dTrue)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    portlikes \u003d [base.Port.from_ironic_port(port) for port in node_ports]"}],"source_content_type":"text/x-python","patch_set":10,"id":"85fdeb18_e8593b04","line":29,"in_reply_to":"feecc657_065515aa","updated":"2025-11-24 18:42:09.000000000","message":"IDK why this is still UUID, I could\u0027ve sworn I changed it to ID.","commit_id":"1409b8feb3d63e5a82963a53da6876d9b41a34a7"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"dc6d201056f25f3a65550d36c7058c00ce95ea24","unresolved":true,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from ironic.common.i18n import _"},{"line_number":15,"context_line":"import ironic.common.trait_based_networking.base as base"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import itertools"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"0bcf5dd5_d124d1e2","line":15,"updated":"2025-11-25 21:46:14.000000000","message":"```suggestion\nfrom ironic.common.trait_based_networking import base\nfrom ironic.objects import port\nfrom ironic.objects import portgroup\n```","commit_id":"5c3097efb42e74cd135865d6d6e798326b03fa55"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"c809fc3220eb164339c271b56568b14645c6239c","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from ironic.common.i18n import _"},{"line_number":15,"context_line":"import ironic.common.trait_based_networking.base as base"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import itertools"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"d55207a6_b9c47544","line":15,"in_reply_to":"0bcf5dd5_d124d1e2","updated":"2025-12-01 21:28:50.000000000","message":"Done","commit_id":"5c3097efb42e74cd135865d6d6e798326b03fa55"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"774b82a9dbb78c9c849d46eb6fd9da3fb581bcbc","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from ironic.common.i18n import _"},{"line_number":15,"context_line":"import ironic.common.trait_based_networking.base as base"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import itertools"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"ad4bc831_0ebe8192","line":15,"in_reply_to":"d374b11b_cc738a08","updated":"2025-12-04 18:31:01.000000000","message":"oops, done now","commit_id":"5c3097efb42e74cd135865d6d6e798326b03fa55"},{"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":"3e2f09e28f4c94cca833e6d80b6a028ce0a6b152","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from ironic.common.i18n import _"},{"line_number":15,"context_line":"import ironic.common.trait_based_networking.base as base"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import itertools"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"d374b11b_cc738a08","line":15,"in_reply_to":"d55207a6_b9c47544","updated":"2025-12-03 23:44:08.000000000","message":"This import hasn\u0027t been fixed","commit_id":"5c3097efb42e74cd135865d6d6e798326b03fa55"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"dc6d201056f25f3a65550d36c7058c00ce95ea24","unresolved":true,"context_lines":[{"line_number":17,"context_line":"import itertools"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def plan_network(network_trait,"},{"line_number":21,"context_line":"                 node_uuid,"},{"line_number":22,"context_line":"                 node_ports,"},{"line_number":23,"context_line":"                 node_portgroups,"},{"line_number":24,"context_line":"                 node_networks):"},{"line_number":25,"context_line":"    rendered_actions \u003d []"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # Order ports and portgroups by UUID."}],"source_content_type":"text/x-python","patch_set":11,"id":"b9bdb05c_afc0435d","line":24,"range":{"start_line":20,"start_character":31,"end_line":24,"end_character":32},"updated":"2025-11-25 21:46:14.000000000","message":"```suggestion\ndef plan_network(network_trait: base.NetworkTrait,\n                 node_uuid: str,\n                 node_ports: list[port.Port],\n                 node_portgroups: list[portgroup.Portgroup],\n                 node_networks: list[base.Network]) -\u003e list[base.RenderedAction]:\n```\n\nI think this would go a long way to helping this be readable to our future selves.","commit_id":"5c3097efb42e74cd135865d6d6e798326b03fa55"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"c809fc3220eb164339c271b56568b14645c6239c","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import itertools"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def plan_network(network_trait,"},{"line_number":21,"context_line":"                 node_uuid,"},{"line_number":22,"context_line":"                 node_ports,"},{"line_number":23,"context_line":"                 node_portgroups,"},{"line_number":24,"context_line":"                 node_networks):"},{"line_number":25,"context_line":"    rendered_actions \u003d []"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # Order ports and portgroups by UUID."}],"source_content_type":"text/x-python","patch_set":11,"id":"2ee3a3f4_d38e7a3a","line":24,"range":{"start_line":20,"start_character":31,"end_line":24,"end_character":32},"in_reply_to":"b9bdb05c_afc0435d","updated":"2025-12-01 21:28:50.000000000","message":"Done","commit_id":"5c3097efb42e74cd135865d6d6e798326b03fa55"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"dc6d201056f25f3a65550d36c7058c00ce95ea24","unresolved":true,"context_lines":[{"line_number":24,"context_line":"                 node_networks):"},{"line_number":25,"context_line":"    rendered_actions \u003d []"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # Order ports and portgroups by UUID."},{"line_number":28,"context_line":"    # TODO(clif) Is this OK? Should this be configurable?"},{"line_number":29,"context_line":"    node_ports.sort(key\u003dlambda port: port.id, reverse\u003dTrue)"},{"line_number":30,"context_line":"    node_portgroups.sort(key\u003dlambda portgroup: portgroup.id, reverse\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"35766458_b317eaf1","line":27,"updated":"2025-11-25 21:46:14.000000000","message":"```suggestion\n    # Order ports and portgroups by newest to oldest creation.\n```","commit_id":"5c3097efb42e74cd135865d6d6e798326b03fa55"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"c809fc3220eb164339c271b56568b14645c6239c","unresolved":false,"context_lines":[{"line_number":24,"context_line":"                 node_networks):"},{"line_number":25,"context_line":"    rendered_actions \u003d []"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # Order ports and portgroups by UUID."},{"line_number":28,"context_line":"    # TODO(clif) Is this OK? Should this be configurable?"},{"line_number":29,"context_line":"    node_ports.sort(key\u003dlambda port: port.id, reverse\u003dTrue)"},{"line_number":30,"context_line":"    node_portgroups.sort(key\u003dlambda portgroup: portgroup.id, reverse\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1c72ffc9_cb2b0625","line":27,"in_reply_to":"35766458_b317eaf1","updated":"2025-12-01 21:28:50.000000000","message":"Done","commit_id":"5c3097efb42e74cd135865d6d6e798326b03fa55"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"dc6d201056f25f3a65550d36c7058c00ce95ea24","unresolved":true,"context_lines":[{"line_number":57,"context_line":"    return rendered_actions"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def plan_attach_portlike(trait_action, node_uuid, node_portlikes,"},{"line_number":61,"context_line":"                         node_networks, type_name, action_func):"},{"line_number":62,"context_line":"    actions \u003d []"},{"line_number":63,"context_line":"    for (portlike, network) in itertools.product(node_portlikes,"},{"line_number":64,"context_line":"                                                 node_networks):"}],"source_content_type":"text/x-python","patch_set":11,"id":"b55f7d04_6b964e82","line":61,"range":{"start_line":60,"start_character":14,"end_line":61,"end_character":14},"updated":"2025-11-25 21:46:14.000000000","message":"```suggestion\ndef plan_attach_portlike(trait_action: base.TraitAction,\n                         node_uuid: str,\n                         node_portlikes: list[base.Port],\n                         node_networks: list[base.Network],\n                         type_name: str,\n                         action_func):\n```","commit_id":"5c3097efb42e74cd135865d6d6e798326b03fa55"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"c809fc3220eb164339c271b56568b14645c6239c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    return rendered_actions"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def plan_attach_portlike(trait_action, node_uuid, node_portlikes,"},{"line_number":61,"context_line":"                         node_networks, type_name, action_func):"},{"line_number":62,"context_line":"    actions \u003d []"},{"line_number":63,"context_line":"    for (portlike, network) in itertools.product(node_portlikes,"},{"line_number":64,"context_line":"                                                 node_networks):"}],"source_content_type":"text/x-python","patch_set":11,"id":"630eeb16_96ebf436","line":61,"range":{"start_line":60,"start_character":14,"end_line":61,"end_character":14},"in_reply_to":"b55f7d04_6b964e82","updated":"2025-12-01 21:28:50.000000000","message":"Done","commit_id":"5c3097efb42e74cd135865d6d6e798326b03fa55"},{"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":"0f43bdae4f1f5b27e9c2f0dc1152bfca36e084e8","unresolved":true,"context_lines":[{"line_number":27,"context_line":"    rendered_actions \u003d []"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    # Order ports and portgroups by ID, newest first."},{"line_number":30,"context_line":"    # TODO(clif) Is this OK? Should this be configurable?"},{"line_number":31,"context_line":"    node_ports.sort(key\u003dlambda port: port.id, reverse\u003dTrue)"},{"line_number":32,"context_line":"    node_portgroups.sort(key\u003dlambda portgroup: portgroup.id, reverse\u003dTrue)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"0ec43950_28afea60","line":30,"updated":"2025-12-01 22:05:20.000000000","message":"This comment seems old after discussion now, and the explanation in the line above.","commit_id":"3a1ea191985271d441aa2398a27585cea7c8e8bf"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"6c357ba11f97beada63273e7c289e73ea74869d1","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    rendered_actions \u003d []"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    # Order ports and portgroups by ID, newest first."},{"line_number":30,"context_line":"    # TODO(clif) Is this OK? Should this be configurable?"},{"line_number":31,"context_line":"    node_ports.sort(key\u003dlambda port: port.id, reverse\u003dTrue)"},{"line_number":32,"context_line":"    node_portgroups.sort(key\u003dlambda portgroup: portgroup.id, reverse\u003dTrue)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"c10880db_03b65447","line":30,"in_reply_to":"0ec43950_28afea60","updated":"2025-12-01 22:25:23.000000000","message":"Done","commit_id":"3a1ea191985271d441aa2398a27585cea7c8e8bf"},{"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":"3e2f09e28f4c94cca833e6d80b6a028ce0a6b152","unresolved":true,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from ironic.common.i18n import _"},{"line_number":15,"context_line":"import ironic.common.trait_based_networking.base as base"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from collections.abc import Callable"},{"line_number":18,"context_line":"import itertools"}],"source_content_type":"text/x-python","patch_set":13,"id":"212a695d_edb5c4b6","line":15,"updated":"2025-12-03 23:44:08.000000000","message":"This import is a bit strange; I\u0027m used to seeing `from ironic.common.trait_based_networking import base` for this type of import.","commit_id":"b1d37e11090be09786491da5d6b45756e851c900"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"774b82a9dbb78c9c849d46eb6fd9da3fb581bcbc","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from ironic.common.i18n import _"},{"line_number":15,"context_line":"import ironic.common.trait_based_networking.base as base"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from collections.abc import Callable"},{"line_number":18,"context_line":"import itertools"}],"source_content_type":"text/x-python","patch_set":13,"id":"1733dbf1_f51ba347","line":15,"in_reply_to":"212a695d_edb5c4b6","updated":"2025-12-04 18:31:01.000000000","message":"Done","commit_id":"b1d37e11090be09786491da5d6b45756e851c900"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"0a9a51ecfb2da459d99ed28c87e0ea56b85bbb6a","unresolved":true,"context_lines":[{"line_number":87,"context_line":"                             _(f\"No ({type_name}, network) pairs matched \""},{"line_number":88,"context_line":"                               \"rule.\"))]"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    if (trait_action.min_count is not None"},{"line_number":91,"context_line":"        and len(actions) \u003c trait_action.min_count):"},{"line_number":92,"context_line":"        return [base.NoMatch(trait_action,"},{"line_number":93,"context_line":"                             node_uuid,"}],"source_content_type":"text/x-python","patch_set":13,"id":"f00bd35e_0b73aa5d","line":90,"range":{"start_line":90,"start_character":8,"end_line":90,"end_character":30},"updated":"2025-12-02 16:12:50.000000000","message":"Is the default value of min_count None or 0?","commit_id":"b1d37e11090be09786491da5d6b45756e851c900"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"774b82a9dbb78c9c849d46eb6fd9da3fb581bcbc","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                             _(f\"No ({type_name}, network) pairs matched \""},{"line_number":88,"context_line":"                               \"rule.\"))]"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    if (trait_action.min_count is not None"},{"line_number":91,"context_line":"        and len(actions) \u003c trait_action.min_count):"},{"line_number":92,"context_line":"        return [base.NoMatch(trait_action,"},{"line_number":93,"context_line":"                             node_uuid,"}],"source_content_type":"text/x-python","patch_set":13,"id":"08bbc5ef_fc467244","line":90,"range":{"start_line":90,"start_character":8,"end_line":90,"end_character":30},"in_reply_to":"2682764f_be05a436","updated":"2025-12-04 18:31:01.000000000","message":"It\u0027s `None` unless set.","commit_id":"b1d37e11090be09786491da5d6b45756e851c900"},{"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":"3e2f09e28f4c94cca833e6d80b6a028ce0a6b152","unresolved":true,"context_lines":[{"line_number":87,"context_line":"                             _(f\"No ({type_name}, network) pairs matched \""},{"line_number":88,"context_line":"                               \"rule.\"))]"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    if (trait_action.min_count is not None"},{"line_number":91,"context_line":"        and len(actions) \u003c trait_action.min_count):"},{"line_number":92,"context_line":"        return [base.NoMatch(trait_action,"},{"line_number":93,"context_line":"                             node_uuid,"}],"source_content_type":"text/x-python","patch_set":13,"id":"2682764f_be05a436","line":90,"range":{"start_line":90,"start_character":8,"end_line":90,"end_character":30},"in_reply_to":"f00bd35e_0b73aa5d","updated":"2025-12-03 23:44:08.000000000","message":"I *think* it should be none; we don\u0027t require a min_count.","commit_id":"b1d37e11090be09786491da5d6b45756e851c900"}],"ironic/tests/unit/common/trait_based_networking/test_plan.py":[{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"dc6d201056f25f3a65550d36c7058c00ce95ea24","unresolved":true,"context_lines":[{"line_number":268,"context_line":"            node_networks: list"},{"line_number":269,"context_line":"            expected_actions: list[tbn_base.RenderedAction]"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        subtests \u003d ["},{"line_number":272,"context_line":"            SubTestCase("},{"line_number":273,"context_line":"                \"Attach one port\","},{"line_number":274,"context_line":"                tbn_base.NetworkTrait("}],"source_content_type":"text/x-python","patch_set":11,"id":"93b4f5eb_9d266c71","line":271,"updated":"2025-11-25 21:46:14.000000000","message":"Please use `ddt`... https://ddt.readthedocs.io/en/latest/example.html","commit_id":"5c3097efb42e74cd135865d6d6e798326b03fa55"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"c809fc3220eb164339c271b56568b14645c6239c","unresolved":false,"context_lines":[{"line_number":268,"context_line":"            node_networks: list"},{"line_number":269,"context_line":"            expected_actions: list[tbn_base.RenderedAction]"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        subtests \u003d ["},{"line_number":272,"context_line":"            SubTestCase("},{"line_number":273,"context_line":"                \"Attach one port\","},{"line_number":274,"context_line":"                tbn_base.NetworkTrait("}],"source_content_type":"text/x-python","patch_set":11,"id":"547aa625_3ca227ba","line":271,"in_reply_to":"93b4f5eb_9d266c71","updated":"2025-12-01 21:28:50.000000000","message":"Done","commit_id":"5c3097efb42e74cd135865d6d6e798326b03fa55"}]}
