)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":35345,"name":"Grzegorz Koper","email":"grzegorzk@stackhpc.com","username":"gkoper"},"change_message_id":"5136c8d733e2f78b2abbf99fb767bb03a4e85c47","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"9472b46e_36476ad6","updated":"2026-04-27 09:23:37.000000000","message":"I\u0027ve trimmed down unit tests substantially. A lot of them where artifacts of TDD and we\u0027re too much for upstream purposes in my opinion.\nOpened to discussion if this needs more trimming.","commit_id":"d283e94fb13b486960ec0022b9c23a9f18edf446"},{"author":{"_account_id":35345,"name":"Grzegorz Koper","email":"grzegorzk@stackhpc.com","username":"gkoper"},"change_message_id":"b2f79cdb479583763df5eee02ee4f68626648f91","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"1de566eb_a340e4e5","in_reply_to":"0099ba0f_3529ad6c","updated":"2026-04-27 10:24:31.000000000","message":"As soon as I executed git review, I\u0027ve asked myself the same question. Agreed\nReverted the cleanup, I will create a follow up change.","commit_id":"d283e94fb13b486960ec0022b9c23a9f18edf446"},{"author":{"_account_id":28048,"name":"Will Szumski","email":"will@stackhpc.com","username":"jovial"},"change_message_id":"bc717d07952aa2a4c3570ee6bc4f781007409d82","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"0099ba0f_3529ad6c","in_reply_to":"9472b46e_36476ad6","updated":"2026-04-27 09:50:35.000000000","message":"Sounds reasonable - would it possible to extract the cleanup into a separate patch?","commit_id":"d283e94fb13b486960ec0022b9c23a9f18edf446"},{"author":{"_account_id":28048,"name":"Will Szumski","email":"will@stackhpc.com","username":"jovial"},"change_message_id":"e5bb5dfa1ff208f519ec6810d90a4b8bc1e01adc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"102452b2_cfb7dc11","updated":"2026-04-27 11:31:03.000000000","message":"Overall, looks nice to me. Will wait for CI result for +2.","commit_id":"2abe633b7618047b5787e7639217ef4139d22042"},{"author":{"_account_id":28048,"name":"Will Szumski","email":"will@stackhpc.com","username":"jovial"},"change_message_id":"042c2ad42794cc5ded730b899bb464faf6369253","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"01759f97_be85e886","updated":"2026-04-27 13:49:40.000000000","message":"Mostly looks good. A few small nits with function names now that it has been refactored a bit.","commit_id":"8912c500d0654d5b268e481cf8c4f6dab67ae1a9"},{"author":{"_account_id":35345,"name":"Grzegorz Koper","email":"grzegorzk@stackhpc.com","username":"gkoper"},"change_message_id":"4781945d5ce960344e62f26b86c3389c0dd2954a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"153e5f99_e7bdd215","in_reply_to":"01759f97_be85e886","updated":"2026-04-27 14:24:09.000000000","message":"Thanks, good catches!","commit_id":"8912c500d0654d5b268e481cf8c4f6dab67ae1a9"},{"author":{"_account_id":28048,"name":"Will Szumski","email":"will@stackhpc.com","username":"jovial"},"change_message_id":"e6b9b2916dc3ba3423b6f80083f8a87793c5564a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"d953f5f7_f0b8f82c","updated":"2026-04-27 14:43:05.000000000","message":"LGTM","commit_id":"40fca0f7c415247c06f5f05954297b78143bb156"}],"doc/source/configuration/reference/network.rst":[{"author":{"_account_id":28048,"name":"Will Szumski","email":"will@stackhpc.com","username":"jovial"},"change_message_id":"beac218afef8da01014a3c42973c1d7850e5da81","unresolved":true,"context_lines":[{"line_number":615,"context_line":"       ``ingress_qos_map`` is only supported with"},{"line_number":616,"context_line":"       ``network_engine: nmstate`` on VLAN interfaces."},{"line_number":617,"context_line":""},{"line_number":618,"context_line":"    VLAN ingress QoS map configuration. This maps VLAN header priority to Linux"},{"line_number":619,"context_line":"    internal packet priority for incoming packets."},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"    Accepted formats:"}],"source_content_type":"text/x-rst","patch_set":1,"id":"41788cdc_a02c5839","line":618,"range":{"start_line":618,"start_character":50,"end_line":618,"end_character":70},"updated":"2026-04-24 11:15:42.000000000","message":"Might be worth mentioning this is also known as Priority Code Point (PCP)?","commit_id":"07614257074e7622f2a90c3c74ba446bd47d02ee"},{"author":{"_account_id":35345,"name":"Grzegorz Koper","email":"grzegorzk@stackhpc.com","username":"gkoper"},"change_message_id":"a25abaf69fd45638817b37565384496220a96817","unresolved":false,"context_lines":[{"line_number":615,"context_line":"       ``ingress_qos_map`` is only supported with"},{"line_number":616,"context_line":"       ``network_engine: nmstate`` on VLAN interfaces."},{"line_number":617,"context_line":""},{"line_number":618,"context_line":"    VLAN ingress QoS map configuration. This maps VLAN header priority to Linux"},{"line_number":619,"context_line":"    internal packet priority for incoming packets."},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"    Accepted formats:"}],"source_content_type":"text/x-rst","patch_set":1,"id":"a43f8430_4845721b","line":618,"range":{"start_line":618,"start_character":50,"end_line":618,"end_character":70},"in_reply_to":"41788cdc_a02c5839","updated":"2026-04-24 22:21:06.000000000","message":"Done","commit_id":"07614257074e7622f2a90c3c74ba446bd47d02ee"},{"author":{"_account_id":28048,"name":"Will Szumski","email":"will@stackhpc.com","username":"jovial"},"change_message_id":"4aa48c136f1b6aeac948d091c8dce0da2cacfd9b","unresolved":true,"context_lines":[{"line_number":620,"context_line":""},{"line_number":621,"context_line":"    Accepted formats:"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"    - String: ``\"7:254,3:12\"``"},{"line_number":624,"context_line":"    - Structured list: ``[{from: 7, to: 254}, {from: 3, to: 12}]``"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    The existing ``ingress_priority_map`` attribute, used by the ifcfg engine,"}],"source_content_type":"text/x-rst","patch_set":1,"id":"194ead11_f4512bf9","line":623,"updated":"2026-04-24 10:19:47.000000000","message":"Why do we support two formats for a new variable? Should we just use the dictionary form since that is more flexible?","commit_id":"07614257074e7622f2a90c3c74ba446bd47d02ee"},{"author":{"_account_id":35345,"name":"Grzegorz Koper","email":"grzegorzk@stackhpc.com","username":"gkoper"},"change_message_id":"a25abaf69fd45638817b37565384496220a96817","unresolved":false,"context_lines":[{"line_number":620,"context_line":""},{"line_number":621,"context_line":"    Accepted formats:"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"    - String: ``\"7:254,3:12\"``"},{"line_number":624,"context_line":"    - Structured list: ``[{from: 7, to: 254}, {from: 3, to: 12}]``"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    The existing ``ingress_priority_map`` attribute, used by the ifcfg engine,"}],"source_content_type":"text/x-rst","patch_set":1,"id":"b5a3bb5e_680d9fcb","line":623,"in_reply_to":"194ead11_f4512bf9","updated":"2026-04-24 22:21:06.000000000","message":"This was intended for full backwards compatibility with Rigart role, but somehow I\u0027ve missed that was not implemented in Kayobe at all 😀\n\nLeft only structured list format","commit_id":"07614257074e7622f2a90c3c74ba446bd47d02ee"},{"author":{"_account_id":28048,"name":"Will Szumski","email":"will@stackhpc.com","username":"jovial"},"change_message_id":"beac218afef8da01014a3c42973c1d7850e5da81","unresolved":true,"context_lines":[{"line_number":623,"context_line":"    - String: ``\"7:254,3:12\"``"},{"line_number":624,"context_line":"    - Structured list: ``[{from: 7, to: 254}, {from: 3, to: 12}]``"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    The existing ``ingress_priority_map`` attribute, used by the ifcfg engine,"},{"line_number":627,"context_line":"    is also accepted by the nmstate renderer."},{"line_number":628,"context_line":"``egress_qos_map``"},{"line_number":629,"context_line":"    .. note::"}],"source_content_type":"text/x-rst","patch_set":1,"id":"56758433_485fd9af","line":626,"updated":"2026-04-24 11:15:42.000000000","message":"I might be being dumb, but I can\u0027t find where we expose this in kayobe. I see it in the role:\n\nhttps://github.com/michaelrigart/ansible-role-interfaces/blob/9f261a00187793406ce270e90c904c5b1b1630c6/templates/ethernet_nmconnection.j2#L38-L43\n\nCould you point me in the right direction?","commit_id":"07614257074e7622f2a90c3c74ba446bd47d02ee"},{"author":{"_account_id":35345,"name":"Grzegorz Koper","email":"grzegorzk@stackhpc.com","username":"gkoper"},"change_message_id":"a25abaf69fd45638817b37565384496220a96817","unresolved":false,"context_lines":[{"line_number":623,"context_line":"    - String: ``\"7:254,3:12\"``"},{"line_number":624,"context_line":"    - Structured list: ``[{from: 7, to: 254}, {from: 3, to: 12}]``"},{"line_number":625,"context_line":""},{"line_number":626,"context_line":"    The existing ``ingress_priority_map`` attribute, used by the ifcfg engine,"},{"line_number":627,"context_line":"    is also accepted by the nmstate renderer."},{"line_number":628,"context_line":"``egress_qos_map``"},{"line_number":629,"context_line":"    .. note::"}],"source_content_type":"text/x-rst","patch_set":1,"id":"452792d5_bf549687","line":626,"in_reply_to":"56758433_485fd9af","updated":"2026-04-24 22:21:06.000000000","message":"That was exactly why the string format was added, to support existing ingress_priority_map and egress_priority_map, but as you noticed it was not exposed in Kayobe","commit_id":"07614257074e7622f2a90c3c74ba446bd47d02ee"}],"kayobe/plugins/filter/nmstate.py":[{"author":{"_account_id":28048,"name":"Will Szumski","email":"will@stackhpc.com","username":"jovial"},"change_message_id":"e5bb5dfa1ff208f519ec6810d90a4b8bc1e01adc","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    \u0027rx\u0027, \u0027tx\u0027, \u0027rx-max\u0027, \u0027tx-max\u0027, \u0027rx-jumbo\u0027, \u0027rx-mini\u0027"},{"line_number":66,"context_line":"}"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"MAX_U32 \u003d 2**32 - 1"},{"line_number":69,"context_line":"MAX_VLAN_PRIORITY \u003d 7"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"197eda36_743379f8","line":68,"updated":"2026-04-27 11:31:03.000000000","message":"note to self: sk_prio is a 32 bit int in kernel land","commit_id":"2abe633b7618047b5787e7639217ef4139d22042"},{"author":{"_account_id":28048,"name":"Will Szumski","email":"will@stackhpc.com","username":"jovial"},"change_message_id":"e5bb5dfa1ff208f519ec6810d90a4b8bc1e01adc","unresolved":true,"context_lines":[{"line_number":303,"context_line":"        parsed \u003d value"},{"line_number":304,"context_line":"    else:"},{"line_number":305,"context_line":"        try:"},{"line_number":306,"context_line":"            parsed \u003d int(value)"},{"line_number":307,"context_line":"        except ValueError:"},{"line_number":308,"context_line":"            raise ValueError("},{"line_number":309,"context_line":"                f\"Network \u0027{network_name}\u0027 has invalid {direction} QoS map \""}],"source_content_type":"text/x-python","patch_set":5,"id":"eaddb6b6_3995cab1","line":306,"updated":"2026-04-27 11:31:03.000000000","message":"nit: Its probably OK to only accept ints here and just raise an error if we get a string, but not a deal breaker.","commit_id":"2abe633b7618047b5787e7639217ef4139d22042"},{"author":{"_account_id":35345,"name":"Grzegorz Koper","email":"grzegorzk@stackhpc.com","username":"gkoper"},"change_message_id":"8f6c84305fe989c86533507f182d3f8612ae612e","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        parsed \u003d value"},{"line_number":304,"context_line":"    else:"},{"line_number":305,"context_line":"        try:"},{"line_number":306,"context_line":"            parsed \u003d int(value)"},{"line_number":307,"context_line":"        except ValueError:"},{"line_number":308,"context_line":"            raise ValueError("},{"line_number":309,"context_line":"                f\"Network \u0027{network_name}\u0027 has invalid {direction} QoS map \""}],"source_content_type":"text/x-python","patch_set":5,"id":"51f28616_e816d188","line":306,"in_reply_to":"eaddb6b6_3995cab1","updated":"2026-04-27 11:47:49.000000000","message":"Done","commit_id":"2abe633b7618047b5787e7639217ef4139d22042"},{"author":{"_account_id":28048,"name":"Will Szumski","email":"will@stackhpc.com","username":"jovial"},"change_message_id":"042c2ad42794cc5ded730b899bb464faf6369253","unresolved":true,"context_lines":[{"line_number":293,"context_line":"    return bond_options"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"def _parse_vlan_qos_map_int(value, network_name, direction, field):"},{"line_number":297,"context_line":"    if isinstance(value, bool) or not isinstance(value, int):"},{"line_number":298,"context_line":"        raise ValueError("},{"line_number":299,"context_line":"            f\"Network \u0027{network_name}\u0027 has invalid {direction} QoS map \""}],"source_content_type":"text/x-python","patch_set":7,"id":"4930160e_5d54c88d","line":296,"range":{"start_line":296,"start_character":4,"end_line":296,"end_character":28},"updated":"2026-04-27 13:49:40.000000000","message":"Performs validation rather than parsing these days. Rename to reflect new behavior.","commit_id":"8912c500d0654d5b268e481cf8c4f6dab67ae1a9"},{"author":{"_account_id":35345,"name":"Grzegorz Koper","email":"grzegorzk@stackhpc.com","username":"gkoper"},"change_message_id":"e45337df15d870a49b33cf2057a0adff50bf82a4","unresolved":false,"context_lines":[{"line_number":293,"context_line":"    return bond_options"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"def _parse_vlan_qos_map_int(value, network_name, direction, field):"},{"line_number":297,"context_line":"    if isinstance(value, bool) or not isinstance(value, int):"},{"line_number":298,"context_line":"        raise ValueError("},{"line_number":299,"context_line":"            f\"Network \u0027{network_name}\u0027 has invalid {direction} QoS map \""}],"source_content_type":"text/x-python","patch_set":7,"id":"7959fa54_f674babe","line":296,"range":{"start_line":296,"start_character":4,"end_line":296,"end_character":28},"in_reply_to":"4930160e_5d54c88d","updated":"2026-04-27 14:19:26.000000000","message":"Done","commit_id":"8912c500d0654d5b268e481cf8c4f6dab67ae1a9"},{"author":{"_account_id":28048,"name":"Will Szumski","email":"will@stackhpc.com","username":"jovial"},"change_message_id":"042c2ad42794cc5ded730b899bb464faf6369253","unresolved":true,"context_lines":[{"line_number":299,"context_line":"            f\"Network \u0027{network_name}\u0027 has invalid {direction} QoS map \""},{"line_number":300,"context_line":"            f\"\u0027{field}\u0027 value \u0027{value}\u0027. Expected an integer.\")"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    parsed \u003d value"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    if parsed \u003c 0 or parsed \u003e MAX_U32:"},{"line_number":305,"context_line":"        raise ValueError("}],"source_content_type":"text/x-python","patch_set":7,"id":"3392a662_6f7a3f1d","line":302,"range":{"start_line":302,"start_character":3,"end_line":302,"end_character":18},"updated":"2026-04-27 13:49:40.000000000","message":"Might as well remove this and just use value in checks","commit_id":"8912c500d0654d5b268e481cf8c4f6dab67ae1a9"},{"author":{"_account_id":35345,"name":"Grzegorz Koper","email":"grzegorzk@stackhpc.com","username":"gkoper"},"change_message_id":"e45337df15d870a49b33cf2057a0adff50bf82a4","unresolved":false,"context_lines":[{"line_number":299,"context_line":"            f\"Network \u0027{network_name}\u0027 has invalid {direction} QoS map \""},{"line_number":300,"context_line":"            f\"\u0027{field}\u0027 value \u0027{value}\u0027. Expected an integer.\")"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    parsed \u003d value"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    if parsed \u003c 0 or parsed \u003e MAX_U32:"},{"line_number":305,"context_line":"        raise ValueError("}],"source_content_type":"text/x-python","patch_set":7,"id":"52992b6f_3b09c89f","line":302,"range":{"start_line":302,"start_character":3,"end_line":302,"end_character":18},"in_reply_to":"3392a662_6f7a3f1d","updated":"2026-04-27 14:19:26.000000000","message":"Done","commit_id":"8912c500d0654d5b268e481cf8c4f6dab67ae1a9"},{"author":{"_account_id":28048,"name":"Will Szumski","email":"will@stackhpc.com","username":"jovial"},"change_message_id":"042c2ad42794cc5ded730b899bb464faf6369253","unresolved":true,"context_lines":[{"line_number":324,"context_line":"    return parsed"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"def _parse_vlan_qos_map_entry(entry, network_name, direction):"},{"line_number":328,"context_line":"    if not isinstance(entry, dict):"},{"line_number":329,"context_line":"        raise ValueError("},{"line_number":330,"context_line":"            f\"Network \u0027{network_name}\u0027 has invalid {direction} QoS map \""}],"source_content_type":"text/x-python","patch_set":7,"id":"e0149f3e_5cf599dd","line":327,"range":{"start_line":327,"start_character":5,"end_line":327,"end_character":10},"updated":"2026-04-27 13:49:40.000000000","message":"similarly, doesn\u0027t really parse anything. Maybe _validate_vlan_qos_map_entry?","commit_id":"8912c500d0654d5b268e481cf8c4f6dab67ae1a9"},{"author":{"_account_id":35345,"name":"Grzegorz Koper","email":"grzegorzk@stackhpc.com","username":"gkoper"},"change_message_id":"e45337df15d870a49b33cf2057a0adff50bf82a4","unresolved":false,"context_lines":[{"line_number":324,"context_line":"    return parsed"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"def _parse_vlan_qos_map_entry(entry, network_name, direction):"},{"line_number":328,"context_line":"    if not isinstance(entry, dict):"},{"line_number":329,"context_line":"        raise ValueError("},{"line_number":330,"context_line":"            f\"Network \u0027{network_name}\u0027 has invalid {direction} QoS map \""}],"source_content_type":"text/x-python","patch_set":7,"id":"9711d055_0eb9e2ad","line":327,"range":{"start_line":327,"start_character":5,"end_line":327,"end_character":10},"in_reply_to":"e0149f3e_5cf599dd","updated":"2026-04-27 14:19:26.000000000","message":"Done","commit_id":"8912c500d0654d5b268e481cf8c4f6dab67ae1a9"},{"author":{"_account_id":28048,"name":"Will Szumski","email":"will@stackhpc.com","username":"jovial"},"change_message_id":"042c2ad42794cc5ded730b899bb464faf6369253","unresolved":true,"context_lines":[{"line_number":343,"context_line":"    }"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"def _normalize_vlan_qos_map(raw_map, network_name, direction):"},{"line_number":347,"context_line":"    if raw_map is None:"},{"line_number":348,"context_line":"        return None"},{"line_number":349,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"a924abf4_1c510f0f","line":346,"range":{"start_line":346,"start_character":5,"end_line":346,"end_character":14},"updated":"2026-04-27 13:49:40.000000000","message":"more validation than normalization now that we have have made it so that is only takes a list of dicts.","commit_id":"8912c500d0654d5b268e481cf8c4f6dab67ae1a9"},{"author":{"_account_id":35345,"name":"Grzegorz Koper","email":"grzegorzk@stackhpc.com","username":"gkoper"},"change_message_id":"e45337df15d870a49b33cf2057a0adff50bf82a4","unresolved":false,"context_lines":[{"line_number":343,"context_line":"    }"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"def _normalize_vlan_qos_map(raw_map, network_name, direction):"},{"line_number":347,"context_line":"    if raw_map is None:"},{"line_number":348,"context_line":"        return None"},{"line_number":349,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"58de1a72_d1f5f320","line":346,"range":{"start_line":346,"start_character":5,"end_line":346,"end_character":14},"in_reply_to":"a924abf4_1c510f0f","updated":"2026-04-27 14:19:26.000000000","message":"Done","commit_id":"8912c500d0654d5b268e481cf8c4f6dab67ae1a9"}]}
