)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ebdecd40fff4ef4650f0913cc32e7fd367432701","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"306a099b_81dd850e","updated":"2025-09-26 12:32:11.000000000","message":"recheck","commit_id":"9b604b6f8278a64a277de4db605af28a5909fe45"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0b83eef354a998dff85ff480c782ec6d3212f23b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"e7a0aca9_f718284a","updated":"2025-09-30 17:17:37.000000000","message":"Looks good (I haven\u0027t checked the OVS parts very thoroughly: trusting you on this one). One issue is creating a system-wide user with an insecure password by default, we need to do something about it.","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"02557f0b43e74bdb0e0cfcb0c5089aa529353cd3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"2e725862_51bab6a2","updated":"2025-10-14 17:00:04.000000000","message":"recheck","commit_id":"4275555fb356c7f3c28f0e8f48c4ff8a52088776"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bd076505db37abd59ffa58d8daf726ed1bf82ddc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"8172301b_e3505cac","updated":"2025-11-10 14:54:10.000000000","message":"Looks good (some minor comments for a potential follow-up inline).","commit_id":"504503afa5610ec7105b1e0810179d8da64132c8"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"733a1a3f876fbe333c405f673274efcc33ccb513","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"bff648a4_886986ae","updated":"2025-11-14 20:32:00.000000000","message":"Comments addressed.","commit_id":"71bebff81ec43ea1354603501dc23d6a9e824769"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"f8e641d7312f1cab421e8b8232dcd0711fce5341","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"5c005555_226f2d8f","updated":"2025-11-15 00:36:39.000000000","message":"recheck","commit_id":"71bebff81ec43ea1354603501dc23d6a9e824769"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"d31dbc6292dd8d89a90af215fc1d95fc023cefb9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"890b1284_dfff9d04","updated":"2025-11-16 21:32:03.000000000","message":"recheck","commit_id":"71bebff81ec43ea1354603501dc23d6a9e824769"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"03026b7713f320b545bca876e1cda473854bc1fa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"c3f5249f_9a4059d4","updated":"2025-11-19 14:42:11.000000000","message":"recheck","commit_id":"71bebff81ec43ea1354603501dc23d6a9e824769"}],"doc/source/user/architecture.rst":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bd076505db37abd59ffa58d8daf726ed1bf82ddc","unresolved":true,"context_lines":[{"line_number":94,"context_line":".. note::"},{"line_number":95,"context_line":"   Bifrost does not currently support IPv6, contributions are welcome."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"Virtual Switching"},{"line_number":98,"context_line":"-----------------"},{"line_number":99,"context_line":"When using a testenv, Bifrost sets up a Linux bridge as the virtual switch"},{"line_number":100,"context_line":"interconnecting the virtual machines that implement the nodes.  To support"}],"source_content_type":"text/x-rst","patch_set":10,"id":"508e912f_261c5905","line":97,"updated":"2025-11-10 14:54:10.000000000","message":"This is probably worth moving to the testenv document since this document is more about the production case.","commit_id":"504503afa5610ec7105b1e0810179d8da64132c8"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"733a1a3f876fbe333c405f673274efcc33ccb513","unresolved":false,"context_lines":[{"line_number":94,"context_line":".. note::"},{"line_number":95,"context_line":"   Bifrost does not currently support IPv6, contributions are welcome."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"Virtual Switching"},{"line_number":98,"context_line":"-----------------"},{"line_number":99,"context_line":"When using a testenv, Bifrost sets up a Linux bridge as the virtual switch"},{"line_number":100,"context_line":"interconnecting the virtual machines that implement the nodes.  To support"}],"source_content_type":"text/x-rst","patch_set":10,"id":"fa92e511_9e354d18","line":97,"in_reply_to":"508e912f_261c5905","updated":"2025-11-14 20:32:00.000000000","message":"Ok.  Moved.","commit_id":"504503afa5610ec7105b1e0810179d8da64132c8"}],"playbooks/roles/bifrost-create-vm-nodes/tasks/create_vm.yml":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7a1ef19fac66616c96d5726a8604a3ae2add2627","unresolved":true,"context_lines":[{"line_number":47,"context_line":"  shell:"},{"line_number":48,"context_line":"    cmd: |"},{"line_number":49,"context_line":"      set -eo pipefail"},{"line_number":50,"context_line":"      ovs-vsctl list-ports {{ test_ovs_bridge_name }} | grep -x {{ vm_port_name }} || echo \"not_found\""},{"line_number":51,"context_line":"  register: ovs_port_check"},{"line_number":52,"context_line":"  when: test_vm_switch_type \u003d\u003d \u0027ovs\u0027"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":4,"id":"6f000b83_a3fc7dfc","line":50,"updated":"2025-09-29 18:30:32.000000000","message":"Just thinking outloud here, wouldn\u0027t it make sense to just check and explicitly error upfront? That way the not_found logic wouldn\u0027t really be needed.","commit_id":"c974693416dd4a03768917758f49dd94ee17dd9f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"13f63a896db52f64b3babb27bdbf2ad6333f4ee5","unresolved":false,"context_lines":[{"line_number":47,"context_line":"  shell:"},{"line_number":48,"context_line":"    cmd: |"},{"line_number":49,"context_line":"      set -eo pipefail"},{"line_number":50,"context_line":"      ovs-vsctl list-ports {{ test_ovs_bridge_name }} | grep -x {{ vm_port_name }} || echo \"not_found\""},{"line_number":51,"context_line":"  register: ovs_port_check"},{"line_number":52,"context_line":"  when: test_vm_switch_type \u003d\u003d \u0027ovs\u0027"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5d2ed4b1_b542a19c","line":50,"in_reply_to":"6f000b83_a3fc7dfc","updated":"2025-09-29 18:38:01.000000000","message":"The \u0027add-port\u0027 command fails if the port already exists so we need to check if it exists before running the next task.","commit_id":"c974693416dd4a03768917758f49dd94ee17dd9f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0b83eef354a998dff85ff480c782ec6d3212f23b","unresolved":true,"context_lines":[{"line_number":63,"context_line":"    ovs-vsctl set interface {{ vm_port_name }} lldp:enable\u003dtrue"},{"line_number":64,"context_line":"    ip link set {{ vm_port_name }} up"},{"line_number":65,"context_line":"  when:"},{"line_number":66,"context_line":"  - test_vm_switch_type \u003d\u003d \u0027ovs\u0027"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"# NOTE(pas-ha) wrapping in block/rescue to have diagnostic output, requires Ansible\u003e\u003d2"},{"line_number":69,"context_line":"- when: vm_name not in existing_vms.list_vms"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"19a1c047_8f65b7eb","line":66,"updated":"2025-09-30 17:17:37.000000000","message":"nit: no need for a list","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ee50205f4de3541161c1a1317b0cc5b96d5a9ea3","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    ovs-vsctl set interface {{ vm_port_name }} lldp:enable\u003dtrue"},{"line_number":64,"context_line":"    ip link set {{ vm_port_name }} up"},{"line_number":65,"context_line":"  when:"},{"line_number":66,"context_line":"  - test_vm_switch_type \u003d\u003d \u0027ovs\u0027"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"# NOTE(pas-ha) wrapping in block/rescue to have diagnostic output, requires Ansible\u003e\u003d2"},{"line_number":69,"context_line":"- when: vm_name not in existing_vms.list_vms"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"4ff61db3_b310bebb","line":66,"in_reply_to":"19a1c047_8f65b7eb","updated":"2025-09-30 18:46:41.000000000","message":"thanks!","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"}],"playbooks/roles/bifrost-create-vm-nodes/tasks/prepare_ovs.yml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0b83eef354a998dff85ff480c782ec6d3212f23b","unresolved":true,"context_lines":[{"line_number":59,"context_line":"- name: create OVS user"},{"line_number":60,"context_line":"  user:"},{"line_number":61,"context_line":"    name: \"{{ test_ovs_user }}\""},{"line_number":62,"context_line":"    password: \"{{ test_ovs_password | password_hash(\u0027sha512\u0027) }}\""},{"line_number":63,"context_line":"    shell: /bin/bash"},{"line_number":64,"context_line":"    home: /home/{{ test_ovs_user }}"},{"line_number":65,"context_line":"    create_home: yes"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"aa48db82_4217ba71","line":62,"updated":"2025-09-30 17:17:37.000000000","message":"Why do you need to have a password for this user? For other services, we create users without passwords, preventing log in with them.\n\nIf you really need to be able to log in, please generate a secure password.","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"3f644b871516f44a76268e59c7837f9d97660a58","unresolved":false,"context_lines":[{"line_number":59,"context_line":"- name: create OVS user"},{"line_number":60,"context_line":"  user:"},{"line_number":61,"context_line":"    name: \"{{ test_ovs_user }}\""},{"line_number":62,"context_line":"    password: \"{{ test_ovs_password | password_hash(\u0027sha512\u0027) }}\""},{"line_number":63,"context_line":"    shell: /bin/bash"},{"line_number":64,"context_line":"    home: /home/{{ test_ovs_user }}"},{"line_number":65,"context_line":"    create_home: yes"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"12187dde_7d1db322","line":62,"in_reply_to":"04e08a2a_5691165b","updated":"2025-11-07 23:53:33.000000000","message":"Updated to use a key, and allow \"sudo -s\" without a password for that user.","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"379df0318acf9e04b4856ca06054b0bc30726671","unresolved":true,"context_lines":[{"line_number":59,"context_line":"- name: create OVS user"},{"line_number":60,"context_line":"  user:"},{"line_number":61,"context_line":"    name: \"{{ test_ovs_user }}\""},{"line_number":62,"context_line":"    password: \"{{ test_ovs_password | password_hash(\u0027sha512\u0027) }}\""},{"line_number":63,"context_line":"    shell: /bin/bash"},{"line_number":64,"context_line":"    home: /home/{{ test_ovs_user }}"},{"line_number":65,"context_line":"    create_home: yes"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"04e08a2a_5691165b","line":62,"in_reply_to":"6c9b95db_5e5a2077","updated":"2025-10-01 13:06:25.000000000","message":"The password is needed because of how NGS works for OVS switches... it first SSHes to the host, then runs \"sudo -s\" and then run ovs-* commands.","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ee50205f4de3541161c1a1317b0cc5b96d5a9ea3","unresolved":true,"context_lines":[{"line_number":59,"context_line":"- name: create OVS user"},{"line_number":60,"context_line":"  user:"},{"line_number":61,"context_line":"    name: \"{{ test_ovs_user }}\""},{"line_number":62,"context_line":"    password: \"{{ test_ovs_password | password_hash(\u0027sha512\u0027) }}\""},{"line_number":63,"context_line":"    shell: /bin/bash"},{"line_number":64,"context_line":"    home: /home/{{ test_ovs_user }}"},{"line_number":65,"context_line":"    create_home: yes"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"6c9b95db_5e5a2077","line":62,"in_reply_to":"aa48db82_4217ba71","updated":"2025-09-30 18:46:41.000000000","message":"What\u0027s your definition of a secure password?","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0b83eef354a998dff85ff480c782ec6d3212f23b","unresolved":true,"context_lines":[{"line_number":61,"context_line":"    name: \"{{ test_ovs_user }}\""},{"line_number":62,"context_line":"    password: \"{{ test_ovs_password | password_hash(\u0027sha512\u0027) }}\""},{"line_number":63,"context_line":"    shell: /bin/bash"},{"line_number":64,"context_line":"    home: /home/{{ test_ovs_user }}"},{"line_number":65,"context_line":"    create_home: yes"},{"line_number":66,"context_line":"    groups: openvswitch"},{"line_number":67,"context_line":"    state: present"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"f762b8db_56ac7319","line":64,"updated":"2025-09-30 17:17:37.000000000","message":"If this is for service only, you probably need something like `/var/lib/bifrost-ovs` or even no home at all (why do you need it?)","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ee50205f4de3541161c1a1317b0cc5b96d5a9ea3","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    name: \"{{ test_ovs_user }}\""},{"line_number":62,"context_line":"    password: \"{{ test_ovs_password | password_hash(\u0027sha512\u0027) }}\""},{"line_number":63,"context_line":"    shell: /bin/bash"},{"line_number":64,"context_line":"    home: /home/{{ test_ovs_user }}"},{"line_number":65,"context_line":"    create_home: yes"},{"line_number":66,"context_line":"    groups: openvswitch"},{"line_number":67,"context_line":"    state: present"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"cec99d3e_eba8a2bd","line":64,"in_reply_to":"f762b8db_56ac7319","updated":"2025-09-30 18:46:41.000000000","message":"Because the way NGS works it uses ssh to get to the host, and then does a \"sudo -s\" and then starts running ovs-* commands.  I don\u0027t think the home dir is avoidable.","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0b83eef354a998dff85ff480c782ec6d3212f23b","unresolved":true,"context_lines":[{"line_number":73,"context_line":"    mode: \u00270660\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"# TODO(alegacy): this could be refined so that access is restricted to a"},{"line_number":76,"context_line":"# specific set of OVS commands only using something like rbash"},{"line_number":77,"context_line":"- name: add OVS user to sudoers for privileged access"},{"line_number":78,"context_line":"  copy:"},{"line_number":79,"context_line":"    dest: /etc/sudoers.d/{{ test_ovs_user }}-ovs"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"207f4bb0_5c7c0b92","line":76,"updated":"2025-09-30 17:17:37.000000000","message":"I\u0027m okay with this for now, but then we definitely need a secure password by default.","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ee50205f4de3541161c1a1317b0cc5b96d5a9ea3","unresolved":true,"context_lines":[{"line_number":73,"context_line":"    mode: \u00270660\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"# TODO(alegacy): this could be refined so that access is restricted to a"},{"line_number":76,"context_line":"# specific set of OVS commands only using something like rbash"},{"line_number":77,"context_line":"- name: add OVS user to sudoers for privileged access"},{"line_number":78,"context_line":"  copy:"},{"line_number":79,"context_line":"    dest: /etc/sudoers.d/{{ test_ovs_user }}-ovs"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"b0ac995c_79594acf","line":76,"in_reply_to":"207f4bb0_5c7c0b92","updated":"2025-09-30 18:46:41.000000000","message":"How about a compromise of sorts... how about I restrict this user to only be allowed to ssh in from \u0027localhost\u0027.  that way it is at least limited to programs running on the node.","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"3f644b871516f44a76268e59c7837f9d97660a58","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    mode: \u00270660\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"# TODO(alegacy): this could be refined so that access is restricted to a"},{"line_number":76,"context_line":"# specific set of OVS commands only using something like rbash"},{"line_number":77,"context_line":"- name: add OVS user to sudoers for privileged access"},{"line_number":78,"context_line":"  copy:"},{"line_number":79,"context_line":"    dest: /etc/sudoers.d/{{ test_ovs_user }}-ovs"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"f7ae2cea_4bcfaaa3","line":76,"in_reply_to":"44ebc140_c88ca32a","updated":"2025-11-07 23:53:33.000000000","message":"Updated it to use a key.","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"88fbd6761cbccd5d009c4ac8e584c66e346b28b1","unresolved":true,"context_lines":[{"line_number":73,"context_line":"    mode: \u00270660\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"# TODO(alegacy): this could be refined so that access is restricted to a"},{"line_number":76,"context_line":"# specific set of OVS commands only using something like rbash"},{"line_number":77,"context_line":"- name: add OVS user to sudoers for privileged access"},{"line_number":78,"context_line":"  copy:"},{"line_number":79,"context_line":"    dest: /etc/sudoers.d/{{ test_ovs_user }}-ovs"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"44ebc140_c88ca32a","line":76,"in_reply_to":"b0ac995c_79594acf","updated":"2025-11-03 18:35:10.000000000","message":"The thing which is done with devstack is a key is generated and added to authorized_keys for the user, that way there is no need to have/set/relate a password, at least for the end to end interaction. I don\u0027t think it leverages a password in our existing testing with ngs in devstack, which is why I note this.","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bd076505db37abd59ffa58d8daf726ed1bf82ddc","unresolved":true,"context_lines":[{"line_number":66,"context_line":"- name: create OVS user"},{"line_number":67,"context_line":"  user:"},{"line_number":68,"context_line":"    name: \"{{ test_ovs_user }}\""},{"line_number":69,"context_line":"    password: \u0027!\u0027  # Disabled password"},{"line_number":70,"context_line":"    shell: /bin/bash"},{"line_number":71,"context_line":"    home: /home/{{ test_ovs_user }}"},{"line_number":72,"context_line":"    create_home: yes"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"eb32b852_4666cefa","line":69,"updated":"2025-11-10 14:54:10.000000000","message":"Nice!","commit_id":"504503afa5610ec7105b1e0810179d8da64132c8"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"733a1a3f876fbe333c405f673274efcc33ccb513","unresolved":false,"context_lines":[{"line_number":66,"context_line":"- name: create OVS user"},{"line_number":67,"context_line":"  user:"},{"line_number":68,"context_line":"    name: \"{{ test_ovs_user }}\""},{"line_number":69,"context_line":"    password: \u0027!\u0027  # Disabled password"},{"line_number":70,"context_line":"    shell: /bin/bash"},{"line_number":71,"context_line":"    home: /home/{{ test_ovs_user }}"},{"line_number":72,"context_line":"    create_home: yes"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"8353c305_fa0d4ba3","line":69,"in_reply_to":"eb32b852_4666cefa","updated":"2025-11-14 20:32:00.000000000","message":"Done","commit_id":"504503afa5610ec7105b1e0810179d8da64132c8"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bd076505db37abd59ffa58d8daf726ed1bf82ddc","unresolved":true,"context_lines":[{"line_number":78,"context_line":"    name: \"{{ test_ovs_user }}\""},{"line_number":79,"context_line":"    generate_ssh_key: yes"},{"line_number":80,"context_line":"    ssh_key_bits: 4096"},{"line_number":81,"context_line":"    ssh_key_type: rsa"},{"line_number":82,"context_line":"    ssh_key_file: .ssh/id_rsa"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"- name: read OVS user public key"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"b2c55d7a_8ed0b4eb","line":81,"updated":"2025-11-10 14:54:10.000000000","message":"RSA? IN 2025??  (jk, feel free to leave it for now)","commit_id":"504503afa5610ec7105b1e0810179d8da64132c8"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"733a1a3f876fbe333c405f673274efcc33ccb513","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    name: \"{{ test_ovs_user }}\""},{"line_number":79,"context_line":"    generate_ssh_key: yes"},{"line_number":80,"context_line":"    ssh_key_bits: 4096"},{"line_number":81,"context_line":"    ssh_key_type: rsa"},{"line_number":82,"context_line":"    ssh_key_file: .ssh/id_rsa"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"- name: read OVS user public key"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"7665b5c0_c7f3a9da","line":81,"in_reply_to":"b2c55d7a_8ed0b4eb","updated":"2025-11-14 20:32:00.000000000","message":"Done","commit_id":"504503afa5610ec7105b1e0810179d8da64132c8"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bd076505db37abd59ffa58d8daf726ed1bf82ddc","unresolved":true,"context_lines":[{"line_number":108,"context_line":"      # Allow {{ test_ovs_user }} to run OVS commands as root without password"},{"line_number":109,"context_line":"      {{ test_ovs_user }} ALL\u003d(ALL) NOPASSWD: /bin/bash"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"- name: Restrict OVS user SSH access from localhost only and disable password auth"},{"line_number":112,"context_line":"  ansible.builtin.blockinfile:"},{"line_number":113,"context_line":"    path: /etc/ssh/sshd_config"},{"line_number":114,"context_line":"    block: |"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"45e13b79_94c401d1","line":111,"updated":"2025-11-10 14:54:10.000000000","message":"Nice again!","commit_id":"504503afa5610ec7105b1e0810179d8da64132c8"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"733a1a3f876fbe333c405f673274efcc33ccb513","unresolved":false,"context_lines":[{"line_number":108,"context_line":"      # Allow {{ test_ovs_user }} to run OVS commands as root without password"},{"line_number":109,"context_line":"      {{ test_ovs_user }} ALL\u003d(ALL) NOPASSWD: /bin/bash"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"- name: Restrict OVS user SSH access from localhost only and disable password auth"},{"line_number":112,"context_line":"  ansible.builtin.blockinfile:"},{"line_number":113,"context_line":"    path: /etc/ssh/sshd_config"},{"line_number":114,"context_line":"    block: |"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"32c2172a_0a6641bf","line":111,"in_reply_to":"45e13b79_94c401d1","updated":"2025-11-14 20:32:00.000000000","message":"Done","commit_id":"504503afa5610ec7105b1e0810179d8da64132c8"}],"playbooks/roles/bifrost-create-vm-nodes/vars/redhat.yml":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7a1ef19fac66616c96d5726a8604a3ae2add2627","unresolved":true,"context_lines":[{"line_number":18,"context_line":" - edk2-ovmf"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"ovs_packages:"},{"line_number":21,"context_line":" - openvswitch3.5"},{"line_number":22,"context_line":" - python3-openvswitch3.5"},{"line_number":23,"context_line":"ovs_service_name: openvswitch"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":4,"id":"4a6e40de_aab7daaf","line":21,"updated":"2025-09-29 18:30:32.000000000","message":"It might be worth putting an inline note that this version may need to change/increment as time goes on... Specifically because it is a specifically versioned package.","commit_id":"c974693416dd4a03768917758f49dd94ee17dd9f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"13f63a896db52f64b3babb27bdbf2ad6333f4ee5","unresolved":true,"context_lines":[{"line_number":18,"context_line":" - edk2-ovmf"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"ovs_packages:"},{"line_number":21,"context_line":" - openvswitch3.5"},{"line_number":22,"context_line":" - python3-openvswitch3.5"},{"line_number":23,"context_line":"ovs_service_name: openvswitch"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":4,"id":"f577a860_84a35ea4","line":21,"in_reply_to":"4a6e40de_aab7daaf","updated":"2025-09-29 18:38:01.000000000","message":"Ok, will add a \u0027todo\u0027 on my next iteration","commit_id":"c974693416dd4a03768917758f49dd94ee17dd9f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"b5b763d8a2942090a8edf070ceda5ff0029af4af","unresolved":false,"context_lines":[{"line_number":18,"context_line":" - edk2-ovmf"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"ovs_packages:"},{"line_number":21,"context_line":" - openvswitch3.5"},{"line_number":22,"context_line":" - python3-openvswitch3.5"},{"line_number":23,"context_line":"ovs_service_name: openvswitch"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":4,"id":"98f2b78e_e6029d79","line":21,"in_reply_to":"f577a860_84a35ea4","updated":"2025-09-30 14:23:48.000000000","message":"done","commit_id":"c974693416dd4a03768917758f49dd94ee17dd9f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bd076505db37abd59ffa58d8daf726ed1bf82ddc","unresolved":true,"context_lines":[{"line_number":18,"context_line":" - edk2-ovmf"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"ovs_packages:"},{"line_number":21,"context_line":" # TODO(alegacy): Update versioned package names periodically"},{"line_number":22,"context_line":" - openvswitch3.5"},{"line_number":23,"context_line":" - python3-openvswitch3.5"},{"line_number":24,"context_line":"ovs_service_name: openvswitch"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"dfb30c14_177fc63e","line":21,"updated":"2025-11-10 14:54:10.000000000","message":"This is unfortunate..","commit_id":"504503afa5610ec7105b1e0810179d8da64132c8"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"733a1a3f876fbe333c405f673274efcc33ccb513","unresolved":false,"context_lines":[{"line_number":18,"context_line":" - edk2-ovmf"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"ovs_packages:"},{"line_number":21,"context_line":" # TODO(alegacy): Update versioned package names periodically"},{"line_number":22,"context_line":" - openvswitch3.5"},{"line_number":23,"context_line":" - python3-openvswitch3.5"},{"line_number":24,"context_line":"ovs_service_name: openvswitch"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"8b7f0acf_ebd1a91a","line":21,"in_reply_to":"dfb30c14_177fc63e","updated":"2025-11-14 20:32:00.000000000","message":"agreed","commit_id":"504503afa5610ec7105b1e0810179d8da64132c8"}],"playbooks/roles/bifrost-ironic-install/tasks/main.yml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0b83eef354a998dff85ff480c782ec6d3212f23b","unresolved":true,"context_lines":[{"line_number":38,"context_line":"  include_tasks: ovs_bootstrap.yml"},{"line_number":39,"context_line":"  when:"},{"line_number":40,"context_line":"  - not skip_bootstrap | bool"},{"line_number":41,"context_line":"  - test_vm_switch_type \u003d\u003d \u0027ovs\u0027"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"- name: \"Start Ironic services\""},{"line_number":44,"context_line":"  include_tasks: start.yml"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"4d65a7be_182a3d8b","line":41,"updated":"2025-09-30 17:17:37.000000000","message":"Maybe add \"testing\" here too to avoid duplicating it in the tasks list?","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ee50205f4de3541161c1a1317b0cc5b96d5a9ea3","unresolved":false,"context_lines":[{"line_number":38,"context_line":"  include_tasks: ovs_bootstrap.yml"},{"line_number":39,"context_line":"  when:"},{"line_number":40,"context_line":"  - not skip_bootstrap | bool"},{"line_number":41,"context_line":"  - test_vm_switch_type \u003d\u003d \u0027ovs\u0027"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"- name: \"Start Ironic services\""},{"line_number":44,"context_line":"  include_tasks: start.yml"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"cfc3a1f3_78ac68ec","line":41,"in_reply_to":"4d65a7be_182a3d8b","updated":"2025-09-30 18:46:41.000000000","message":"Thanks!","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ee50205f4de3541161c1a1317b0cc5b96d5a9ea3","unresolved":false,"context_lines":[{"line_number":38,"context_line":"  include_tasks: ovs_bootstrap.yml"},{"line_number":39,"context_line":"  when:"},{"line_number":40,"context_line":"  - not skip_bootstrap | bool"},{"line_number":41,"context_line":"  - test_vm_switch_type \u003d\u003d \u0027ovs\u0027"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"- name: \"Start Ironic services\""},{"line_number":44,"context_line":"  include_tasks: start.yml"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"ec593e26_d6fd3d3a","line":41,"in_reply_to":"4d65a7be_182a3d8b","updated":"2025-09-30 18:46:41.000000000","message":"thanks","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bd076505db37abd59ffa58d8daf726ed1bf82ddc","unresolved":true,"context_lines":[{"line_number":35,"context_line":"  when: not skip_bootstrap | bool"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"- name: \"Bootstrap OVS\""},{"line_number":38,"context_line":"  include_tasks: ovs_bootstrap.yml"},{"line_number":39,"context_line":"  when:"},{"line_number":40,"context_line":"  - not skip_bootstrap | bool"},{"line_number":41,"context_line":"  - testing | bool"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"bb0c85f2_40909f8a","line":38,"updated":"2025-11-10 14:54:10.000000000","message":"I\u0027m curious why these tasks are here and not in bifrost-create-vms with the rest of the logic","commit_id":"504503afa5610ec7105b1e0810179d8da64132c8"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"733a1a3f876fbe333c405f673274efcc33ccb513","unresolved":false,"context_lines":[{"line_number":35,"context_line":"  when: not skip_bootstrap | bool"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"- name: \"Bootstrap OVS\""},{"line_number":38,"context_line":"  include_tasks: ovs_bootstrap.yml"},{"line_number":39,"context_line":"  when:"},{"line_number":40,"context_line":"  - not skip_bootstrap | bool"},{"line_number":41,"context_line":"  - testing | bool"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"f55652ed_6dbc4d8f","line":38,"in_reply_to":"bb0c85f2_40909f8a","updated":"2025-11-14 20:32:00.000000000","message":"Because they depend on other stuff that is only done in the install part rather than the testenv part (i.e., dnsmasq and firewalld)","commit_id":"504503afa5610ec7105b1e0810179d8da64132c8"}],"playbooks/roles/bifrost-ironic-install/tasks/ovs_bootstrap.yml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0b83eef354a998dff85ff480c782ec6d3212f23b","unresolved":true,"context_lines":[{"line_number":53,"context_line":"      done"},{"line_number":54,"context_line":"  register: ovs_linux_interfaces"},{"line_number":55,"context_line":"  when:"},{"line_number":56,"context_line":"    - use_firewalld | bool"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"- name: \"Add OVS Linux interfaces to firewall zone\""},{"line_number":59,"context_line":"  firewalld:"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"e28ca269_06b6a2e7","line":56,"updated":"2025-09-30 17:17:37.000000000","message":"nit: no need for a list","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ee50205f4de3541161c1a1317b0cc5b96d5a9ea3","unresolved":false,"context_lines":[{"line_number":53,"context_line":"      done"},{"line_number":54,"context_line":"  register: ovs_linux_interfaces"},{"line_number":55,"context_line":"  when:"},{"line_number":56,"context_line":"    - use_firewalld | bool"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"- name: \"Add OVS Linux interfaces to firewall zone\""},{"line_number":59,"context_line":"  firewalld:"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"b20d97c8_250ae3a1","line":56,"in_reply_to":"e28ca269_06b6a2e7","updated":"2025-09-30 18:46:41.000000000","message":"done","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"bd076505db37abd59ffa58d8daf726ed1bf82ddc","unresolved":true,"context_lines":[{"line_number":29,"context_line":"    ovs_vlan_ids: \"{{ ovs_configured_vlans.stdout_lines | default([]) }}\""},{"line_number":30,"context_line":"  when:"},{"line_number":31,"context_line":"    - enable_dhcp | bool"},{"line_number":32,"context_line":"    - testing | bool"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"- name: \"Configure OVS VLAN DHCP in main dnsmasq\""},{"line_number":35,"context_line":"  template:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"dc2e3dc7_e82efc99","line":32,"updated":"2025-11-10 14:54:10.000000000","message":"Checking \"testing\" is redundant: these tasks are only included when testing is true. (Also, it\u0027s not consistent in this file.)","commit_id":"504503afa5610ec7105b1e0810179d8da64132c8"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"733a1a3f876fbe333c405f673274efcc33ccb513","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    ovs_vlan_ids: \"{{ ovs_configured_vlans.stdout_lines | default([]) }}\""},{"line_number":30,"context_line":"  when:"},{"line_number":31,"context_line":"    - enable_dhcp | bool"},{"line_number":32,"context_line":"    - testing | bool"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"- name: \"Configure OVS VLAN DHCP in main dnsmasq\""},{"line_number":35,"context_line":"  template:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"d61997d2_e4c53570","line":32,"in_reply_to":"dc2e3dc7_e82efc99","updated":"2025-11-14 20:32:00.000000000","message":"fixed.  thank you.","commit_id":"504503afa5610ec7105b1e0810179d8da64132c8"}],"releasenotes/notes/ovs-virtual-switch-support-36b3693a1076e2f6.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0b83eef354a998dff85ff480c782ec6d3212f23b","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for using Open vSwitch (OVS) as a virtual switch for testing"},{"line_number":5,"context_line":"    environments. Setting ``test_vm_switch_type`` to ``ovs`` creates 3 separate"},{"line_number":6,"context_line":"    VLANs for comprehensive network testing: one dedicated as an inspection"},{"line_number":7,"context_line":"    network, another for the final tenant network, and a third for all other"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"1018082e_94e83f14","line":4,"updated":"2025-09-30 17:17:37.000000000","message":"nit: Adds (we use present)","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ee50205f4de3541161c1a1317b0cc5b96d5a9ea3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for using Open vSwitch (OVS) as a virtual switch for testing"},{"line_number":5,"context_line":"    environments. Setting ``test_vm_switch_type`` to ``ovs`` creates 3 separate"},{"line_number":6,"context_line":"    VLANs for comprehensive network testing: one dedicated as an inspection"},{"line_number":7,"context_line":"    network, another for the final tenant network, and a third for all other"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"973b1aa5_e03b0d79","line":4,"in_reply_to":"1018082e_94e83f14","updated":"2025-09-30 18:46:41.000000000","message":"Thanks!","commit_id":"e4427bbb0d193780c647e77781e8d0c987c7d88f"}]}
