)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"5ac00308685c9dda8d4ab513f0e01f2c1d8b35c5","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Adds attributes for IPs for Ethernet Interfaces."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This commits adds the attributes for the Ethernet Interfaces for"},{"line_number":10,"context_line":"the System and Manager objects."},{"line_number":11,"context_line":"This change will be useful for comparing, and checking existence"},{"line_number":12,"context_line":"of different versions of IP addresses."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"8b9d8d2d_9f119bc9","line":9,"updated":"2024-10-11 08:56:08.000000000","message":"would be \"commit\" by you can omit that as it\u0027s implicit, just start with \"Adding\"","commit_id":"10ebb245c696bef46e3aa06c3c39b7f03998cdf4"},{"author":{"_account_id":36802,"name":"Kamil Gustab","display_name":"Kamil Gustab","email":"kgustab@redhat.com","username":"kgustab"},"change_message_id":"545bcf73ab354cb7f5e61fefd8695848c091cf2b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Adds attributes for IPs for Ethernet Interfaces."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This commits adds the attributes for the Ethernet Interfaces for"},{"line_number":10,"context_line":"the System and Manager objects."},{"line_number":11,"context_line":"This change will be useful for comparing, and checking existence"},{"line_number":12,"context_line":"of different versions of IP addresses."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"91362596_7959a1fe","line":9,"in_reply_to":"8b9d8d2d_9f119bc9","updated":"2024-11-21 11:18:58.000000000","message":"Done","commit_id":"10ebb245c696bef46e3aa06c3c39b7f03998cdf4"}],"/PATCHSET_LEVEL":[{"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":"28de24a63e72fd439f0a9dc3a184a06744c01517","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"19d7ecce_4836605e","updated":"2024-09-28 20:23:22.000000000","message":"Actually, one thing, please add a release note: https://docs.openstack.org/project-team-guide/release-management.html#how-to-add-new-release-notes","commit_id":"4506cca4b660c1319b90a5c3dc83b601a0718839"},{"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":"24b294d0a31a2cff75df8db405ca8cc46d7359cc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c16ebb55_63d3aafb","updated":"2024-09-28 20:21:40.000000000","message":"Code looks reasonable to me. I\u0027m assuming this behaves sensibly when the attribute is missing/invalid.","commit_id":"4506cca4b660c1319b90a5c3dc83b601a0718839"},{"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":"ee581a7880c80fca5f28c4ba822b6b3f2d37ca57","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"d0269cc8_e38f33f7","updated":"2024-09-28 20:20:27.000000000","message":"Just as a note, this repository generally uses https://bugs.launchpad.net/sushy for bug/feature tracking these days. Can you let me know what pointed you at the storyboard so I can make sure that gets updated?\n\nAs far as I\u0027m concerned, don\u0027t worry about putting in a bug in LP for my sake, but just letting you know for the future.\n\nThanks!\n\n\nThis is not a complete review (yet)","commit_id":"4506cca4b660c1319b90a5c3dc83b601a0718839"},{"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":"0101c958c9ed334a216b8c4e74fae145e5acb8fa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"abc27923_de869839","in_reply_to":"8a58e935_37a38bb8","updated":"2024-09-30 20:15:51.000000000","message":"Aha, thank you, I\u0027ll update that immediately","commit_id":"4506cca4b660c1319b90a5c3dc83b601a0718839"},{"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":"747ea77104ee75fa83803fdcedd8d721eee4b56a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"f856ab2d_2d75b586","in_reply_to":"abc27923_de869839","updated":"2024-09-30 20:25:23.000000000","message":"https://review.opendev.org/c/openstack/sushy/+/930946","commit_id":"4506cca4b660c1319b90a5c3dc83b601a0718839"},{"author":{"_account_id":36802,"name":"Kamil Gustab","display_name":"Kamil Gustab","email":"kgustab@redhat.com","username":"kgustab"},"change_message_id":"cb196e8c06c9664e6b81ec645cb77a1b30c11af1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"8a58e935_37a38bb8","in_reply_to":"d0269cc8_e38f33f7","updated":"2024-09-30 20:03:31.000000000","message":"Hi, I created the story some time ago, but I think I found that here: \nhttps://docs.openstack.org/sushy/latest/contributor/index.html\n\nThe third link points to the storyboard.\n\nAlso - thank you for letting me know, will try to use LP next time.","commit_id":"4506cca4b660c1319b90a5c3dc83b601a0718839"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"8ca00417967ad5ce9bf89a17a70d9d3d190b3ee0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"064fed93_9ded9725","updated":"2024-09-30 14:52:40.000000000","message":"+1 to Dmitry’s comments","commit_id":"0682c6784e79692dfe8702a9baa63111d0caf439"},{"author":{"_account_id":36802,"name":"Kamil Gustab","display_name":"Kamil Gustab","email":"kgustab@redhat.com","username":"kgustab"},"change_message_id":"545bcf73ab354cb7f5e61fefd8695848c091cf2b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"e1495bcc_65e80e22","updated":"2024-11-21 11:18:58.000000000","message":"Thank you for input, I resolved those messages","commit_id":"10ebb245c696bef46e3aa06c3c39b7f03998cdf4"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"5ac00308685c9dda8d4ab513f0e01f2c1d8b35c5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"36eb06d8_806d20ae","updated":"2024-10-11 08:56:08.000000000","message":"thanks, I left a couple of comments","commit_id":"10ebb245c696bef46e3aa06c3c39b7f03998cdf4"},{"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":"02d7ab092e4aa70abca62104d4d229ad7127268d","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":11,"id":"9d0edf18_362e0749","updated":"2026-01-15 21:13:54.000000000","message":"Removing ironic-week-prio until this patch has movement on the existing feedback.","commit_id":"e43e8364f55ec800838cac30cf7b83ce6b178e1a"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"e57284b2d033a72a80e4cec2ea40403d71d3b32a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"60e91cd0_f517fd25","updated":"2026-01-28 20:22:15.000000000","message":"Thank you for the patch. Some comments inline.","commit_id":"e43e8364f55ec800838cac30cf7b83ce6b178e1a"}],"releasenotes/notes/ethernet-interfaces-ip-attributes-49bcb72a1acab9e6.yaml":[{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"5ac00308685c9dda8d4ab513f0e01f2c1d8b35c5","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds attributes for the `EthernetInterfaces` which handle IPs."},{"line_number":5,"context_line":"    This will be useful when trying to get IPs from Manager instance,"},{"line_number":6,"context_line":"    to check what are assigned IPs, if multiple IPs are assigned, or"},{"line_number":7,"context_line":"    if both IPv4 and IPv6 are being used."},{"line_number":8,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":7,"id":"2426a542_b6fec773","line":5,"updated":"2024-10-11 08:56:08.000000000","message":"use present here \"This is useful\"","commit_id":"10ebb245c696bef46e3aa06c3c39b7f03998cdf4"},{"author":{"_account_id":36802,"name":"Kamil Gustab","display_name":"Kamil Gustab","email":"kgustab@redhat.com","username":"kgustab"},"change_message_id":"545bcf73ab354cb7f5e61fefd8695848c091cf2b","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds attributes for the `EthernetInterfaces` which handle IPs."},{"line_number":5,"context_line":"    This will be useful when trying to get IPs from Manager instance,"},{"line_number":6,"context_line":"    to check what are assigned IPs, if multiple IPs are assigned, or"},{"line_number":7,"context_line":"    if both IPv4 and IPv6 are being used."},{"line_number":8,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":7,"id":"0d175dc1_b678a748","line":5,"in_reply_to":"2426a542_b6fec773","updated":"2024-11-21 11:18:58.000000000","message":"Done","commit_id":"10ebb245c696bef46e3aa06c3c39b7f03998cdf4"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"5ac00308685c9dda8d4ab513f0e01f2c1d8b35c5","unresolved":true,"context_lines":[{"line_number":6,"context_line":"    to check what are assigned IPs, if multiple IPs are assigned, or"},{"line_number":7,"context_line":"    if both IPv4 and IPv6 are being used."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    Also adds `ip_summary` to get those attributes and represent them"},{"line_number":10,"context_line":"    in one simple dictionary."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"4f4cfa7e_ad62d97a","line":9,"updated":"2024-10-11 08:56:08.000000000","message":"not sure if we want to mention an internal python sctructure in a release note, probably a simpler summary is enough","commit_id":"10ebb245c696bef46e3aa06c3c39b7f03998cdf4"},{"author":{"_account_id":36802,"name":"Kamil Gustab","display_name":"Kamil Gustab","email":"kgustab@redhat.com","username":"kgustab"},"change_message_id":"545bcf73ab354cb7f5e61fefd8695848c091cf2b","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    to check what are assigned IPs, if multiple IPs are assigned, or"},{"line_number":7,"context_line":"    if both IPv4 and IPv6 are being used."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    Also adds `ip_summary` to get those attributes and represent them"},{"line_number":10,"context_line":"    in one simple dictionary."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"17d18dbe_f15098d6","line":9,"in_reply_to":"4f4cfa7e_ad62d97a","updated":"2024-11-21 11:18:58.000000000","message":"Done","commit_id":"10ebb245c696bef46e3aa06c3c39b7f03998cdf4"}],"sushy/resources/system/ethernet_interface.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d0f188d961424f22ac410d77ecc3f4126d8518c7","unresolved":true,"context_lines":[{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":"        ip_dict \u003d {}"},{"line_number":77,"context_line":"        for eth in self.get_members():"},{"line_number":78,"context_line":"            for eth in self.get_members():"},{"line_number":79,"context_line":"                if eth.status and eth.status.health \u003d\u003d res_cons.Health.OK:"},{"line_number":80,"context_line":"                    ipv4_addr_list \u003d ["},{"line_number":81,"context_line":"                        addr[\u0027Address\u0027] for addr in eth.ipv4_address or []]"}],"source_content_type":"text/x-python","patch_set":6,"id":"7433f144_9dec4f94","line":78,"updated":"2024-09-30 14:46:13.000000000","message":"Is it intentional that you go over get_members() twice in nested loops?","commit_id":"0682c6784e79692dfe8702a9baa63111d0caf439"},{"author":{"_account_id":36802,"name":"Kamil Gustab","display_name":"Kamil Gustab","email":"kgustab@redhat.com","username":"kgustab"},"change_message_id":"ee229cd175a94c3ff453ea683c64728ecab0a952","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":"        ip_dict \u003d {}"},{"line_number":77,"context_line":"        for eth in self.get_members():"},{"line_number":78,"context_line":"            for eth in self.get_members():"},{"line_number":79,"context_line":"                if eth.status and eth.status.health \u003d\u003d res_cons.Health.OK:"},{"line_number":80,"context_line":"                    ipv4_addr_list \u003d ["},{"line_number":81,"context_line":"                        addr[\u0027Address\u0027] for addr in eth.ipv4_address or []]"}],"source_content_type":"text/x-python","patch_set":6,"id":"d8459f38_c55a5b74","line":78,"in_reply_to":"5057d91d_81bc41d5","updated":"2024-10-02 09:27:53.000000000","message":"This was fixed in most recent patchset","commit_id":"0682c6784e79692dfe8702a9baa63111d0caf439"},{"author":{"_account_id":36802,"name":"Kamil Gustab","display_name":"Kamil Gustab","email":"kgustab@redhat.com","username":"kgustab"},"change_message_id":"cb196e8c06c9664e6b81ec645cb77a1b30c11af1","unresolved":true,"context_lines":[{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":"        ip_dict \u003d {}"},{"line_number":77,"context_line":"        for eth in self.get_members():"},{"line_number":78,"context_line":"            for eth in self.get_members():"},{"line_number":79,"context_line":"                if eth.status and eth.status.health \u003d\u003d res_cons.Health.OK:"},{"line_number":80,"context_line":"                    ipv4_addr_list \u003d ["},{"line_number":81,"context_line":"                        addr[\u0027Address\u0027] for addr in eth.ipv4_address or []]"}],"source_content_type":"text/x-python","patch_set":6,"id":"5057d91d_81bc41d5","line":78,"in_reply_to":"7433f144_9dec4f94","updated":"2024-09-30 20:03:31.000000000","message":"That is definitely not intentional, must have added that by mistake at some point, will fix that along with the other thing, thank you!","commit_id":"0682c6784e79692dfe8702a9baa63111d0caf439"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d0f188d961424f22ac410d77ecc3f4126d8518c7","unresolved":true,"context_lines":[{"line_number":82,"context_line":"                    ipv6_addr_list \u003d ["},{"line_number":83,"context_line":"                        addr[\u0027Address\u0027] for addr in eth.ipv6_address or []]"},{"line_number":84,"context_line":"                    ip_dict[eth.name] \u003d {"},{"line_number":85,"context_line":"                        \u0027ipv4\u0027: ipv4_addr_list, \u0027ipv6\u0027: ipv6_addr_list}"},{"line_number":86,"context_line":"        return ip_dict"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":6,"id":"7ed68a2e_9ce5075b","line":85,"updated":"2024-09-30 14:46:13.000000000","message":"Thought: maybe just provide a list of all unique IP addresses? V4 and V6 are easy to distinguish.\n\nFurther thought: maybe instead of strings, provide a list of IPAddress objects (from stdlib)?","commit_id":"0682c6784e79692dfe8702a9baa63111d0caf439"},{"author":{"_account_id":36802,"name":"Kamil Gustab","display_name":"Kamil Gustab","email":"kgustab@redhat.com","username":"kgustab"},"change_message_id":"cb196e8c06c9664e6b81ec645cb77a1b30c11af1","unresolved":true,"context_lines":[{"line_number":82,"context_line":"                    ipv6_addr_list \u003d ["},{"line_number":83,"context_line":"                        addr[\u0027Address\u0027] for addr in eth.ipv6_address or []]"},{"line_number":84,"context_line":"                    ip_dict[eth.name] \u003d {"},{"line_number":85,"context_line":"                        \u0027ipv4\u0027: ipv4_addr_list, \u0027ipv6\u0027: ipv6_addr_list}"},{"line_number":86,"context_line":"        return ip_dict"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":6,"id":"dd24f63c_73506eef","line":85,"in_reply_to":"60fed2c0_8bedc54e","updated":"2024-09-30 20:03:31.000000000","message":"That does make sense - thank you, I will add this.","commit_id":"0682c6784e79692dfe8702a9baa63111d0caf439"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"8ca00417967ad5ce9bf89a17a70d9d3d190b3ee0","unresolved":true,"context_lines":[{"line_number":82,"context_line":"                    ipv6_addr_list \u003d ["},{"line_number":83,"context_line":"                        addr[\u0027Address\u0027] for addr in eth.ipv6_address or []]"},{"line_number":84,"context_line":"                    ip_dict[eth.name] \u003d {"},{"line_number":85,"context_line":"                        \u0027ipv4\u0027: ipv4_addr_list, \u0027ipv6\u0027: ipv6_addr_list}"},{"line_number":86,"context_line":"        return ip_dict"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":6,"id":"60fed2c0_8bedc54e","line":85,"in_reply_to":"7ed68a2e_9ce5075b","updated":"2024-09-30 14:52:40.000000000","message":"I was thinking the same thing. let’s return a set instead of a list. use https://docs.python.org/3/library/ipaddress.html#ipaddress.IPv4Address and https://docs.python.org/3/library/ipaddress.html#ipaddress.IPv6Address as the return types too","commit_id":"0682c6784e79692dfe8702a9baa63111d0caf439"},{"author":{"_account_id":36802,"name":"Kamil Gustab","display_name":"Kamil Gustab","email":"kgustab@redhat.com","username":"kgustab"},"change_message_id":"ee229cd175a94c3ff453ea683c64728ecab0a952","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                    ipv6_addr_list \u003d ["},{"line_number":83,"context_line":"                        addr[\u0027Address\u0027] for addr in eth.ipv6_address or []]"},{"line_number":84,"context_line":"                    ip_dict[eth.name] \u003d {"},{"line_number":85,"context_line":"                        \u0027ipv4\u0027: ipv4_addr_list, \u0027ipv6\u0027: ipv6_addr_list}"},{"line_number":86,"context_line":"        return ip_dict"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":6,"id":"66862d15_8eba494e","line":85,"in_reply_to":"dd24f63c_73506eef","updated":"2024-10-02 09:27:53.000000000","message":"I implemented this in most recent patchset, I decided to stick with list - using set could lead to edge-case when we have IP conflict in one interface and we wouldn\u0027t see that.","commit_id":"0682c6784e79692dfe8702a9baa63111d0caf439"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0772e95ab05d7d7de2dde4ff5ef9e75fcbb15363","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    mac_address \u003d base.Field(\u0027MACAddress\u0027)"},{"line_number":43,"context_line":"    \"\"\"This is the currently configured MAC address of the interface.\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    ipv4_address \u003d base.Field(\u0027IPv4Addresses\u0027)"},{"line_number":46,"context_line":"    \"\"\"This is the currently used IPv4 address of the interface.\"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    ipv6_address \u003d base.Field(\u0027IPv6Addresses\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"17ff7cb9_0a5b1ab3","line":45,"updated":"2025-02-17 15:07:47.000000000","message":"I agree, is there a strong reason we cannot turn this into a list of structures?","commit_id":"e43e8364f55ec800838cac30cf7b83ce6b178e1a"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"9f7e6f3171e0fdffafa809eb3211af0cad4b6162","unresolved":true,"context_lines":[{"line_number":42,"context_line":"    mac_address \u003d base.Field(\u0027MACAddress\u0027)"},{"line_number":43,"context_line":"    \"\"\"This is the currently configured MAC address of the interface.\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    ipv4_address \u003d base.Field(\u0027IPv4Addresses\u0027)"},{"line_number":46,"context_line":"    \"\"\"This is the currently used IPv4 address of the interface.\"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    ipv6_address \u003d base.Field(\u0027IPv6Addresses\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"4ffc64a3_c24f9baf","line":45,"updated":"2024-11-22 04:24:00.000000000","message":"I realized this is actually an object/dictionary based on the tests below. The behavior is to usually make these CompositeFields but I\u0027ll let the others speak up to that.","commit_id":"e43e8364f55ec800838cac30cf7b83ce6b178e1a"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"e57284b2d033a72a80e4cec2ea40403d71d3b32a","unresolved":true,"context_lines":[{"line_number":42,"context_line":"    mac_address \u003d base.Field(\u0027MACAddress\u0027)"},{"line_number":43,"context_line":"    \"\"\"This is the currently configured MAC address of the interface.\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    ipv4_address \u003d base.Field(\u0027IPv4Addresses\u0027)"},{"line_number":46,"context_line":"    \"\"\"This is the currently used IPv4 address of the interface.\"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    ipv6_address \u003d base.Field(\u0027IPv6Addresses\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3e13ad63_4d2c81ee","line":45,"range":{"start_line":45,"start_character":2,"end_line":45,"end_character":46},"updated":"2026-01-28 20:22:15.000000000","message":"field name is singular (ipv4_address) but maps to plural (IPv4Addressess) - this can be confusing","commit_id":"e43e8364f55ec800838cac30cf7b83ce6b178e1a"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"e57284b2d033a72a80e4cec2ea40403d71d3b32a","unresolved":true,"context_lines":[{"line_number":42,"context_line":"    mac_address \u003d base.Field(\u0027MACAddress\u0027)"},{"line_number":43,"context_line":"    \"\"\"This is the currently configured MAC address of the interface.\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    ipv4_address \u003d base.Field(\u0027IPv4Addresses\u0027)"},{"line_number":46,"context_line":"    \"\"\"This is the currently used IPv4 address of the interface.\"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    ipv6_address \u003d base.Field(\u0027IPv6Addresses\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"e97fb5c0_928f5453","line":45,"in_reply_to":"4ffc64a3_c24f9baf","updated":"2026-01-28 20:22:15.000000000","message":"+1","commit_id":"e43e8364f55ec800838cac30cf7b83ce6b178e1a"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"e57284b2d033a72a80e4cec2ea40403d71d3b32a","unresolved":true,"context_lines":[{"line_number":45,"context_line":"    ipv4_address \u003d base.Field(\u0027IPv4Addresses\u0027)"},{"line_number":46,"context_line":"    \"\"\"This is the currently used IPv4 address of the interface.\"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    ipv6_address \u003d base.Field(\u0027IPv6Addresses\u0027)"},{"line_number":49,"context_line":"    \"\"\"This is the currently used IPv6 address of the interface.\"\"\""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    speed_mbps \u003d base.Field(\u0027SpeedMbps\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"8993aa09_a96bbe78","line":48,"range":{"start_line":48,"start_character":4,"end_line":48,"end_character":46},"updated":"2026-01-28 20:22:15.000000000","message":"same as above","commit_id":"e43e8364f55ec800838cac30cf7b83ce6b178e1a"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"e57284b2d033a72a80e4cec2ea40403d71d3b32a","unresolved":true,"context_lines":[{"line_number":77,"context_line":"            \u0027Interface 1\u0027: [ipaddress.IPv4Address or ipaddress.IPv6Address]}"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":"        ip_dict \u003d {}"},{"line_number":80,"context_line":"        for eth in self.get_members():"},{"line_number":81,"context_line":"            if eth.status and eth.status.health \u003d\u003d res_cons.Health.OK:"},{"line_number":82,"context_line":"                ip_list \u003d ["},{"line_number":83,"context_line":"                    ip_address(addr[\u0027Address\u0027]) for addr in"},{"line_number":84,"context_line":"                    (eth.ipv4_address or []) + (eth.ipv6_address or [])]"},{"line_number":85,"context_line":"                ip_dict[eth.name] \u003d ip_list"},{"line_number":86,"context_line":"        return ip_dict"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":11,"id":"f5222ad1_77849f04","line":85,"range":{"start_line":80,"start_character":4,"end_line":85,"end_character":43},"updated":"2026-01-28 20:22:15.000000000","message":"recommend exception handling for KeyError/ValueError here\nalso: consider similar checks for None to L103-105 below for consistency","commit_id":"e43e8364f55ec800838cac30cf7b83ce6b178e1a"}]}
