all:
  children:
    cephs:
      hosts:
        instance: null
    computes:
      hosts:
        instance: null
    controllers:
      hosts:
        instance: null
    zuul_unreachable:
      hosts: {}
  hosts:
    instance:
      ansible_connection: ssh
      ansible_host: 162.253.55.5
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      atmosphere_image_prefix: harbor.atmosphere.dev/
      ceph_conf_overrides:
      - option: mon allow pool size one
        section: global
        value: true
      - option: osd crush chooseleaf type
        section: global
        value: 0
      - option: auth allow insecure global id reclaim
        section: mon
        value: false
      ceph_csi_rbd_helm_values:
        provisioner:
          replicaCount: 1
      ceph_fsid: 4837cbf8-4f90-4300-b3f6-726c9b9f89b4
      ceph_osd_devices:
      - /dev/ceph-{{ inventory_hostname_short }}-osd0/data
      - /dev/ceph-{{ inventory_hostname_short }}-osd1/data
      - /dev/ceph-{{ inventory_hostname_short }}-osd2/data
      cilium_helm_values:
        operator:
          replicas: 1
      csi_driver: local-path-provisioner
      kube_vip_address: 172.17.0.100
      kube_vip_interface: '{{ ansible_facts[''default_ipv4''].interface }}'
      kubernetes_hostname: '{{ ansible_facts[''default_ipv4''].address }}'
      molecule_install_collection_siblings: true
      molecule_scenario: csi
      nodepool:
        az: yul2
        cloud: public
        external_id: c2763f7b-dfba-4ba6-ae3f-25d9dada87fb
        host_id: dd2e1d1dd8d272e7cc172fae0c5dbd34541b0549d31464f468251769
        interface_ip: 162.253.55.5
        label: ubuntu-jammy
        node_properties: {}
        private_ipv4: 162.253.55.5
        private_ipv6: null
        provider: yul1
        public_ipv4: 162.253.55.5
        public_ipv6: 2604:e100:1:0:f816:3eff:fea3:588
        region: ca-ymq-1
        slot: null
      zuul_node:
        az: yul2
        cloud: public
        external_id: c2763f7b-dfba-4ba6-ae3f-25d9dada87fb
        host_id: dd2e1d1dd8d272e7cc172fae0c5dbd34541b0549d31464f468251769
        interface_ip: 162.253.55.5
        label: ubuntu-jammy
        node_properties: {}
        private_ipv4: 162.253.55.5
        private_ipv6: null
        provider: yul1
        public_ipv4: 162.253.55.5
        public_ipv6: 2604:e100:1:0:f816:3eff:fea3:588
        region: ca-ymq-1
        slot: null
        uuid: null
  vars:
    atmosphere_image_prefix: harbor.atmosphere.dev/
    ceph_conf_overrides:
    - option: mon allow pool size one
      section: global
      value: true
    - option: osd crush chooseleaf type
      section: global
      value: 0
    - option: auth allow insecure global id reclaim
      section: mon
      value: false
    ceph_csi_rbd_helm_values:
      provisioner:
        replicaCount: 1
    ceph_fsid: 4837cbf8-4f90-4300-b3f6-726c9b9f89b4
    ceph_osd_devices:
    - /dev/ceph-{{ inventory_hostname_short }}-osd0/data
    - /dev/ceph-{{ inventory_hostname_short }}-osd1/data
    - /dev/ceph-{{ inventory_hostname_short }}-osd2/data
    cilium_helm_values:
      operator:
        replicas: 1
    csi_driver: local-path-provisioner
    kube_vip_address: 172.17.0.100
    kube_vip_interface: '{{ ansible_facts[''default_ipv4''].interface }}'
    kubernetes_hostname: '{{ ansible_facts[''default_ipv4''].address }}'
    molecule_install_collection_siblings: true
    molecule_scenario: csi
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#1>'
      - '<Job molecule explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-jobs/zuul.d/ansible-jobs.yaml@main#1>'
      - '<Job atmosphere-molecule explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/atmosphere-zuul-jobs/zuul.d/jobs.yaml@main#1>'
      - '<Job atmosphere-molecule-csi explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/atmosphere-zuul-jobs/zuul.d/jobs.yaml@main#56>'
      - '<Job atmosphere-molecule-csi-local-path-provisioner explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: vexxhost/atmosphere-zuul-jobs/zuul.d/jobs.yaml@main#63>'
      - '<Job atmosphere-molecule-csi-local-path-provisioner explicit: None implied:
        None source: vexxhost/atmosphere-zuul-jobs/zuul.d/project-templates.yaml@main#1>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 861574ceb43d441189f2cc27708d9894
      build_refs:
      - branch: main
        change: '4397'
        change_message: "fix(neutron): update image to the build that includes curl\n\nBumps
          the `ghcr.io/vexxhost/neutron:main` image on `main` to the build that installs
          `curl`.\n\n**Problem:** Neutron 28 rewrote the HA keepalived state-change
          monitor from a Python thread into a POSIX shell script (`bin/neutron-keepalived-state-change`).
          The old implementation notified the L3 agent with Python; the new one shells
          out:\n\n```sh\nset -e\nnotify_agent () {\n    socket=\"${STATE_PATH}/keepalived-state-change\"\n
          \   curl --connect-timeout 5 \\\n        -X POST \\\n        -H \"X-Neutron-Router-Id:
          ${ROUTER_ID}\" \\\n        -H \"X-Neutron-State: ${state}\" \\\n        -H
          \"Connection: close\" \\\n        --unix-socket \"${socket}\" \\\n        \"http://127.0.0.1/\"\n}\n```\n\n`curl`
          was not installed in the image (scanning every layer found no `curl` binary,
          only the unrelated `kombu/asynchronous/http/curl.py`), and `curl` is not
          in Neutron's `bindep.txt` either. The script runs under `set -e` with no
          `command -v curl` guard, so it exits 127 on its first notification attempt.\n\n**Resulting
          behaviour:** the L3 agent sees the monitor die and respawns it every `check_child_processes_interval`,
          indefinitely:\n\n```\nERROR   neutron.agent.linux.external_process [-] ip_monitor
          for router with uuid <uuid> not found. The process should not have died\nWARNING
          neutron.agent.linux.external_process [-] Respawning ip_monitor for uuid
          <uuid>\n```\n\nNo state change ever reaches the agent, so an HA router never
          transitions to primary and never programs its external gateway. Floating
          IPs are created and associated correctly \u2014 the Neutron server log shows
          `Floating IP 665d5772-... associated. External IP: 10.96.250.208` \u2014
          but nothing is reachable on them. In the AIO Zuul jobs this surfaces as
          five Tempest failures, all of them SSH to a floating IP: `paramiko.ssh_exception.NoValidConnectionsError:
          Unable to connect to port 22 on 10.96.250.208`, `wait_for_ssh` `TimeoutException`,
          and `AssertionError: False is not true : Public network connectivity check
          failed`.\n\nL3 agent pod logs, `main` (neutron 28.1.0.dev560) versus a passing
          `stable/2025.2` build (neutron 27.0.19.dev7), both with `l3_ha: true`:\n\n|
          log evidence | main | stable/2025.2 |\n| --- | --- | --- |\n| `neutron.agent.l3.ha`
          state changes | **0** | 22 |\n| `transitioned to primary/backup` | **0**
          | 22 |\n| `qg-` external gateway device | **0** | 7 |\n| `ip_monitor ...
          not found` | **10** | 0 |\n\n| | |\n| --- | --- |\n| Service | neutron |\n|
          Branch | `main` |\n| Image tag | `main` |\n| Old digest | `sha256:982622323bdb8e53bc6265d238b0a72659ef9525ff899aeafa41668bd9f13af8`
          |\n| New digest | `sha256:8fcfa7a0cd94b5382e1c5a59d51680d7f6e564fed27f1fc419b31e326678bb13`
          |\n| New source SHA | [`94e31c4e`](https://github.com/vexxhost/docker-neutron/commit/94e31c4ec2b356fc26acab995640ba79bdc3ebc1)
          (docker-neutron [#2276](https://github.com/vexxhost/docker-neutron/pull/2276))
          |\n\n**Validation**\n\n- The image's `org.opencontainers.image.revision`
          is `94e31c4ec2b356fc26acab995640ba79bdc3ebc1`, equal to the current head
          of `vexxhost/docker-neutron` `main`, so the `main` tag is not stale. `org.opencontainers.image.version`
          is `main`, matching the tag used in `roles/defaults/vars/main.yml`. Built
          2026-09-22T14:28:02Z.\n- `usr/bin/curl` is present in both the amd64 (297288
          bytes) and arm64 (329896 bytes) images. The build log shows `Setting up
          curl (8.5.0-2ubuntu10.13)` for both architectures.\n- Neutron version is
          unchanged at `28.1.0.dev560`, so this only adds the missing dependency.\n-
          All 20 `neutron_*` entries referencing this image were updated together
          (`neutron_bagpipe_bgp`, `neutron_bgp_dragent`, `neutron_db_sync`, `neutron_dhcp`,
          `neutron_ironic_agent_init`, `neutron_ironic_agent`, `neutron_l2gw`, `neutron_l3`,
          `neutron_linuxbridge_agent`, `neutron_metadata`, `neutron_netns_cleanup_cron`,
          `neutron_openvswitch_agent`, `neutron_ovn_metadata`, `neutron_ovn_vpn`,
          `neutron_server`, `neutron_rpc_server`, `neutron_sriov_agent_init`, `neutron_sriov_agent`,
          `neutron_policy_server`, `ovn_logging_parser`), and no references to the
          old digest remain in the repository.\n\n**Expected effect on CI**\n\nAll
          five remaining `main` AIO Tempest failures should clear once the external
          gateway is programmed. The signals to look for in the next AIO run are `neutron.agent.l3.ha
          ... transitioned to primary` appearing in the L3 agent log and zero `ip_monitor
          ... not found` lines.\n\n**Scope**\n\nOnly `main` is affected. Every stable
          branch still runs the Python monitor \u2014 verified against the `openstack/neutron`
          ref pinned in each branch of `docker-neutron` \u2014 so no stable branch
          needs this. `openstack/neutron` `stable/2026.2` does contain the shell script,
          so a `stable/2026.2` branch here will need `curl` when it is created."
        change_url: https://github.com/vexxhost/atmosphere/pull/4397
        commit_id: b6d8a77a742538a2a250c4e34f4d2a32ca696cfb
        patchset: b6d8a77a742538a2a250c4e34f4d2a32ca696cfb
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere
          name: vexxhost/atmosphere
          short_name: atmosphere
          src_dir: src/github.com/vexxhost/atmosphere
        src_dir: src/github.com/vexxhost/atmosphere
        topic: null
      buildset: 0b150290aa59411fbe10e8bec4cd4292
      buildset_refs:
      - branch: main
        change: '4397'
        change_message: "fix(neutron): update image to the build that includes curl\n\nBumps
          the `ghcr.io/vexxhost/neutron:main` image on `main` to the build that installs
          `curl`.\n\n**Problem:** Neutron 28 rewrote the HA keepalived state-change
          monitor from a Python thread into a POSIX shell script (`bin/neutron-keepalived-state-change`).
          The old implementation notified the L3 agent with Python; the new one shells
          out:\n\n```sh\nset -e\nnotify_agent () {\n    socket=\"${STATE_PATH}/keepalived-state-change\"\n
          \   curl --connect-timeout 5 \\\n        -X POST \\\n        -H \"X-Neutron-Router-Id:
          ${ROUTER_ID}\" \\\n        -H \"X-Neutron-State: ${state}\" \\\n        -H
          \"Connection: close\" \\\n        --unix-socket \"${socket}\" \\\n        \"http://127.0.0.1/\"\n}\n```\n\n`curl`
          was not installed in the image (scanning every layer found no `curl` binary,
          only the unrelated `kombu/asynchronous/http/curl.py`), and `curl` is not
          in Neutron's `bindep.txt` either. The script runs under `set -e` with no
          `command -v curl` guard, so it exits 127 on its first notification attempt.\n\n**Resulting
          behaviour:** the L3 agent sees the monitor die and respawns it every `check_child_processes_interval`,
          indefinitely:\n\n```\nERROR   neutron.agent.linux.external_process [-] ip_monitor
          for router with uuid <uuid> not found. The process should not have died\nWARNING
          neutron.agent.linux.external_process [-] Respawning ip_monitor for uuid
          <uuid>\n```\n\nNo state change ever reaches the agent, so an HA router never
          transitions to primary and never programs its external gateway. Floating
          IPs are created and associated correctly \u2014 the Neutron server log shows
          `Floating IP 665d5772-... associated. External IP: 10.96.250.208` \u2014
          but nothing is reachable on them. In the AIO Zuul jobs this surfaces as
          five Tempest failures, all of them SSH to a floating IP: `paramiko.ssh_exception.NoValidConnectionsError:
          Unable to connect to port 22 on 10.96.250.208`, `wait_for_ssh` `TimeoutException`,
          and `AssertionError: False is not true : Public network connectivity check
          failed`.\n\nL3 agent pod logs, `main` (neutron 28.1.0.dev560) versus a passing
          `stable/2025.2` build (neutron 27.0.19.dev7), both with `l3_ha: true`:\n\n|
          log evidence | main | stable/2025.2 |\n| --- | --- | --- |\n| `neutron.agent.l3.ha`
          state changes | **0** | 22 |\n| `transitioned to primary/backup` | **0**
          | 22 |\n| `qg-` external gateway device | **0** | 7 |\n| `ip_monitor ...
          not found` | **10** | 0 |\n\n| | |\n| --- | --- |\n| Service | neutron |\n|
          Branch | `main` |\n| Image tag | `main` |\n| Old digest | `sha256:982622323bdb8e53bc6265d238b0a72659ef9525ff899aeafa41668bd9f13af8`
          |\n| New digest | `sha256:8fcfa7a0cd94b5382e1c5a59d51680d7f6e564fed27f1fc419b31e326678bb13`
          |\n| New source SHA | [`94e31c4e`](https://github.com/vexxhost/docker-neutron/commit/94e31c4ec2b356fc26acab995640ba79bdc3ebc1)
          (docker-neutron [#2276](https://github.com/vexxhost/docker-neutron/pull/2276))
          |\n\n**Validation**\n\n- The image's `org.opencontainers.image.revision`
          is `94e31c4ec2b356fc26acab995640ba79bdc3ebc1`, equal to the current head
          of `vexxhost/docker-neutron` `main`, so the `main` tag is not stale. `org.opencontainers.image.version`
          is `main`, matching the tag used in `roles/defaults/vars/main.yml`. Built
          2026-09-22T14:28:02Z.\n- `usr/bin/curl` is present in both the amd64 (297288
          bytes) and arm64 (329896 bytes) images. The build log shows `Setting up
          curl (8.5.0-2ubuntu10.13)` for both architectures.\n- Neutron version is
          unchanged at `28.1.0.dev560`, so this only adds the missing dependency.\n-
          All 20 `neutron_*` entries referencing this image were updated together
          (`neutron_bagpipe_bgp`, `neutron_bgp_dragent`, `neutron_db_sync`, `neutron_dhcp`,
          `neutron_ironic_agent_init`, `neutron_ironic_agent`, `neutron_l2gw`, `neutron_l3`,
          `neutron_linuxbridge_agent`, `neutron_metadata`, `neutron_netns_cleanup_cron`,
          `neutron_openvswitch_agent`, `neutron_ovn_metadata`, `neutron_ovn_vpn`,
          `neutron_server`, `neutron_rpc_server`, `neutron_sriov_agent_init`, `neutron_sriov_agent`,
          `neutron_policy_server`, `ovn_logging_parser`), and no references to the
          old digest remain in the repository.\n\n**Expected effect on CI**\n\nAll
          five remaining `main` AIO Tempest failures should clear once the external
          gateway is programmed. The signals to look for in the next AIO run are `neutron.agent.l3.ha
          ... transitioned to primary` appearing in the L3 agent log and zero `ip_monitor
          ... not found` lines.\n\n**Scope**\n\nOnly `main` is affected. Every stable
          branch still runs the Python monitor \u2014 verified against the `openstack/neutron`
          ref pinned in each branch of `docker-neutron` \u2014 so no stable branch
          needs this. `openstack/neutron` `stable/2026.2` does contain the shell script,
          so a `stable/2026.2` branch here will need `curl` when it is created."
        change_url: https://github.com/vexxhost/atmosphere/pull/4397
        commit_id: b6d8a77a742538a2a250c4e34f4d2a32ca696cfb
        patchset: b6d8a77a742538a2a250c4e34f4d2a32ca696cfb
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere
          name: vexxhost/atmosphere
          short_name: atmosphere
          src_dir: src/github.com/vexxhost/atmosphere
        src_dir: src/github.com/vexxhost/atmosphere
        topic: null
      change: '4397'
      change_message: "fix(neutron): update image to the build that includes curl\n\nBumps
        the `ghcr.io/vexxhost/neutron:main` image on `main` to the build that installs
        `curl`.\n\n**Problem:** Neutron 28 rewrote the HA keepalived state-change
        monitor from a Python thread into a POSIX shell script (`bin/neutron-keepalived-state-change`).
        The old implementation notified the L3 agent with Python; the new one shells
        out:\n\n```sh\nset -e\nnotify_agent () {\n    socket=\"${STATE_PATH}/keepalived-state-change\"\n
        \   curl --connect-timeout 5 \\\n        -X POST \\\n        -H \"X-Neutron-Router-Id:
        ${ROUTER_ID}\" \\\n        -H \"X-Neutron-State: ${state}\" \\\n        -H
        \"Connection: close\" \\\n        --unix-socket \"${socket}\" \\\n        \"http://127.0.0.1/\"\n}\n```\n\n`curl`
        was not installed in the image (scanning every layer found no `curl` binary,
        only the unrelated `kombu/asynchronous/http/curl.py`), and `curl` is not in
        Neutron's `bindep.txt` either. The script runs under `set -e` with no `command
        -v curl` guard, so it exits 127 on its first notification attempt.\n\n**Resulting
        behaviour:** the L3 agent sees the monitor die and respawns it every `check_child_processes_interval`,
        indefinitely:\n\n```\nERROR   neutron.agent.linux.external_process [-] ip_monitor
        for router with uuid <uuid> not found. The process should not have died\nWARNING
        neutron.agent.linux.external_process [-] Respawning ip_monitor for uuid <uuid>\n```\n\nNo
        state change ever reaches the agent, so an HA router never transitions to
        primary and never programs its external gateway. Floating IPs are created
        and associated correctly \u2014 the Neutron server log shows `Floating IP
        665d5772-... associated. External IP: 10.96.250.208` \u2014 but nothing is
        reachable on them. In the AIO Zuul jobs this surfaces as five Tempest failures,
        all of them SSH to a floating IP: `paramiko.ssh_exception.NoValidConnectionsError:
        Unable to connect to port 22 on 10.96.250.208`, `wait_for_ssh` `TimeoutException`,
        and `AssertionError: False is not true : Public network connectivity check
        failed`.\n\nL3 agent pod logs, `main` (neutron 28.1.0.dev560) versus a passing
        `stable/2025.2` build (neutron 27.0.19.dev7), both with `l3_ha: true`:\n\n|
        log evidence | main | stable/2025.2 |\n| --- | --- | --- |\n| `neutron.agent.l3.ha`
        state changes | **0** | 22 |\n| `transitioned to primary/backup` | **0** |
        22 |\n| `qg-` external gateway device | **0** | 7 |\n| `ip_monitor ... not
        found` | **10** | 0 |\n\n| | |\n| --- | --- |\n| Service | neutron |\n| Branch
        | `main` |\n| Image tag | `main` |\n| Old digest | `sha256:982622323bdb8e53bc6265d238b0a72659ef9525ff899aeafa41668bd9f13af8`
        |\n| New digest | `sha256:8fcfa7a0cd94b5382e1c5a59d51680d7f6e564fed27f1fc419b31e326678bb13`
        |\n| New source SHA | [`94e31c4e`](https://github.com/vexxhost/docker-neutron/commit/94e31c4ec2b356fc26acab995640ba79bdc3ebc1)
        (docker-neutron [#2276](https://github.com/vexxhost/docker-neutron/pull/2276))
        |\n\n**Validation**\n\n- The image's `org.opencontainers.image.revision` is
        `94e31c4ec2b356fc26acab995640ba79bdc3ebc1`, equal to the current head of `vexxhost/docker-neutron`
        `main`, so the `main` tag is not stale. `org.opencontainers.image.version`
        is `main`, matching the tag used in `roles/defaults/vars/main.yml`. Built
        2026-09-22T14:28:02Z.\n- `usr/bin/curl` is present in both the amd64 (297288
        bytes) and arm64 (329896 bytes) images. The build log shows `Setting up curl
        (8.5.0-2ubuntu10.13)` for both architectures.\n- Neutron version is unchanged
        at `28.1.0.dev560`, so this only adds the missing dependency.\n- All 20 `neutron_*`
        entries referencing this image were updated together (`neutron_bagpipe_bgp`,
        `neutron_bgp_dragent`, `neutron_db_sync`, `neutron_dhcp`, `neutron_ironic_agent_init`,
        `neutron_ironic_agent`, `neutron_l2gw`, `neutron_l3`, `neutron_linuxbridge_agent`,
        `neutron_metadata`, `neutron_netns_cleanup_cron`, `neutron_openvswitch_agent`,
        `neutron_ovn_metadata`, `neutron_ovn_vpn`, `neutron_server`, `neutron_rpc_server`,
        `neutron_sriov_agent_init`, `neutron_sriov_agent`, `neutron_policy_server`,
        `ovn_logging_parser`), and no references to the old digest remain in the repository.\n\n**Expected
        effect on CI**\n\nAll five remaining `main` AIO Tempest failures should clear
        once the external gateway is programmed. The signals to look for in the next
        AIO run are `neutron.agent.l3.ha ... transitioned to primary` appearing in
        the L3 agent log and zero `ip_monitor ... not found` lines.\n\n**Scope**\n\nOnly
        `main` is affected. Every stable branch still runs the Python monitor \u2014
        verified against the `openstack/neutron` ref pinned in each branch of `docker-neutron`
        \u2014 so no stable branch needs this. `openstack/neutron` `stable/2026.2`
        does contain the shell script, so a `stable/2026.2` branch here will need
        `curl` when it is created."
      change_url: https://github.com/vexxhost/atmosphere/pull/4397
      child_jobs: []
      commit_id: b6d8a77a742538a2a250c4e34f4d2a32ca696cfb
      event_id: 4d8af9b0-b692-11f1-8b32-36b90f9adcc2
      executor:
        hostname: 2d72f0692154
        inventory_file: /var/lib/zuul/builds/861574ceb43d441189f2cc27708d9894/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/861574ceb43d441189f2cc27708d9894/work/logs
        result_data_file: /var/lib/zuul/builds/861574ceb43d441189f2cc27708d9894/work/results.json
        src_root: /var/lib/zuul/builds/861574ceb43d441189f2cc27708d9894/work/src
        work_root: /var/lib/zuul/builds/861574ceb43d441189f2cc27708d9894/work
      include_vars: []
      items:
      - branch: main
        change: '4397'
        change_message: "fix(neutron): update image to the build that includes curl\n\nBumps
          the `ghcr.io/vexxhost/neutron:main` image on `main` to the build that installs
          `curl`.\n\n**Problem:** Neutron 28 rewrote the HA keepalived state-change
          monitor from a Python thread into a POSIX shell script (`bin/neutron-keepalived-state-change`).
          The old implementation notified the L3 agent with Python; the new one shells
          out:\n\n```sh\nset -e\nnotify_agent () {\n    socket=\"${STATE_PATH}/keepalived-state-change\"\n
          \   curl --connect-timeout 5 \\\n        -X POST \\\n        -H \"X-Neutron-Router-Id:
          ${ROUTER_ID}\" \\\n        -H \"X-Neutron-State: ${state}\" \\\n        -H
          \"Connection: close\" \\\n        --unix-socket \"${socket}\" \\\n        \"http://127.0.0.1/\"\n}\n```\n\n`curl`
          was not installed in the image (scanning every layer found no `curl` binary,
          only the unrelated `kombu/asynchronous/http/curl.py`), and `curl` is not
          in Neutron's `bindep.txt` either. The script runs under `set -e` with no
          `command -v curl` guard, so it exits 127 on its first notification attempt.\n\n**Resulting
          behaviour:** the L3 agent sees the monitor die and respawns it every `check_child_processes_interval`,
          indefinitely:\n\n```\nERROR   neutron.agent.linux.external_process [-] ip_monitor
          for router with uuid <uuid> not found. The process should not have died\nWARNING
          neutron.agent.linux.external_process [-] Respawning ip_monitor for uuid
          <uuid>\n```\n\nNo state change ever reaches the agent, so an HA router never
          transitions to primary and never programs its external gateway. Floating
          IPs are created and associated correctly \u2014 the Neutron server log shows
          `Floating IP 665d5772-... associated. External IP: 10.96.250.208` \u2014
          but nothing is reachable on them. In the AIO Zuul jobs this surfaces as
          five Tempest failures, all of them SSH to a floating IP: `paramiko.ssh_exception.NoValidConnectionsError:
          Unable to connect to port 22 on 10.96.250.208`, `wait_for_ssh` `TimeoutException`,
          and `AssertionError: False is not true : Public network connectivity check
          failed`.\n\nL3 agent pod logs, `main` (neutron 28.1.0.dev560) versus a passing
          `stable/2025.2` build (neutron 27.0.19.dev7), both with `l3_ha: true`:\n\n|
          log evidence | main | stable/2025.2 |\n| --- | --- | --- |\n| `neutron.agent.l3.ha`
          state changes | **0** | 22 |\n| `transitioned to primary/backup` | **0**
          | 22 |\n| `qg-` external gateway device | **0** | 7 |\n| `ip_monitor ...
          not found` | **10** | 0 |\n\n| | |\n| --- | --- |\n| Service | neutron |\n|
          Branch | `main` |\n| Image tag | `main` |\n| Old digest | `sha256:982622323bdb8e53bc6265d238b0a72659ef9525ff899aeafa41668bd9f13af8`
          |\n| New digest | `sha256:8fcfa7a0cd94b5382e1c5a59d51680d7f6e564fed27f1fc419b31e326678bb13`
          |\n| New source SHA | [`94e31c4e`](https://github.com/vexxhost/docker-neutron/commit/94e31c4ec2b356fc26acab995640ba79bdc3ebc1)
          (docker-neutron [#2276](https://github.com/vexxhost/docker-neutron/pull/2276))
          |\n\n**Validation**\n\n- The image's `org.opencontainers.image.revision`
          is `94e31c4ec2b356fc26acab995640ba79bdc3ebc1`, equal to the current head
          of `vexxhost/docker-neutron` `main`, so the `main` tag is not stale. `org.opencontainers.image.version`
          is `main`, matching the tag used in `roles/defaults/vars/main.yml`. Built
          2026-09-22T14:28:02Z.\n- `usr/bin/curl` is present in both the amd64 (297288
          bytes) and arm64 (329896 bytes) images. The build log shows `Setting up
          curl (8.5.0-2ubuntu10.13)` for both architectures.\n- Neutron version is
          unchanged at `28.1.0.dev560`, so this only adds the missing dependency.\n-
          All 20 `neutron_*` entries referencing this image were updated together
          (`neutron_bagpipe_bgp`, `neutron_bgp_dragent`, `neutron_db_sync`, `neutron_dhcp`,
          `neutron_ironic_agent_init`, `neutron_ironic_agent`, `neutron_l2gw`, `neutron_l3`,
          `neutron_linuxbridge_agent`, `neutron_metadata`, `neutron_netns_cleanup_cron`,
          `neutron_openvswitch_agent`, `neutron_ovn_metadata`, `neutron_ovn_vpn`,
          `neutron_server`, `neutron_rpc_server`, `neutron_sriov_agent_init`, `neutron_sriov_agent`,
          `neutron_policy_server`, `ovn_logging_parser`), and no references to the
          old digest remain in the repository.\n\n**Expected effect on CI**\n\nAll
          five remaining `main` AIO Tempest failures should clear once the external
          gateway is programmed. The signals to look for in the next AIO run are `neutron.agent.l3.ha
          ... transitioned to primary` appearing in the L3 agent log and zero `ip_monitor
          ... not found` lines.\n\n**Scope**\n\nOnly `main` is affected. Every stable
          branch still runs the Python monitor \u2014 verified against the `openstack/neutron`
          ref pinned in each branch of `docker-neutron` \u2014 so no stable branch
          needs this. `openstack/neutron` `stable/2026.2` does contain the shell script,
          so a `stable/2026.2` branch here will need `curl` when it is created."
        change_url: https://github.com/vexxhost/atmosphere/pull/4397
        commit_id: b6d8a77a742538a2a250c4e34f4d2a32ca696cfb
        patchset: b6d8a77a742538a2a250c4e34f4d2a32ca696cfb
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere
          name: vexxhost/atmosphere
          short_name: atmosphere
          src_dir: src/github.com/vexxhost/atmosphere
        topic: null
      job: atmosphere-molecule-csi-local-path-provisioner
      jobtags: []
      max_attempts: 3
      message: Zml4KG5ldXRyb24pOiB1cGRhdGUgaW1hZ2UgdG8gdGhlIGJ1aWxkIHRoYXQgaW5jbHVkZXMgY3VybAoKQnVtcHMgdGhlIGBnaGNyLmlvL3ZleHhob3N0L25ldXRyb246bWFpbmAgaW1hZ2Ugb24gYG1haW5gIHRvIHRoZSBidWlsZCB0aGF0IGluc3RhbGxzIGBjdXJsYC4KCioqUHJvYmxlbToqKiBOZXV0cm9uIDI4IHJld3JvdGUgdGhlIEhBIGtlZXBhbGl2ZWQgc3RhdGUtY2hhbmdlIG1vbml0b3IgZnJvbSBhIFB5dGhvbiB0aHJlYWQgaW50byBhIFBPU0lYIHNoZWxsIHNjcmlwdCAoYGJpbi9uZXV0cm9uLWtlZXBhbGl2ZWQtc3RhdGUtY2hhbmdlYCkuIFRoZSBvbGQgaW1wbGVtZW50YXRpb24gbm90aWZpZWQgdGhlIEwzIGFnZW50IHdpdGggUHl0aG9uOyB0aGUgbmV3IG9uZSBzaGVsbHMgb3V0OgoKYGBgc2gKc2V0IC1lCm5vdGlmeV9hZ2VudCAoKSB7CiAgICBzb2NrZXQ9IiR7U1RBVEVfUEFUSH0va2VlcGFsaXZlZC1zdGF0ZS1jaGFuZ2UiCiAgICBjdXJsIC0tY29ubmVjdC10aW1lb3V0IDUgXAogICAgICAgIC1YIFBPU1QgXAogICAgICAgIC1IICJYLU5ldXRyb24tUm91dGVyLUlkOiAke1JPVVRFUl9JRH0iIFwKICAgICAgICAtSCAiWC1OZXV0cm9uLVN0YXRlOiAke3N0YXRlfSIgXAogICAgICAgIC1IICJDb25uZWN0aW9uOiBjbG9zZSIgXAogICAgICAgIC0tdW5peC1zb2NrZXQgIiR7c29ja2V0fSIgXAogICAgICAgICJodHRwOi8vMTI3LjAuMC4xLyIKfQpgYGAKCmBjdXJsYCB3YXMgbm90IGluc3RhbGxlZCBpbiB0aGUgaW1hZ2UgKHNjYW5uaW5nIGV2ZXJ5IGxheWVyIGZvdW5kIG5vIGBjdXJsYCBiaW5hcnksIG9ubHkgdGhlIHVucmVsYXRlZCBga29tYnUvYXN5bmNocm9ub3VzL2h0dHAvY3VybC5weWApLCBhbmQgYGN1cmxgIGlzIG5vdCBpbiBOZXV0cm9uJ3MgYGJpbmRlcC50eHRgIGVpdGhlci4gVGhlIHNjcmlwdCBydW5zIHVuZGVyIGBzZXQgLWVgIHdpdGggbm8gYGNvbW1hbmQgLXYgY3VybGAgZ3VhcmQsIHNvIGl0IGV4aXRzIDEyNyBvbiBpdHMgZmlyc3Qgbm90aWZpY2F0aW9uIGF0dGVtcHQuCgoqKlJlc3VsdGluZyBiZWhhdmlvdXI6KiogdGhlIEwzIGFnZW50IHNlZXMgdGhlIG1vbml0b3IgZGllIGFuZCByZXNwYXducyBpdCBldmVyeSBgY2hlY2tfY2hpbGRfcHJvY2Vzc2VzX2ludGVydmFsYCwgaW5kZWZpbml0ZWx5OgoKYGBgCkVSUk9SICAgbmV1dHJvbi5hZ2VudC5saW51eC5leHRlcm5hbF9wcm9jZXNzIFstXSBpcF9tb25pdG9yIGZvciByb3V0ZXIgd2l0aCB1dWlkIDx1dWlkPiBub3QgZm91bmQuIFRoZSBwcm9jZXNzIHNob3VsZCBub3QgaGF2ZSBkaWVkCldBUk5JTkcgbmV1dHJvbi5hZ2VudC5saW51eC5leHRlcm5hbF9wcm9jZXNzIFstXSBSZXNwYXduaW5nIGlwX21vbml0b3IgZm9yIHV1aWQgPHV1aWQ+CmBgYAoKTm8gc3RhdGUgY2hhbmdlIGV2ZXIgcmVhY2hlcyB0aGUgYWdlbnQsIHNvIGFuIEhBIHJvdXRlciBuZXZlciB0cmFuc2l0aW9ucyB0byBwcmltYXJ5IGFuZCBuZXZlciBwcm9ncmFtcyBpdHMgZXh0ZXJuYWwgZ2F0ZXdheS4gRmxvYXRpbmcgSVBzIGFyZSBjcmVhdGVkIGFuZCBhc3NvY2lhdGVkIGNvcnJlY3RseSDigJQgdGhlIE5ldXRyb24gc2VydmVyIGxvZyBzaG93cyBgRmxvYXRpbmcgSVAgNjY1ZDU3NzItLi4uIGFzc29jaWF0ZWQuIEV4dGVybmFsIElQOiAxMC45Ni4yNTAuMjA4YCDigJQgYnV0IG5vdGhpbmcgaXMgcmVhY2hhYmxlIG9uIHRoZW0uIEluIHRoZSBBSU8gWnV1bCBqb2JzIHRoaXMgc3VyZmFjZXMgYXMgZml2ZSBUZW1wZXN0IGZhaWx1cmVzLCBhbGwgb2YgdGhlbSBTU0ggdG8gYSBmbG9hdGluZyBJUDogYHBhcmFtaWtvLnNzaF9leGNlcHRpb24uTm9WYWxpZENvbm5lY3Rpb25zRXJyb3I6IFVuYWJsZSB0byBjb25uZWN0IHRvIHBvcnQgMjIgb24gMTAuOTYuMjUwLjIwOGAsIGB3YWl0X2Zvcl9zc2hgIGBUaW1lb3V0RXhjZXB0aW9uYCwgYW5kIGBBc3NlcnRpb25FcnJvcjogRmFsc2UgaXMgbm90IHRydWUgOiBQdWJsaWMgbmV0d29yayBjb25uZWN0aXZpdHkgY2hlY2sgZmFpbGVkYC4KCkwzIGFnZW50IHBvZCBsb2dzLCBgbWFpbmAgKG5ldXRyb24gMjguMS4wLmRldjU2MCkgdmVyc3VzIGEgcGFzc2luZyBgc3RhYmxlLzIwMjUuMmAgYnVpbGQgKG5ldXRyb24gMjcuMC4xOS5kZXY3KSwgYm90aCB3aXRoIGBsM19oYTogdHJ1ZWA6Cgp8IGxvZyBldmlkZW5jZSB8IG1haW4gfCBzdGFibGUvMjAyNS4yIHwKfCAtLS0gfCAtLS0gfCAtLS0gfAp8IGBuZXV0cm9uLmFnZW50LmwzLmhhYCBzdGF0ZSBjaGFuZ2VzIHwgKiowKiogfCAyMiB8CnwgYHRyYW5zaXRpb25lZCB0byBwcmltYXJ5L2JhY2t1cGAgfCAqKjAqKiB8IDIyIHwKfCBgcWctYCBleHRlcm5hbCBnYXRld2F5IGRldmljZSB8ICoqMCoqIHwgNyB8CnwgYGlwX21vbml0b3IgLi4uIG5vdCBmb3VuZGAgfCAqKjEwKiogfCAwIHwKCnwgfCB8CnwgLS0tIHwgLS0tIHwKfCBTZXJ2aWNlIHwgbmV1dHJvbiB8CnwgQnJhbmNoIHwgYG1haW5gIHwKfCBJbWFnZSB0YWcgfCBgbWFpbmAgfAp8IE9sZCBkaWdlc3QgfCBgc2hhMjU2Ojk4MjYyMjMyM2JkYjhlNTNiYzYyNjVkMjM4YjBhNzI2NTllZjk1MjVmZjg5OWFlYWZhNDE2NjhiZDlmMTNhZjhgIHwKfCBOZXcgZGlnZXN0IHwgYHNoYTI1Njo4ZmNmYTdhMGNkOTRiNTM4MmUxYzVhNTlkNTE2ODBkN2Y2ZTU2NGZlZDI3ZjFmYzQxOWIzMWUzMjY2NzhiYjEzYCB8CnwgTmV3IHNvdXJjZSBTSEEgfCBbYDk0ZTMxYzRlYF0oaHR0cHM6Ly9naXRodWIuY29tL3ZleHhob3N0L2RvY2tlci1uZXV0cm9uL2NvbW1pdC85NGUzMWM0ZWMyYjM1NmZjMjZhY2FiOTk1NjQwYmE3OWJkYzNlYmMxKSAoZG9ja2VyLW5ldXRyb24gWyMyMjc2XShodHRwczovL2dpdGh1Yi5jb20vdmV4eGhvc3QvZG9ja2VyLW5ldXRyb24vcHVsbC8yMjc2KSkgfAoKKipWYWxpZGF0aW9uKioKCi0gVGhlIGltYWdlJ3MgYG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5yZXZpc2lvbmAgaXMgYDk0ZTMxYzRlYzJiMzU2ZmMyNmFjYWI5OTU2NDBiYTc5YmRjM2ViYzFgLCBlcXVhbCB0byB0aGUgY3VycmVudCBoZWFkIG9mIGB2ZXh4aG9zdC9kb2NrZXItbmV1dHJvbmAgYG1haW5gLCBzbyB0aGUgYG1haW5gIHRhZyBpcyBub3Qgc3RhbGUuIGBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVyc2lvbmAgaXMgYG1haW5gLCBtYXRjaGluZyB0aGUgdGFnIHVzZWQgaW4gYHJvbGVzL2RlZmF1bHRzL3ZhcnMvbWFpbi55bWxgLiBCdWlsdCAyMDI2LTA5LTIyVDE0OjI4OjAyWi4KLSBgdXNyL2Jpbi9jdXJsYCBpcyBwcmVzZW50IGluIGJvdGggdGhlIGFtZDY0ICgyOTcyODggYnl0ZXMpIGFuZCBhcm02NCAoMzI5ODk2IGJ5dGVzKSBpbWFnZXMuIFRoZSBidWlsZCBsb2cgc2hvd3MgYFNldHRpbmcgdXAgY3VybCAoOC41LjAtMnVidW50dTEwLjEzKWAgZm9yIGJvdGggYXJjaGl0ZWN0dXJlcy4KLSBOZXV0cm9uIHZlcnNpb24gaXMgdW5jaGFuZ2VkIGF0IGAyOC4xLjAuZGV2NTYwYCwgc28gdGhpcyBvbmx5IGFkZHMgdGhlIG1pc3NpbmcgZGVwZW5kZW5jeS4KLSBBbGwgMjAgYG5ldXRyb25fKmAgZW50cmllcyByZWZlcmVuY2luZyB0aGlzIGltYWdlIHdlcmUgdXBkYXRlZCB0b2dldGhlciAoYG5ldXRyb25fYmFncGlwZV9iZ3BgLCBgbmV1dHJvbl9iZ3BfZHJhZ2VudGAsIGBuZXV0cm9uX2RiX3N5bmNgLCBgbmV1dHJvbl9kaGNwYCwgYG5ldXRyb25faXJvbmljX2FnZW50X2luaXRgLCBgbmV1dHJvbl9pcm9uaWNfYWdlbnRgLCBgbmV1dHJvbl9sMmd3YCwgYG5ldXRyb25fbDNgLCBgbmV1dHJvbl9saW51eGJyaWRnZV9hZ2VudGAsIGBuZXV0cm9uX21ldGFkYXRhYCwgYG5ldXRyb25fbmV0bnNfY2xlYW51cF9jcm9uYCwgYG5ldXRyb25fb3BlbnZzd2l0Y2hfYWdlbnRgLCBgbmV1dHJvbl9vdm5fbWV0YWRhdGFgLCBgbmV1dHJvbl9vdm5fdnBuYCwgYG5ldXRyb25fc2VydmVyYCwgYG5ldXRyb25fcnBjX3NlcnZlcmAsIGBuZXV0cm9uX3NyaW92X2FnZW50X2luaXRgLCBgbmV1dHJvbl9zcmlvdl9hZ2VudGAsIGBuZXV0cm9uX3BvbGljeV9zZXJ2ZXJgLCBgb3ZuX2xvZ2dpbmdfcGFyc2VyYCksIGFuZCBubyByZWZlcmVuY2VzIHRvIHRoZSBvbGQgZGlnZXN0IHJlbWFpbiBpbiB0aGUgcmVwb3NpdG9yeS4KCioqRXhwZWN0ZWQgZWZmZWN0IG9uIENJKioKCkFsbCBmaXZlIHJlbWFpbmluZyBgbWFpbmAgQUlPIFRlbXBlc3QgZmFpbHVyZXMgc2hvdWxkIGNsZWFyIG9uY2UgdGhlIGV4dGVybmFsIGdhdGV3YXkgaXMgcHJvZ3JhbW1lZC4gVGhlIHNpZ25hbHMgdG8gbG9vayBmb3IgaW4gdGhlIG5leHQgQUlPIHJ1biBhcmUgYG5ldXRyb24uYWdlbnQubDMuaGEgLi4uIHRyYW5zaXRpb25lZCB0byBwcmltYXJ5YCBhcHBlYXJpbmcgaW4gdGhlIEwzIGFnZW50IGxvZyBhbmQgemVybyBgaXBfbW9uaXRvciAuLi4gbm90IGZvdW5kYCBsaW5lcy4KCioqU2NvcGUqKgoKT25seSBgbWFpbmAgaXMgYWZmZWN0ZWQuIEV2ZXJ5IHN0YWJsZSBicmFuY2ggc3RpbGwgcnVucyB0aGUgUHl0aG9uIG1vbml0b3Ig4oCUIHZlcmlmaWVkIGFnYWluc3QgdGhlIGBvcGVuc3RhY2svbmV1dHJvbmAgcmVmIHBpbm5lZCBpbiBlYWNoIGJyYW5jaCBvZiBgZG9ja2VyLW5ldXRyb25gIOKAlCBzbyBubyBzdGFibGUgYnJhbmNoIG5lZWRzIHRoaXMuIGBvcGVuc3RhY2svbmV1dHJvbmAgYHN0YWJsZS8yMDI2LjJgIGRvZXMgY29udGFpbiB0aGUgc2hlbGwgc2NyaXB0LCBzbyBhIGBzdGFibGUvMjAyNi4yYCBicmFuY2ggaGVyZSB3aWxsIG5lZWQgYGN1cmxgIHdoZW4gaXQgaXMgY3JlYXRlZC4=
      patchset: b6d8a77a742538a2a250c4e34f4d2a32ca696cfb
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 298983cd1253e6833abdb49d87d912527e0e6597
          trusted/project_1/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: 84e38666fab1ba8fda552ad6faff9404811352ca
          trusted/project_2/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: c286bf94224b5660b8e49e9a058289e61062a9a0
          untrusted/project_0/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: c286bf94224b5660b8e49e9a058289e61062a9a0
          untrusted/project_1/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 298983cd1253e6833abdb49d87d912527e0e6597
          untrusted/project_2/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: 84e38666fab1ba8fda552ad6faff9404811352ca
          untrusted/project_3/github.com/vexxhost/atmosphere-zuul-jobs:
            canonical_name: github.com/vexxhost/atmosphere-zuul-jobs
            checkout: main
            commit: a05c8ee068edf95d57873f78e89ff5b01c9098ce
          untrusted/project_4/opendev.org/openstack/openstack-helm:
            canonical_name: opendev.org/openstack/openstack-helm
            checkout: master
            commit: 8847f4e5087affe10460c76b078bdd992d74f032
        playbooks:
        - path: untrusted/project_0/github.com/vexxhost/zuul-jobs/playbooks/molecule/run.yaml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/playbook_0/role_1/zuul-jobs
            link_target: untrusted/project_2/opendev.org/zuul/zuul-jobs
            role_path: ansible/playbook_0/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/playbook_0/role_2/zuul-jobs
            link_target: untrusted/project_0/github.com/vexxhost/zuul-jobs
            role_path: ansible/playbook_0/role_2/zuul-jobs/roles
        post_playbooks:
        - path: untrusted/project_3/github.com/vexxhost/atmosphere-zuul-jobs/playbooks/molecule/post.yml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/post_playbook_0/role_1/openstack-helm
            link_target: untrusted/project_4/opendev.org/openstack/openstack-helm
            role_path: ansible/post_playbook_0/role_1/openstack-helm/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/post_playbook_0/role_3/zuul-jobs
            link_target: untrusted/project_2/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_0/role_3/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_0/role_4/zuul-jobs
            link_target: untrusted/project_0/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_0/role_4/zuul-jobs/roles
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/post.yaml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/post_playbook_1/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_1/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_1/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_1/role_2/zuul-jobs/roles
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/post-logs.yaml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/post_playbook_2/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_2/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_2/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_2/role_2/zuul-jobs/roles
        pre_playbooks:
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/pre.yaml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/pre_playbook_0/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_0/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_0/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_0/role_2/zuul-jobs/roles
        - path: untrusted/project_0/github.com/vexxhost/zuul-jobs/playbooks/molecule/pre.yaml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/pre_playbook_1/role_1/zuul-jobs
            link_target: untrusted/project_2/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_1/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/pre_playbook_1/role_2/zuul-jobs
            link_target: untrusted/project_0/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_1/role_2/zuul-jobs/roles
        - path: untrusted/project_3/github.com/vexxhost/atmosphere-zuul-jobs/playbooks/molecule/pre.yml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/pre_playbook_2/role_1/openstack-helm
            link_target: untrusted/project_4/opendev.org/openstack/openstack-helm
            role_path: ansible/pre_playbook_2/role_1/openstack-helm/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/pre_playbook_2/role_3/zuul-jobs
            link_target: untrusted/project_2/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_2/role_3/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_2/role_4/zuul-jobs
            link_target: untrusted/project_0/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_2/role_4/zuul-jobs/roles
      post_review: false
      post_timeout: null
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/vexxhost/atmosphere
        name: vexxhost/atmosphere
        short_name: atmosphere
        src_dir: src/github.com/vexxhost/atmosphere
      projects:
        github.com/ansible-collections/ansible.netcommon:
          canonical_hostname: github.com
          canonical_name: github.com/ansible-collections/ansible.netcommon
          checkout: main
          checkout_description: zuul branch
          commit: b3ccb0f47a955ae56c67c18d90ff659a017c88e9
          name: ansible-collections/ansible.netcommon
          required: true
          short_name: ansible.netcommon
          src_dir: src/github.com/ansible-collections/ansible.netcommon
        github.com/ansible-collections/ansible.posix:
          canonical_hostname: github.com
          canonical_name: github.com/ansible-collections/ansible.posix
          checkout: main
          checkout_description: zuul branch
          commit: d5699a3fcfca765b32f94b68a592139dc58d0301
          name: ansible-collections/ansible.posix
          required: true
          short_name: ansible.posix
          src_dir: src/github.com/ansible-collections/ansible.posix
        github.com/ansible-collections/ansible.utils:
          canonical_hostname: github.com
          canonical_name: github.com/ansible-collections/ansible.utils
          checkout: main
          checkout_description: zuul branch
          commit: 1f3e1bdfe2ba8904d397222dd6f90911d6f2402b
          name: ansible-collections/ansible.utils
          required: true
          short_name: ansible.utils
          src_dir: src/github.com/ansible-collections/ansible.utils
        github.com/ansible-collections/community.crypto:
          canonical_hostname: github.com
          canonical_name: github.com/ansible-collections/community.crypto
          checkout: main
          checkout_description: zuul branch
          commit: f5e7cf34b47daea77edc92654189c4ef7c0be15b
          name: ansible-collections/community.crypto
          required: true
          short_name: community.crypto
          src_dir: src/github.com/ansible-collections/community.crypto
        github.com/ansible-collections/community.general:
          canonical_hostname: github.com
          canonical_name: github.com/ansible-collections/community.general
          checkout: main
          checkout_description: zuul branch
          commit: 4e9d373454654a2cc8ee7ed89ad74a5acb8ff86a
          name: ansible-collections/community.general
          required: true
          short_name: community.general
          src_dir: src/github.com/ansible-collections/community.general
        github.com/ansible-collections/community.mysql:
          canonical_hostname: github.com
          canonical_name: github.com/ansible-collections/community.mysql
          checkout: main
          checkout_description: zuul branch
          commit: 4cf7a3176fbd07be43459f1366e8066381df6d97
          name: ansible-collections/community.mysql
          required: true
          short_name: community.mysql
          src_dir: src/github.com/ansible-collections/community.mysql
        github.com/ansible-collections/kubernetes.core:
          canonical_hostname: github.com
          canonical_name: github.com/ansible-collections/kubernetes.core
          checkout: main
          checkout_description: zuul branch
          commit: b7e1ed566173acf05d7a2dfbe7a94fdc2a1e8d97
          name: ansible-collections/kubernetes.core
          required: true
          short_name: kubernetes.core
          src_dir: src/github.com/ansible-collections/kubernetes.core
        github.com/vexxhost/ansible-collection-ceph:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/ansible-collection-ceph
          checkout: main
          checkout_description: zuul branch
          commit: 44a694a80e3179c28d75180baa1a56426f987257
          name: vexxhost/ansible-collection-ceph
          required: true
          short_name: ansible-collection-ceph
          src_dir: src/github.com/vexxhost/ansible-collection-ceph
        github.com/vexxhost/ansible-collection-containers:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/ansible-collection-containers
          checkout: main
          checkout_description: zuul branch
          commit: d22923ebd40c0fd5a345318c1db90d125fb5140f
          name: vexxhost/ansible-collection-containers
          required: true
          short_name: ansible-collection-containers
          src_dir: src/github.com/vexxhost/ansible-collection-containers
        github.com/vexxhost/ansible-collection-kubernetes:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/ansible-collection-kubernetes
          checkout: main
          checkout_description: zuul branch
          commit: bb3fd0fde58a5b158605523e708645eb2a763886
          name: vexxhost/ansible-collection-kubernetes
          required: true
          short_name: ansible-collection-kubernetes
          src_dir: src/github.com/vexxhost/ansible-collection-kubernetes
        github.com/vexxhost/atmosphere:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere
          checkout: main
          checkout_description: zuul branch
          commit: b6d8a77a742538a2a250c4e34f4d2a32ca696cfb
          name: vexxhost/atmosphere
          required: false
          short_name: atmosphere
          src_dir: src/github.com/vexxhost/atmosphere
        github.com/vexxhost/atmosphere.common:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere.common
          checkout: main
          checkout_description: zuul branch
          commit: 0317937da7abc1979d331af8b8f7b640b80d7e75
          name: vexxhost/atmosphere.common
          required: true
          short_name: atmosphere.common
          src_dir: src/github.com/vexxhost/atmosphere.common
        opendev.org/openstack/ansible-collections-openstack:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/ansible-collections-openstack
          checkout: master
          checkout_description: project default branch
          commit: da4a211b2d1dd147dead0e3db63a373b43b3c09e
          name: openstack/ansible-collections-openstack
          required: true
          short_name: ansible-collections-openstack
          src_dir: src/opendev.org/openstack/ansible-collections-openstack
      ref: refs/pull/4397/head
      resources: {}
      tenant: oss
      timeout: 1800
      topic: null
      voting: true
