all:
  children:
    cephs:
      hosts:
        instance: null
    computes:
      hosts:
        instance: null
    controllers:
      hosts:
        instance: null
    zuul_unreachable:
      hosts: {}
  hosts:
    instance:
      ansible_connection: ssh
      ansible_host: 199.204.45.109
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      atmosphere_image_prefix: harbor.atmosphere.dev/
      atmosphere_network_backend: ovn
      barbican_helm_values:
        pod:
          replicas:
            api: 1
      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
      ceph_version: 18.2.7
      cilium_helm_values:
        operator:
          replicas: 1
      cinder_helm_values:
        conf:
          ceph:
            pools:
              backup:
                replication: 1
              cinder.volumes:
                replication: 1
          cinder:
            DEFAULT:
              osapi_volume_workers: 2
        pod:
          replicas:
            api: 1
            scheduler: 1
      cluster_issuer_type: self-signed
      coredns_helm_values:
        replicaCount: 1
      csi_driver: local-path-provisioner
      glance_helm_values:
        conf:
          glance:
            DEFAULT:
              workers: 2
            glance_store:
              rbd_store_replication: 1
        pod:
          replicas:
            api: 1
      glance_images:
      - container_format: bare
        disk_format: raw
        is_public: true
        min_disk: 1
        name: cirros
        url: http://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img
      heat_helm_values:
        conf:
          heat:
            DEFAULT:
              num_engine_workers: 2
            heat_api:
              workers: 2
            heat_api_cfn:
              workers: 2
            heat_api_cloudwatch:
              workers: 2
        pod:
          replicas:
            api: 1
            cfn: 1
            cloudwatch: 1
            engine: 1
      horizon_helm_values:
        pod:
          replicas:
            server: 1
      ingress_nginx_helm_values:
        controller:
          config:
            worker-processes: 2
      keystone_helm_values:
        pod:
          replicas:
            api: 1
      kube_vip_address: 172.17.0.100
      kube_vip_interface: '{{ ansible_facts[''default_ipv4''].interface }}'
      kubernetes_hostname: '{{ ansible_facts[''default_ipv4''].address }}'
      kubernetes_keepalived_interface: br-mgmt
      magnum_helm_values:
        conf:
          magnum:
            api:
              workers: 2
            conductor:
              workers: 2
        pod:
          replicas:
            api: 1
            conductor: 1
      magnum_image_disk_format: qcow2
      magnum_images: '[ {{ _magnum_images[-1] }} ]'
      manila_helm_values:
        conf:
          manila:
            DEFAULT:
              osapi_share_workers: 2
        pod:
          replicas:
            api: 1
            scheduler: 1
      molecule_install_collection_siblings: true
      molecule_scenario: aio
      neutron_helm_values:
        conf:
          neutron:
            DEFAULT:
              api_workers: 2
              metadata_workers: 2
              rpc_workers: 2
        pod:
          replicas:
            rpc_server: 1
            server: 1
      nodepool:
        az: nova
        cloud: public
        external_id: e4931088-6314-4cdf-a907-0ecca5b652a7
        host_id: 571d5e5ab8f99eb6066d22838dc03059a55de74ec327a875b342f73d
        interface_ip: 199.204.45.109
        label: ubuntu-jammy-16
        node_properties: {}
        private_ipv4: 199.204.45.109
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.109
        public_ipv6: 2604:e100:1:0:f816:3eff:fe3c:b566
        region: ca-ymq-1
        slot: null
      nova_helm_values:
        conf:
          nova:
            DEFAULT:
              metadata_workers: 2
              osapi_compute_workers: 2
            conductor:
              workers: 2
            scheduler:
              workers: 2
        pod:
          replicas:
            api_metadata: 1
            conductor: 1
            novncproxy: 1
            osapi: 1
            scheduler: 1
            spiceproxy: 1
      octavia_helm_values:
        conf:
          octavia:
            controller_worker:
              workers: 2
          octavia_api_uwsgi:
            uwsgi:
              processes: 2
        pod:
          replicas:
            api: 1
            housekeeping: 1
            worker: 1
      ovn_helm_values:
        conf:
          auto_bridge_add:
            br-ex: null
        pod:
          replicas:
            ovn_northd: 1
            ovn_ovsdb_nb: 1
            ovn_ovsdb_sb: 1
      percona_xtradb_cluster_spec:
        allowUnsafeConfigurations: true
        haproxy:
          size: 1
        pxc:
          size: 1
      placement_helm_values:
        conf:
          placement_api_uwsgi:
            uwsgi:
              processes: 2
        pod:
          replicas:
            api: 1
      rook_ceph_cluster_radosgw_spec:
        dataPool:
          failureDomain: osd
        gateway:
          instances: 1
        metadataPool:
          failureDomain: osd
      staffeln_helm_values:
        pod:
          replicas:
            api: 1
            conductor: 1
      valkey_helm_values:
        replica:
          replicaCount: 1
      zuul_node:
        az: nova
        cloud: public
        external_id: e4931088-6314-4cdf-a907-0ecca5b652a7
        host_id: 571d5e5ab8f99eb6066d22838dc03059a55de74ec327a875b342f73d
        interface_ip: 199.204.45.109
        label: ubuntu-jammy-16
        node_properties: {}
        private_ipv4: 199.204.45.109
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.109
        public_ipv6: 2604:e100:1:0:f816:3eff:fe3c:b566
        region: ca-ymq-1
        slot: null
        uuid: null
  vars:
    atmosphere_image_prefix: harbor.atmosphere.dev/
    atmosphere_network_backend: ovn
    barbican_helm_values:
      pod:
        replicas:
          api: 1
    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
    ceph_version: 18.2.7
    cilium_helm_values:
      operator:
        replicas: 1
    cinder_helm_values:
      conf:
        ceph:
          pools:
            backup:
              replication: 1
            cinder.volumes:
              replication: 1
        cinder:
          DEFAULT:
            osapi_volume_workers: 2
      pod:
        replicas:
          api: 1
          scheduler: 1
    cluster_issuer_type: self-signed
    coredns_helm_values:
      replicaCount: 1
    csi_driver: local-path-provisioner
    glance_helm_values:
      conf:
        glance:
          DEFAULT:
            workers: 2
          glance_store:
            rbd_store_replication: 1
      pod:
        replicas:
          api: 1
    glance_images:
    - container_format: bare
      disk_format: raw
      is_public: true
      min_disk: 1
      name: cirros
      url: http://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img
    heat_helm_values:
      conf:
        heat:
          DEFAULT:
            num_engine_workers: 2
          heat_api:
            workers: 2
          heat_api_cfn:
            workers: 2
          heat_api_cloudwatch:
            workers: 2
      pod:
        replicas:
          api: 1
          cfn: 1
          cloudwatch: 1
          engine: 1
    horizon_helm_values:
      pod:
        replicas:
          server: 1
    ingress_nginx_helm_values:
      controller:
        config:
          worker-processes: 2
    keystone_helm_values:
      pod:
        replicas:
          api: 1
    kube_vip_address: 172.17.0.100
    kube_vip_interface: '{{ ansible_facts[''default_ipv4''].interface }}'
    kubernetes_hostname: '{{ ansible_facts[''default_ipv4''].address }}'
    kubernetes_keepalived_interface: br-mgmt
    magnum_helm_values:
      conf:
        magnum:
          api:
            workers: 2
          conductor:
            workers: 2
      pod:
        replicas:
          api: 1
          conductor: 1
    magnum_image_disk_format: qcow2
    magnum_images: '[ {{ _magnum_images[-1] }} ]'
    manila_helm_values:
      conf:
        manila:
          DEFAULT:
            osapi_share_workers: 2
      pod:
        replicas:
          api: 1
          scheduler: 1
    molecule_install_collection_siblings: true
    molecule_scenario: aio
    neutron_helm_values:
      conf:
        neutron:
          DEFAULT:
            api_workers: 2
            metadata_workers: 2
            rpc_workers: 2
      pod:
        replicas:
          rpc_server: 1
          server: 1
    nova_helm_values:
      conf:
        nova:
          DEFAULT:
            metadata_workers: 2
            osapi_compute_workers: 2
          conductor:
            workers: 2
          scheduler:
            workers: 2
      pod:
        replicas:
          api_metadata: 1
          conductor: 1
          novncproxy: 1
          osapi: 1
          scheduler: 1
          spiceproxy: 1
    octavia_helm_values:
      conf:
        octavia:
          controller_worker:
            workers: 2
        octavia_api_uwsgi:
          uwsgi:
            processes: 2
      pod:
        replicas:
          api: 1
          housekeeping: 1
          worker: 1
    ovn_helm_values:
      conf:
        auto_bridge_add:
          br-ex: null
      pod:
        replicas:
          ovn_northd: 1
          ovn_ovsdb_nb: 1
          ovn_ovsdb_sb: 1
    percona_xtradb_cluster_spec:
      allowUnsafeConfigurations: true
      haproxy:
        size: 1
      pxc:
        size: 1
    placement_helm_values:
      conf:
        placement_api_uwsgi:
          uwsgi:
            processes: 2
      pod:
        replicas:
          api: 1
    rook_ceph_cluster_radosgw_spec:
      dataPool:
        failureDomain: osd
      gateway:
        instances: 1
      metadataPool:
        failureDomain: osd
    staffeln_helm_values:
      pod:
        replicas:
          api: 1
          conductor: 1
    valkey_helm_values:
      replica:
        replicaCount: 1
    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-aio explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/atmosphere-zuul-jobs/zuul.d/jobs.yaml@main#73>'
      - '<Job atmosphere-molecule-aio-ovn explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/atmosphere-zuul-jobs/zuul.d/jobs.yaml@main#261>'
      - '<Job atmosphere-molecule-aio-ovn explicit: None implied: None source: vexxhost/atmosphere-zuul-jobs/zuul.d/project-templates.yaml@main#1>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 596ce76fb77d4410acab709180b8d92b
      build_refs:
      - branch: main
        change: '3925'
        change_message: "feat(neutron): add neutron ironic agent support\n\n## Summary\r\n\r\n-
          add Neutron Helm values for the baremetal ML2 backend and `[ironic]` credentials\r\n-
          append those values only when the final Helm values enable `manifests.deployment_ironic_agent`\r\n-
          source Ironic region, username, and password from `openstack_helm_endpoints`
          instead of hardcoding Keystone auth details\r\n\r\n### short version for
          ironic-neutron-agent  and baremetal driver intro\r\n\r\n  ironic-neutron-agent
          tells Neutron which physical networks each Ironic bare metal node can reach.
          That information lets Neutron\r\n  place bare metal ports on the right network
          segment, VLAN, provider network, or routed provider network.\r\n\r\n  This
          PR enables two required pieces together:\r\n\r\n  - ironic-neutron-agent
          syncs Ironic node and port network information into Neutron.\r\n  - baremetal
          in network.backend enables the ML2 binding path for Neutron ports using
          vnic_type=baremetal.\r\n\r\n  Without the baremetal backend, the agent can
          report the topology, but Neutron may still fail to bind bare metal ports
          because ML2\r\n  does not have the driver for that binding path.\r\n\r\n
          \ This stays opt-in through manifests.deployment_ironic_agent, so the default
          Neutron deployment remains unchanged.\r\n\r\n### Long version for ironic-neutron-agent
          \ and baremetal driver intro\r\n\r\nironic-neutron-agent is a Neutron-side
          service used with OpenStack Ironic bare-metal nodes.\r\n\r\nIts main job
          is to tell Neutron which physical networks each bare-metal node can reach.
          This allows Neutron to correctly bind bare-metal ports to the right network
          segment, VLAN, provider network, or routed network.\r\n\r\nIn practice,
          it helps with:\r\n\r\n* Mapping Ironic nodes to physical networks\r\n* Supporting
          bare-metal Neutron port binding\r\n* Enabling tenant, provisioning, cleaning,
          and rescue network transitions\r\n* Helping ML2/switch drivers configure
          the correct switch ports or VLANs\r\n* Supporting routed provider networks\r\n*
          Improving OVN bare-metal networking features in newer deployments\r\n\r\nIt
          does not power on servers, install operating systems, run inside the bare-metal
          node, or directly manage hardware. Those tasks are handled by Ironic, ironic-python-agent,
          and hardware drivers.\r\n\r\nIn short: ironic-neutron-agent lets Neutron
          understand and manage networking for Ironic bare-metal nodes.\r\n\r\nAdding
          some context on why this PR enables the baremetal ML2 backend together with
          the Neutron Ironic agent:\r\n\r\nThe Neutron Ironic agent is only the service
          that reports Ironic bare metal port and physical network information back
          to Neutron. That gives Neutron the inventory and reachability data it needs,
          but it does not by itself teach ML2 how to bind a Neutron port whose binding:vnic_type
          is baremetal.\r\n\r\nFor the bind flow to work end to end, Neutron also
          needs the baremetal mechanism/backend enabled in network.backend. That backend
          is what lets ML2 recognize bare metal ports, use the Ironic-side physical
          network information, and produce a valid binding for provider or routed
          provider networks. Without it, we can deploy ironic-neutron-agent, but Neutron
          can still reject or fail to bind bare metal ports because the ML2 backend
          list does not include the driver responsible for that binding path.\r\n\r\nSo
          these two pieces cover different sides of the same feature:\r\n\r\nironic-neutron-agent
          syncs Ironic node/port network information into Neutron.\r\nbaremetal in
          network.backend enables the ML2 binding path for Neutron ports using vnic_type=baremetal.\r\nThat
          is why this change appends baremetal alongside the existing Atmosphere network
          backend only when operators opt in by enabling manifests.deployment_ironic_agent.
          It keeps the default Neutron deployment unchanged, while making the opt-in
          Ironic networking path complete.\r\n\r\n## Notes\r\n\r\nThis intentionally
          ports only the `roles/neutron/vars/main.yml` and `roles/neutron/tasks/main.yml`
          portions from `ricolin/atmosphere#11`. It does not set `manifests.deployment_ironic_agent`;
          operators still opt in through `neutron_helm_values`.\r\n\r\n## Validation\r\n\r\n-
          `python3` YAML parse for `roles/neutron/vars/main.yml` and `roles/neutron/tasks/main.yml`\r\n-
          local `ansible-playbook` smoke test for false/true `deployment_ironic_agent`
          conditional behavior\r\n- `git diff --check`"
        change_url: https://github.com/vexxhost/atmosphere/pull/3925
        commit_id: b39c821316846b3143e927d02dc22e8cb0dcada7
        patchset: b39c821316846b3143e927d02dc22e8cb0dcada7
        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: ab687b0d47084d489326120f5c5c625d
      buildset_refs:
      - branch: main
        change: '3925'
        change_message: "feat(neutron): add neutron ironic agent support\n\n## Summary\r\n\r\n-
          add Neutron Helm values for the baremetal ML2 backend and `[ironic]` credentials\r\n-
          append those values only when the final Helm values enable `manifests.deployment_ironic_agent`\r\n-
          source Ironic region, username, and password from `openstack_helm_endpoints`
          instead of hardcoding Keystone auth details\r\n\r\n### short version for
          ironic-neutron-agent  and baremetal driver intro\r\n\r\n  ironic-neutron-agent
          tells Neutron which physical networks each Ironic bare metal node can reach.
          That information lets Neutron\r\n  place bare metal ports on the right network
          segment, VLAN, provider network, or routed provider network.\r\n\r\n  This
          PR enables two required pieces together:\r\n\r\n  - ironic-neutron-agent
          syncs Ironic node and port network information into Neutron.\r\n  - baremetal
          in network.backend enables the ML2 binding path for Neutron ports using
          vnic_type=baremetal.\r\n\r\n  Without the baremetal backend, the agent can
          report the topology, but Neutron may still fail to bind bare metal ports
          because ML2\r\n  does not have the driver for that binding path.\r\n\r\n
          \ This stays opt-in through manifests.deployment_ironic_agent, so the default
          Neutron deployment remains unchanged.\r\n\r\n### Long version for ironic-neutron-agent
          \ and baremetal driver intro\r\n\r\nironic-neutron-agent is a Neutron-side
          service used with OpenStack Ironic bare-metal nodes.\r\n\r\nIts main job
          is to tell Neutron which physical networks each bare-metal node can reach.
          This allows Neutron to correctly bind bare-metal ports to the right network
          segment, VLAN, provider network, or routed network.\r\n\r\nIn practice,
          it helps with:\r\n\r\n* Mapping Ironic nodes to physical networks\r\n* Supporting
          bare-metal Neutron port binding\r\n* Enabling tenant, provisioning, cleaning,
          and rescue network transitions\r\n* Helping ML2/switch drivers configure
          the correct switch ports or VLANs\r\n* Supporting routed provider networks\r\n*
          Improving OVN bare-metal networking features in newer deployments\r\n\r\nIt
          does not power on servers, install operating systems, run inside the bare-metal
          node, or directly manage hardware. Those tasks are handled by Ironic, ironic-python-agent,
          and hardware drivers.\r\n\r\nIn short: ironic-neutron-agent lets Neutron
          understand and manage networking for Ironic bare-metal nodes.\r\n\r\nAdding
          some context on why this PR enables the baremetal ML2 backend together with
          the Neutron Ironic agent:\r\n\r\nThe Neutron Ironic agent is only the service
          that reports Ironic bare metal port and physical network information back
          to Neutron. That gives Neutron the inventory and reachability data it needs,
          but it does not by itself teach ML2 how to bind a Neutron port whose binding:vnic_type
          is baremetal.\r\n\r\nFor the bind flow to work end to end, Neutron also
          needs the baremetal mechanism/backend enabled in network.backend. That backend
          is what lets ML2 recognize bare metal ports, use the Ironic-side physical
          network information, and produce a valid binding for provider or routed
          provider networks. Without it, we can deploy ironic-neutron-agent, but Neutron
          can still reject or fail to bind bare metal ports because the ML2 backend
          list does not include the driver responsible for that binding path.\r\n\r\nSo
          these two pieces cover different sides of the same feature:\r\n\r\nironic-neutron-agent
          syncs Ironic node/port network information into Neutron.\r\nbaremetal in
          network.backend enables the ML2 binding path for Neutron ports using vnic_type=baremetal.\r\nThat
          is why this change appends baremetal alongside the existing Atmosphere network
          backend only when operators opt in by enabling manifests.deployment_ironic_agent.
          It keeps the default Neutron deployment unchanged, while making the opt-in
          Ironic networking path complete.\r\n\r\n## Notes\r\n\r\nThis intentionally
          ports only the `roles/neutron/vars/main.yml` and `roles/neutron/tasks/main.yml`
          portions from `ricolin/atmosphere#11`. It does not set `manifests.deployment_ironic_agent`;
          operators still opt in through `neutron_helm_values`.\r\n\r\n## Validation\r\n\r\n-
          `python3` YAML parse for `roles/neutron/vars/main.yml` and `roles/neutron/tasks/main.yml`\r\n-
          local `ansible-playbook` smoke test for false/true `deployment_ironic_agent`
          conditional behavior\r\n- `git diff --check`"
        change_url: https://github.com/vexxhost/atmosphere/pull/3925
        commit_id: b39c821316846b3143e927d02dc22e8cb0dcada7
        patchset: b39c821316846b3143e927d02dc22e8cb0dcada7
        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: '3925'
      change_message: "feat(neutron): add neutron ironic agent support\n\n## Summary\r\n\r\n-
        add Neutron Helm values for the baremetal ML2 backend and `[ironic]` credentials\r\n-
        append those values only when the final Helm values enable `manifests.deployment_ironic_agent`\r\n-
        source Ironic region, username, and password from `openstack_helm_endpoints`
        instead of hardcoding Keystone auth details\r\n\r\n### short version for ironic-neutron-agent
        \ and baremetal driver intro\r\n\r\n  ironic-neutron-agent tells Neutron which
        physical networks each Ironic bare metal node can reach. That information
        lets Neutron\r\n  place bare metal ports on the right network segment, VLAN,
        provider network, or routed provider network.\r\n\r\n  This PR enables two
        required pieces together:\r\n\r\n  - ironic-neutron-agent syncs Ironic node
        and port network information into Neutron.\r\n  - baremetal in network.backend
        enables the ML2 binding path for Neutron ports using vnic_type=baremetal.\r\n\r\n
        \ Without the baremetal backend, the agent can report the topology, but Neutron
        may still fail to bind bare metal ports because ML2\r\n  does not have the
        driver for that binding path.\r\n\r\n  This stays opt-in through manifests.deployment_ironic_agent,
        so the default Neutron deployment remains unchanged.\r\n\r\n### Long version
        for ironic-neutron-agent  and baremetal driver intro\r\n\r\nironic-neutron-agent
        is a Neutron-side service used with OpenStack Ironic bare-metal nodes.\r\n\r\nIts
        main job is to tell Neutron which physical networks each bare-metal node can
        reach. This allows Neutron to correctly bind bare-metal ports to the right
        network segment, VLAN, provider network, or routed network.\r\n\r\nIn practice,
        it helps with:\r\n\r\n* Mapping Ironic nodes to physical networks\r\n* Supporting
        bare-metal Neutron port binding\r\n* Enabling tenant, provisioning, cleaning,
        and rescue network transitions\r\n* Helping ML2/switch drivers configure the
        correct switch ports or VLANs\r\n* Supporting routed provider networks\r\n*
        Improving OVN bare-metal networking features in newer deployments\r\n\r\nIt
        does not power on servers, install operating systems, run inside the bare-metal
        node, or directly manage hardware. Those tasks are handled by Ironic, ironic-python-agent,
        and hardware drivers.\r\n\r\nIn short: ironic-neutron-agent lets Neutron understand
        and manage networking for Ironic bare-metal nodes.\r\n\r\nAdding some context
        on why this PR enables the baremetal ML2 backend together with the Neutron
        Ironic agent:\r\n\r\nThe Neutron Ironic agent is only the service that reports
        Ironic bare metal port and physical network information back to Neutron. That
        gives Neutron the inventory and reachability data it needs, but it does not
        by itself teach ML2 how to bind a Neutron port whose binding:vnic_type is
        baremetal.\r\n\r\nFor the bind flow to work end to end, Neutron also needs
        the baremetal mechanism/backend enabled in network.backend. That backend is
        what lets ML2 recognize bare metal ports, use the Ironic-side physical network
        information, and produce a valid binding for provider or routed provider networks.
        Without it, we can deploy ironic-neutron-agent, but Neutron can still reject
        or fail to bind bare metal ports because the ML2 backend list does not include
        the driver responsible for that binding path.\r\n\r\nSo these two pieces cover
        different sides of the same feature:\r\n\r\nironic-neutron-agent syncs Ironic
        node/port network information into Neutron.\r\nbaremetal in network.backend
        enables the ML2 binding path for Neutron ports using vnic_type=baremetal.\r\nThat
        is why this change appends baremetal alongside the existing Atmosphere network
        backend only when operators opt in by enabling manifests.deployment_ironic_agent.
        It keeps the default Neutron deployment unchanged, while making the opt-in
        Ironic networking path complete.\r\n\r\n## Notes\r\n\r\nThis intentionally
        ports only the `roles/neutron/vars/main.yml` and `roles/neutron/tasks/main.yml`
        portions from `ricolin/atmosphere#11`. It does not set `manifests.deployment_ironic_agent`;
        operators still opt in through `neutron_helm_values`.\r\n\r\n## Validation\r\n\r\n-
        `python3` YAML parse for `roles/neutron/vars/main.yml` and `roles/neutron/tasks/main.yml`\r\n-
        local `ansible-playbook` smoke test for false/true `deployment_ironic_agent`
        conditional behavior\r\n- `git diff --check`"
      change_url: https://github.com/vexxhost/atmosphere/pull/3925
      child_jobs: []
      commit_id: b39c821316846b3143e927d02dc22e8cb0dcada7
      event_id: 128e1c20-691c-11f1-9f7d-7e186c7d380a
      executor:
        hostname: 2d72f0692154
        inventory_file: /var/lib/zuul/builds/596ce76fb77d4410acab709180b8d92b/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/596ce76fb77d4410acab709180b8d92b/work/logs
        result_data_file: /var/lib/zuul/builds/596ce76fb77d4410acab709180b8d92b/work/results.json
        src_root: /var/lib/zuul/builds/596ce76fb77d4410acab709180b8d92b/work/src
        work_root: /var/lib/zuul/builds/596ce76fb77d4410acab709180b8d92b/work
      include_vars: []
      items:
      - branch: main
        change: '3925'
        change_message: "feat(neutron): add neutron ironic agent support\n\n## Summary\r\n\r\n-
          add Neutron Helm values for the baremetal ML2 backend and `[ironic]` credentials\r\n-
          append those values only when the final Helm values enable `manifests.deployment_ironic_agent`\r\n-
          source Ironic region, username, and password from `openstack_helm_endpoints`
          instead of hardcoding Keystone auth details\r\n\r\n### short version for
          ironic-neutron-agent  and baremetal driver intro\r\n\r\n  ironic-neutron-agent
          tells Neutron which physical networks each Ironic bare metal node can reach.
          That information lets Neutron\r\n  place bare metal ports on the right network
          segment, VLAN, provider network, or routed provider network.\r\n\r\n  This
          PR enables two required pieces together:\r\n\r\n  - ironic-neutron-agent
          syncs Ironic node and port network information into Neutron.\r\n  - baremetal
          in network.backend enables the ML2 binding path for Neutron ports using
          vnic_type=baremetal.\r\n\r\n  Without the baremetal backend, the agent can
          report the topology, but Neutron may still fail to bind bare metal ports
          because ML2\r\n  does not have the driver for that binding path.\r\n\r\n
          \ This stays opt-in through manifests.deployment_ironic_agent, so the default
          Neutron deployment remains unchanged.\r\n\r\n### Long version for ironic-neutron-agent
          \ and baremetal driver intro\r\n\r\nironic-neutron-agent is a Neutron-side
          service used with OpenStack Ironic bare-metal nodes.\r\n\r\nIts main job
          is to tell Neutron which physical networks each bare-metal node can reach.
          This allows Neutron to correctly bind bare-metal ports to the right network
          segment, VLAN, provider network, or routed network.\r\n\r\nIn practice,
          it helps with:\r\n\r\n* Mapping Ironic nodes to physical networks\r\n* Supporting
          bare-metal Neutron port binding\r\n* Enabling tenant, provisioning, cleaning,
          and rescue network transitions\r\n* Helping ML2/switch drivers configure
          the correct switch ports or VLANs\r\n* Supporting routed provider networks\r\n*
          Improving OVN bare-metal networking features in newer deployments\r\n\r\nIt
          does not power on servers, install operating systems, run inside the bare-metal
          node, or directly manage hardware. Those tasks are handled by Ironic, ironic-python-agent,
          and hardware drivers.\r\n\r\nIn short: ironic-neutron-agent lets Neutron
          understand and manage networking for Ironic bare-metal nodes.\r\n\r\nAdding
          some context on why this PR enables the baremetal ML2 backend together with
          the Neutron Ironic agent:\r\n\r\nThe Neutron Ironic agent is only the service
          that reports Ironic bare metal port and physical network information back
          to Neutron. That gives Neutron the inventory and reachability data it needs,
          but it does not by itself teach ML2 how to bind a Neutron port whose binding:vnic_type
          is baremetal.\r\n\r\nFor the bind flow to work end to end, Neutron also
          needs the baremetal mechanism/backend enabled in network.backend. That backend
          is what lets ML2 recognize bare metal ports, use the Ironic-side physical
          network information, and produce a valid binding for provider or routed
          provider networks. Without it, we can deploy ironic-neutron-agent, but Neutron
          can still reject or fail to bind bare metal ports because the ML2 backend
          list does not include the driver responsible for that binding path.\r\n\r\nSo
          these two pieces cover different sides of the same feature:\r\n\r\nironic-neutron-agent
          syncs Ironic node/port network information into Neutron.\r\nbaremetal in
          network.backend enables the ML2 binding path for Neutron ports using vnic_type=baremetal.\r\nThat
          is why this change appends baremetal alongside the existing Atmosphere network
          backend only when operators opt in by enabling manifests.deployment_ironic_agent.
          It keeps the default Neutron deployment unchanged, while making the opt-in
          Ironic networking path complete.\r\n\r\n## Notes\r\n\r\nThis intentionally
          ports only the `roles/neutron/vars/main.yml` and `roles/neutron/tasks/main.yml`
          portions from `ricolin/atmosphere#11`. It does not set `manifests.deployment_ironic_agent`;
          operators still opt in through `neutron_helm_values`.\r\n\r\n## Validation\r\n\r\n-
          `python3` YAML parse for `roles/neutron/vars/main.yml` and `roles/neutron/tasks/main.yml`\r\n-
          local `ansible-playbook` smoke test for false/true `deployment_ironic_agent`
          conditional behavior\r\n- `git diff --check`"
        change_url: https://github.com/vexxhost/atmosphere/pull/3925
        commit_id: b39c821316846b3143e927d02dc22e8cb0dcada7
        patchset: b39c821316846b3143e927d02dc22e8cb0dcada7
        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-aio-ovn
      jobtags: []
      max_attempts: 3
      message: ZmVhdChuZXV0cm9uKTogYWRkIG5ldXRyb24gaXJvbmljIGFnZW50IHN1cHBvcnQKCiMjIFN1bW1hcnkNCg0KLSBhZGQgTmV1dHJvbiBIZWxtIHZhbHVlcyBmb3IgdGhlIGJhcmVtZXRhbCBNTDIgYmFja2VuZCBhbmQgYFtpcm9uaWNdYCBjcmVkZW50aWFscw0KLSBhcHBlbmQgdGhvc2UgdmFsdWVzIG9ubHkgd2hlbiB0aGUgZmluYWwgSGVsbSB2YWx1ZXMgZW5hYmxlIGBtYW5pZmVzdHMuZGVwbG95bWVudF9pcm9uaWNfYWdlbnRgDQotIHNvdXJjZSBJcm9uaWMgcmVnaW9uLCB1c2VybmFtZSwgYW5kIHBhc3N3b3JkIGZyb20gYG9wZW5zdGFja19oZWxtX2VuZHBvaW50c2AgaW5zdGVhZCBvZiBoYXJkY29kaW5nIEtleXN0b25lIGF1dGggZGV0YWlscw0KDQojIyMgc2hvcnQgdmVyc2lvbiBmb3IgaXJvbmljLW5ldXRyb24tYWdlbnQgIGFuZCBiYXJlbWV0YWwgZHJpdmVyIGludHJvDQoNCiAgaXJvbmljLW5ldXRyb24tYWdlbnQgdGVsbHMgTmV1dHJvbiB3aGljaCBwaHlzaWNhbCBuZXR3b3JrcyBlYWNoIElyb25pYyBiYXJlIG1ldGFsIG5vZGUgY2FuIHJlYWNoLiBUaGF0IGluZm9ybWF0aW9uIGxldHMgTmV1dHJvbg0KICBwbGFjZSBiYXJlIG1ldGFsIHBvcnRzIG9uIHRoZSByaWdodCBuZXR3b3JrIHNlZ21lbnQsIFZMQU4sIHByb3ZpZGVyIG5ldHdvcmssIG9yIHJvdXRlZCBwcm92aWRlciBuZXR3b3JrLg0KDQogIFRoaXMgUFIgZW5hYmxlcyB0d28gcmVxdWlyZWQgcGllY2VzIHRvZ2V0aGVyOg0KDQogIC0gaXJvbmljLW5ldXRyb24tYWdlbnQgc3luY3MgSXJvbmljIG5vZGUgYW5kIHBvcnQgbmV0d29yayBpbmZvcm1hdGlvbiBpbnRvIE5ldXRyb24uDQogIC0gYmFyZW1ldGFsIGluIG5ldHdvcmsuYmFja2VuZCBlbmFibGVzIHRoZSBNTDIgYmluZGluZyBwYXRoIGZvciBOZXV0cm9uIHBvcnRzIHVzaW5nIHZuaWNfdHlwZT1iYXJlbWV0YWwuDQoNCiAgV2l0aG91dCB0aGUgYmFyZW1ldGFsIGJhY2tlbmQsIHRoZSBhZ2VudCBjYW4gcmVwb3J0IHRoZSB0b3BvbG9neSwgYnV0IE5ldXRyb24gbWF5IHN0aWxsIGZhaWwgdG8gYmluZCBiYXJlIG1ldGFsIHBvcnRzIGJlY2F1c2UgTUwyDQogIGRvZXMgbm90IGhhdmUgdGhlIGRyaXZlciBmb3IgdGhhdCBiaW5kaW5nIHBhdGguDQoNCiAgVGhpcyBzdGF5cyBvcHQtaW4gdGhyb3VnaCBtYW5pZmVzdHMuZGVwbG95bWVudF9pcm9uaWNfYWdlbnQsIHNvIHRoZSBkZWZhdWx0IE5ldXRyb24gZGVwbG95bWVudCByZW1haW5zIHVuY2hhbmdlZC4NCg0KIyMjIExvbmcgdmVyc2lvbiBmb3IgaXJvbmljLW5ldXRyb24tYWdlbnQgIGFuZCBiYXJlbWV0YWwgZHJpdmVyIGludHJvDQoNCmlyb25pYy1uZXV0cm9uLWFnZW50IGlzIGEgTmV1dHJvbi1zaWRlIHNlcnZpY2UgdXNlZCB3aXRoIE9wZW5TdGFjayBJcm9uaWMgYmFyZS1tZXRhbCBub2Rlcy4NCg0KSXRzIG1haW4gam9iIGlzIHRvIHRlbGwgTmV1dHJvbiB3aGljaCBwaHlzaWNhbCBuZXR3b3JrcyBlYWNoIGJhcmUtbWV0YWwgbm9kZSBjYW4gcmVhY2guIFRoaXMgYWxsb3dzIE5ldXRyb24gdG8gY29ycmVjdGx5IGJpbmQgYmFyZS1tZXRhbCBwb3J0cyB0byB0aGUgcmlnaHQgbmV0d29yayBzZWdtZW50LCBWTEFOLCBwcm92aWRlciBuZXR3b3JrLCBvciByb3V0ZWQgbmV0d29yay4NCg0KSW4gcHJhY3RpY2UsIGl0IGhlbHBzIHdpdGg6DQoNCiogTWFwcGluZyBJcm9uaWMgbm9kZXMgdG8gcGh5c2ljYWwgbmV0d29ya3MNCiogU3VwcG9ydGluZyBiYXJlLW1ldGFsIE5ldXRyb24gcG9ydCBiaW5kaW5nDQoqIEVuYWJsaW5nIHRlbmFudCwgcHJvdmlzaW9uaW5nLCBjbGVhbmluZywgYW5kIHJlc2N1ZSBuZXR3b3JrIHRyYW5zaXRpb25zDQoqIEhlbHBpbmcgTUwyL3N3aXRjaCBkcml2ZXJzIGNvbmZpZ3VyZSB0aGUgY29ycmVjdCBzd2l0Y2ggcG9ydHMgb3IgVkxBTnMNCiogU3VwcG9ydGluZyByb3V0ZWQgcHJvdmlkZXIgbmV0d29ya3MNCiogSW1wcm92aW5nIE9WTiBiYXJlLW1ldGFsIG5ldHdvcmtpbmcgZmVhdHVyZXMgaW4gbmV3ZXIgZGVwbG95bWVudHMNCg0KSXQgZG9lcyBub3QgcG93ZXIgb24gc2VydmVycywgaW5zdGFsbCBvcGVyYXRpbmcgc3lzdGVtcywgcnVuIGluc2lkZSB0aGUgYmFyZS1tZXRhbCBub2RlLCBvciBkaXJlY3RseSBtYW5hZ2UgaGFyZHdhcmUuIFRob3NlIHRhc2tzIGFyZSBoYW5kbGVkIGJ5IElyb25pYywgaXJvbmljLXB5dGhvbi1hZ2VudCwgYW5kIGhhcmR3YXJlIGRyaXZlcnMuDQoNCkluIHNob3J0OiBpcm9uaWMtbmV1dHJvbi1hZ2VudCBsZXRzIE5ldXRyb24gdW5kZXJzdGFuZCBhbmQgbWFuYWdlIG5ldHdvcmtpbmcgZm9yIElyb25pYyBiYXJlLW1ldGFsIG5vZGVzLg0KDQpBZGRpbmcgc29tZSBjb250ZXh0IG9uIHdoeSB0aGlzIFBSIGVuYWJsZXMgdGhlIGJhcmVtZXRhbCBNTDIgYmFja2VuZCB0b2dldGhlciB3aXRoIHRoZSBOZXV0cm9uIElyb25pYyBhZ2VudDoNCg0KVGhlIE5ldXRyb24gSXJvbmljIGFnZW50IGlzIG9ubHkgdGhlIHNlcnZpY2UgdGhhdCByZXBvcnRzIElyb25pYyBiYXJlIG1ldGFsIHBvcnQgYW5kIHBoeXNpY2FsIG5ldHdvcmsgaW5mb3JtYXRpb24gYmFjayB0byBOZXV0cm9uLiBUaGF0IGdpdmVzIE5ldXRyb24gdGhlIGludmVudG9yeSBhbmQgcmVhY2hhYmlsaXR5IGRhdGEgaXQgbmVlZHMsIGJ1dCBpdCBkb2VzIG5vdCBieSBpdHNlbGYgdGVhY2ggTUwyIGhvdyB0byBiaW5kIGEgTmV1dHJvbiBwb3J0IHdob3NlIGJpbmRpbmc6dm5pY190eXBlIGlzIGJhcmVtZXRhbC4NCg0KRm9yIHRoZSBiaW5kIGZsb3cgdG8gd29yayBlbmQgdG8gZW5kLCBOZXV0cm9uIGFsc28gbmVlZHMgdGhlIGJhcmVtZXRhbCBtZWNoYW5pc20vYmFja2VuZCBlbmFibGVkIGluIG5ldHdvcmsuYmFja2VuZC4gVGhhdCBiYWNrZW5kIGlzIHdoYXQgbGV0cyBNTDIgcmVjb2duaXplIGJhcmUgbWV0YWwgcG9ydHMsIHVzZSB0aGUgSXJvbmljLXNpZGUgcGh5c2ljYWwgbmV0d29yayBpbmZvcm1hdGlvbiwgYW5kIHByb2R1Y2UgYSB2YWxpZCBiaW5kaW5nIGZvciBwcm92aWRlciBvciByb3V0ZWQgcHJvdmlkZXIgbmV0d29ya3MuIFdpdGhvdXQgaXQsIHdlIGNhbiBkZXBsb3kgaXJvbmljLW5ldXRyb24tYWdlbnQsIGJ1dCBOZXV0cm9uIGNhbiBzdGlsbCByZWplY3Qgb3IgZmFpbCB0byBiaW5kIGJhcmUgbWV0YWwgcG9ydHMgYmVjYXVzZSB0aGUgTUwyIGJhY2tlbmQgbGlzdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBkcml2ZXIgcmVzcG9uc2libGUgZm9yIHRoYXQgYmluZGluZyBwYXRoLg0KDQpTbyB0aGVzZSB0d28gcGllY2VzIGNvdmVyIGRpZmZlcmVudCBzaWRlcyBvZiB0aGUgc2FtZSBmZWF0dXJlOg0KDQppcm9uaWMtbmV1dHJvbi1hZ2VudCBzeW5jcyBJcm9uaWMgbm9kZS9wb3J0IG5ldHdvcmsgaW5mb3JtYXRpb24gaW50byBOZXV0cm9uLg0KYmFyZW1ldGFsIGluIG5ldHdvcmsuYmFja2VuZCBlbmFibGVzIHRoZSBNTDIgYmluZGluZyBwYXRoIGZvciBOZXV0cm9uIHBvcnRzIHVzaW5nIHZuaWNfdHlwZT1iYXJlbWV0YWwuDQpUaGF0IGlzIHdoeSB0aGlzIGNoYW5nZSBhcHBlbmRzIGJhcmVtZXRhbCBhbG9uZ3NpZGUgdGhlIGV4aXN0aW5nIEF0bW9zcGhlcmUgbmV0d29yayBiYWNrZW5kIG9ubHkgd2hlbiBvcGVyYXRvcnMgb3B0IGluIGJ5IGVuYWJsaW5nIG1hbmlmZXN0cy5kZXBsb3ltZW50X2lyb25pY19hZ2VudC4gSXQga2VlcHMgdGhlIGRlZmF1bHQgTmV1dHJvbiBkZXBsb3ltZW50IHVuY2hhbmdlZCwgd2hpbGUgbWFraW5nIHRoZSBvcHQtaW4gSXJvbmljIG5ldHdvcmtpbmcgcGF0aCBjb21wbGV0ZS4NCg0KIyMgTm90ZXMNCg0KVGhpcyBpbnRlbnRpb25hbGx5IHBvcnRzIG9ubHkgdGhlIGByb2xlcy9uZXV0cm9uL3ZhcnMvbWFpbi55bWxgIGFuZCBgcm9sZXMvbmV1dHJvbi90YXNrcy9tYWluLnltbGAgcG9ydGlvbnMgZnJvbSBgcmljb2xpbi9hdG1vc3BoZXJlIzExYC4gSXQgZG9lcyBub3Qgc2V0IGBtYW5pZmVzdHMuZGVwbG95bWVudF9pcm9uaWNfYWdlbnRgOyBvcGVyYXRvcnMgc3RpbGwgb3B0IGluIHRocm91Z2ggYG5ldXRyb25faGVsbV92YWx1ZXNgLg0KDQojIyBWYWxpZGF0aW9uDQoNCi0gYHB5dGhvbjNgIFlBTUwgcGFyc2UgZm9yIGByb2xlcy9uZXV0cm9uL3ZhcnMvbWFpbi55bWxgIGFuZCBgcm9sZXMvbmV1dHJvbi90YXNrcy9tYWluLnltbGANCi0gbG9jYWwgYGFuc2libGUtcGxheWJvb2tgIHNtb2tlIHRlc3QgZm9yIGZhbHNlL3RydWUgYGRlcGxveW1lbnRfaXJvbmljX2FnZW50YCBjb25kaXRpb25hbCBiZWhhdmlvcg0KLSBgZ2l0IGRpZmYgLS1jaGVja2A=
      patchset: b39c821316846b3143e927d02dc22e8cb0dcada7
      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: 82e3e8b1292a25e38235bb92b157992d326531d1
          trusted/project_2/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: 348c7ff425450b0356e1d84589143dce260be74a
          untrusted/project_0/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: 348c7ff425450b0356e1d84589143dce260be74a
          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: 82e3e8b1292a25e38235bb92b157992d326531d1
          untrusted/project_3/github.com/vexxhost/atmosphere-zuul-jobs:
            canonical_name: github.com/vexxhost/atmosphere-zuul-jobs
            checkout: main
            commit: 310da0c3635c4a334a630c2ee2e1633ec24ef5b8
          untrusted/project_4/opendev.org/openstack/openstack-helm:
            canonical_name: opendev.org/openstack/openstack-helm
            checkout: master
            commit: 9d891d3e679b522832c216f23e30e64a9b400681
        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: b7fef434617ed47c562a4fef9764e335215c8b82
          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: 674315f2da475d25889d0b32a96ed0be580d8af3
          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: 1eca32b5d2506f6439b6b1b1ca0d8f6d307b8099
          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: 9eeca8b4b4c9adb61eec70d4390634a3627253fd
          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: 57739cbbd933f1b749b32d6f0f595e5ae2ca16be
          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: f69761f37cf6367d9693d0ac93c62b2c10e11cff
          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: 73f630a25d5c22f029e85298d9d47f3d94a014a6
          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: 62193e9ddde9e79c56f90d99f849a3471d119526
          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: b76f94376a9eb8e7f018da7539aa9e3b73557330
          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: dae30b30a3f12661eea1a73b000ad9d1862a334e
          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: d00ec7f88fdc7ca2ce504a7e19c4049986cdac86
          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: 209cf2d60533d5094aaf0308765d2e538091f203
          name: openstack/ansible-collections-openstack
          required: true
          short_name: ansible-collections-openstack
          src_dir: src/opendev.org/openstack/ansible-collections-openstack
      ref: refs/pull/3925/head
      resources: {}
      tenant: oss
      timeout: 7200
      topic: null
      voting: true
