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.235
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      atmosphere_image_prefix: harbor.atmosphere.dev/
      atmosphere_network_backend: openvswitch
      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: c02bfd44-e380-403f-a0e3-d0056f1469c3
        host_id: 413ad91e6120ae81306de27e59dcefd40ab96f06b8665fea7030ef8f
        interface_ip: 199.204.45.235
        label: ubuntu-jammy-16
        node_properties: {}
        private_ipv4: 199.204.45.235
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.235
        public_ipv6: 2604:e100:1:0:f816:3eff:fec0:6f25
        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
      senlin_helm_values:
        pod:
          replicas:
            api: 1
            conductor: 1
            engine: 1
            health_manager: 1
      staffeln_helm_values:
        pod:
          replicas:
            api: 1
            conductor: 1
      valkey_helm_values:
        replica:
          replicaCount: 1
      zuul_node:
        az: nova
        cloud: public
        external_id: c02bfd44-e380-403f-a0e3-d0056f1469c3
        host_id: 413ad91e6120ae81306de27e59dcefd40ab96f06b8665fea7030ef8f
        interface_ip: 199.204.45.235
        label: ubuntu-jammy-16
        node_properties: {}
        private_ipv4: 199.204.45.235
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.235
        public_ipv6: 2604:e100:1:0:f816:3eff:fec0:6f25
        region: ca-ymq-1
        slot: null
        uuid: null
  vars:
    atmosphere_image_prefix: harbor.atmosphere.dev/
    atmosphere_network_backend: openvswitch
    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
    senlin_helm_values:
      pod:
        replicas:
          api: 1
          conductor: 1
          engine: 1
          health_manager: 1
    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#75>'
      - '<Job atmosphere-molecule-aio-openvswitch explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/atmosphere-zuul-jobs/zuul.d/jobs.yaml@main#264>'
      - '<Job atmosphere-molecule-aio-openvswitch explicit: None implied: None source:
        vexxhost/atmosphere-zuul-jobs/zuul.d/project-templates.yaml@main#1>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 74041583ee89413196cb3f2d8eb807ff
      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: b9c00747f53e63945d40627f03c104f9cbb63660
        patchset: b9c00747f53e63945d40627f03c104f9cbb63660
        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: 2709545e78964ce28964ed9c90ab6d9f
      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: b9c00747f53e63945d40627f03c104f9cbb63660
        patchset: b9c00747f53e63945d40627f03c104f9cbb63660
        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: b9c00747f53e63945d40627f03c104f9cbb63660
      event_id: ebf90320-737c-11f1-8ae0-ce2ed0c4415c
      executor:
        hostname: 2d72f0692154
        inventory_file: /var/lib/zuul/builds/74041583ee89413196cb3f2d8eb807ff/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/74041583ee89413196cb3f2d8eb807ff/work/logs
        result_data_file: /var/lib/zuul/builds/74041583ee89413196cb3f2d8eb807ff/work/results.json
        src_root: /var/lib/zuul/builds/74041583ee89413196cb3f2d8eb807ff/work/src
        work_root: /var/lib/zuul/builds/74041583ee89413196cb3f2d8eb807ff/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: b9c00747f53e63945d40627f03c104f9cbb63660
        patchset: b9c00747f53e63945d40627f03c104f9cbb63660
        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-openvswitch
      jobtags: []
      max_attempts: 3
      message: ZmVhdChuZXV0cm9uKTogYWRkIG5ldXRyb24gaXJvbmljIGFnZW50IHN1cHBvcnQKCiMjIFN1bW1hcnkNCg0KLSBhZGQgTmV1dHJvbiBIZWxtIHZhbHVlcyBmb3IgdGhlIGJhcmVtZXRhbCBNTDIgYmFja2VuZCBhbmQgYFtpcm9uaWNdYCBjcmVkZW50aWFscw0KLSBhcHBlbmQgdGhvc2UgdmFsdWVzIG9ubHkgd2hlbiB0aGUgZmluYWwgSGVsbSB2YWx1ZXMgZW5hYmxlIGBtYW5pZmVzdHMuZGVwbG95bWVudF9pcm9uaWNfYWdlbnRgDQotIHNvdXJjZSBJcm9uaWMgcmVnaW9uLCB1c2VybmFtZSwgYW5kIHBhc3N3b3JkIGZyb20gYG9wZW5zdGFja19oZWxtX2VuZHBvaW50c2AgaW5zdGVhZCBvZiBoYXJkY29kaW5nIEtleXN0b25lIGF1dGggZGV0YWlscw0KDQojIyMgc2hvcnQgdmVyc2lvbiBmb3IgaXJvbmljLW5ldXRyb24tYWdlbnQgIGFuZCBiYXJlbWV0YWwgZHJpdmVyIGludHJvDQoNCiAgaXJvbmljLW5ldXRyb24tYWdlbnQgdGVsbHMgTmV1dHJvbiB3aGljaCBwaHlzaWNhbCBuZXR3b3JrcyBlYWNoIElyb25pYyBiYXJlIG1ldGFsIG5vZGUgY2FuIHJlYWNoLiBUaGF0IGluZm9ybWF0aW9uIGxldHMgTmV1dHJvbg0KICBwbGFjZSBiYXJlIG1ldGFsIHBvcnRzIG9uIHRoZSByaWdodCBuZXR3b3JrIHNlZ21lbnQsIFZMQU4sIHByb3ZpZGVyIG5ldHdvcmssIG9yIHJvdXRlZCBwcm92aWRlciBuZXR3b3JrLg0KDQogIFRoaXMgUFIgZW5hYmxlcyB0d28gcmVxdWlyZWQgcGllY2VzIHRvZ2V0aGVyOg0KDQogIC0gaXJvbmljLW5ldXRyb24tYWdlbnQgc3luY3MgSXJvbmljIG5vZGUgYW5kIHBvcnQgbmV0d29yayBpbmZvcm1hdGlvbiBpbnRvIE5ldXRyb24uDQogIC0gYmFyZW1ldGFsIGluIG5ldHdvcmsuYmFja2VuZCBlbmFibGVzIHRoZSBNTDIgYmluZGluZyBwYXRoIGZvciBOZXV0cm9uIHBvcnRzIHVzaW5nIHZuaWNfdHlwZT1iYXJlbWV0YWwuDQoNCiAgV2l0aG91dCB0aGUgYmFyZW1ldGFsIGJhY2tlbmQsIHRoZSBhZ2VudCBjYW4gcmVwb3J0IHRoZSB0b3BvbG9neSwgYnV0IE5ldXRyb24gbWF5IHN0aWxsIGZhaWwgdG8gYmluZCBiYXJlIG1ldGFsIHBvcnRzIGJlY2F1c2UgTUwyDQogIGRvZXMgbm90IGhhdmUgdGhlIGRyaXZlciBmb3IgdGhhdCBiaW5kaW5nIHBhdGguDQoNCiAgVGhpcyBzdGF5cyBvcHQtaW4gdGhyb3VnaCBtYW5pZmVzdHMuZGVwbG95bWVudF9pcm9uaWNfYWdlbnQsIHNvIHRoZSBkZWZhdWx0IE5ldXRyb24gZGVwbG95bWVudCByZW1haW5zIHVuY2hhbmdlZC4NCg0KIyMjIExvbmcgdmVyc2lvbiBmb3IgaXJvbmljLW5ldXRyb24tYWdlbnQgIGFuZCBiYXJlbWV0YWwgZHJpdmVyIGludHJvDQoNCmlyb25pYy1uZXV0cm9uLWFnZW50IGlzIGEgTmV1dHJvbi1zaWRlIHNlcnZpY2UgdXNlZCB3aXRoIE9wZW5TdGFjayBJcm9uaWMgYmFyZS1tZXRhbCBub2Rlcy4NCg0KSXRzIG1haW4gam9iIGlzIHRvIHRlbGwgTmV1dHJvbiB3aGljaCBwaHlzaWNhbCBuZXR3b3JrcyBlYWNoIGJhcmUtbWV0YWwgbm9kZSBjYW4gcmVhY2guIFRoaXMgYWxsb3dzIE5ldXRyb24gdG8gY29ycmVjdGx5IGJpbmQgYmFyZS1tZXRhbCBwb3J0cyB0byB0aGUgcmlnaHQgbmV0d29yayBzZWdtZW50LCBWTEFOLCBwcm92aWRlciBuZXR3b3JrLCBvciByb3V0ZWQgbmV0d29yay4NCg0KSW4gcHJhY3RpY2UsIGl0IGhlbHBzIHdpdGg6DQoNCiogTWFwcGluZyBJcm9uaWMgbm9kZXMgdG8gcGh5c2ljYWwgbmV0d29ya3MNCiogU3VwcG9ydGluZyBiYXJlLW1ldGFsIE5ldXRyb24gcG9ydCBiaW5kaW5nDQoqIEVuYWJsaW5nIHRlbmFudCwgcHJvdmlzaW9uaW5nLCBjbGVhbmluZywgYW5kIHJlc2N1ZSBuZXR3b3JrIHRyYW5zaXRpb25zDQoqIEhlbHBpbmcgTUwyL3N3aXRjaCBkcml2ZXJzIGNvbmZpZ3VyZSB0aGUgY29ycmVjdCBzd2l0Y2ggcG9ydHMgb3IgVkxBTnMNCiogU3VwcG9ydGluZyByb3V0ZWQgcHJvdmlkZXIgbmV0d29ya3MNCiogSW1wcm92aW5nIE9WTiBiYXJlLW1ldGFsIG5ldHdvcmtpbmcgZmVhdHVyZXMgaW4gbmV3ZXIgZGVwbG95bWVudHMNCg0KSXQgZG9lcyBub3QgcG93ZXIgb24gc2VydmVycywgaW5zdGFsbCBvcGVyYXRpbmcgc3lzdGVtcywgcnVuIGluc2lkZSB0aGUgYmFyZS1tZXRhbCBub2RlLCBvciBkaXJlY3RseSBtYW5hZ2UgaGFyZHdhcmUuIFRob3NlIHRhc2tzIGFyZSBoYW5kbGVkIGJ5IElyb25pYywgaXJvbmljLXB5dGhvbi1hZ2VudCwgYW5kIGhhcmR3YXJlIGRyaXZlcnMuDQoNCkluIHNob3J0OiBpcm9uaWMtbmV1dHJvbi1hZ2VudCBsZXRzIE5ldXRyb24gdW5kZXJzdGFuZCBhbmQgbWFuYWdlIG5ldHdvcmtpbmcgZm9yIElyb25pYyBiYXJlLW1ldGFsIG5vZGVzLg0KDQpBZGRpbmcgc29tZSBjb250ZXh0IG9uIHdoeSB0aGlzIFBSIGVuYWJsZXMgdGhlIGJhcmVtZXRhbCBNTDIgYmFja2VuZCB0b2dldGhlciB3aXRoIHRoZSBOZXV0cm9uIElyb25pYyBhZ2VudDoNCg0KVGhlIE5ldXRyb24gSXJvbmljIGFnZW50IGlzIG9ubHkgdGhlIHNlcnZpY2UgdGhhdCByZXBvcnRzIElyb25pYyBiYXJlIG1ldGFsIHBvcnQgYW5kIHBoeXNpY2FsIG5ldHdvcmsgaW5mb3JtYXRpb24gYmFjayB0byBOZXV0cm9uLiBUaGF0IGdpdmVzIE5ldXRyb24gdGhlIGludmVudG9yeSBhbmQgcmVhY2hhYmlsaXR5IGRhdGEgaXQgbmVlZHMsIGJ1dCBpdCBkb2VzIG5vdCBieSBpdHNlbGYgdGVhY2ggTUwyIGhvdyB0byBiaW5kIGEgTmV1dHJvbiBwb3J0IHdob3NlIGJpbmRpbmc6dm5pY190eXBlIGlzIGJhcmVtZXRhbC4NCg0KRm9yIHRoZSBiaW5kIGZsb3cgdG8gd29yayBlbmQgdG8gZW5kLCBOZXV0cm9uIGFsc28gbmVlZHMgdGhlIGJhcmVtZXRhbCBtZWNoYW5pc20vYmFja2VuZCBlbmFibGVkIGluIG5ldHdvcmsuYmFja2VuZC4gVGhhdCBiYWNrZW5kIGlzIHdoYXQgbGV0cyBNTDIgcmVjb2duaXplIGJhcmUgbWV0YWwgcG9ydHMsIHVzZSB0aGUgSXJvbmljLXNpZGUgcGh5c2ljYWwgbmV0d29yayBpbmZvcm1hdGlvbiwgYW5kIHByb2R1Y2UgYSB2YWxpZCBiaW5kaW5nIGZvciBwcm92aWRlciBvciByb3V0ZWQgcHJvdmlkZXIgbmV0d29ya3MuIFdpdGhvdXQgaXQsIHdlIGNhbiBkZXBsb3kgaXJvbmljLW5ldXRyb24tYWdlbnQsIGJ1dCBOZXV0cm9uIGNhbiBzdGlsbCByZWplY3Qgb3IgZmFpbCB0byBiaW5kIGJhcmUgbWV0YWwgcG9ydHMgYmVjYXVzZSB0aGUgTUwyIGJhY2tlbmQgbGlzdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBkcml2ZXIgcmVzcG9uc2libGUgZm9yIHRoYXQgYmluZGluZyBwYXRoLg0KDQpTbyB0aGVzZSB0d28gcGllY2VzIGNvdmVyIGRpZmZlcmVudCBzaWRlcyBvZiB0aGUgc2FtZSBmZWF0dXJlOg0KDQppcm9uaWMtbmV1dHJvbi1hZ2VudCBzeW5jcyBJcm9uaWMgbm9kZS9wb3J0IG5ldHdvcmsgaW5mb3JtYXRpb24gaW50byBOZXV0cm9uLg0KYmFyZW1ldGFsIGluIG5ldHdvcmsuYmFja2VuZCBlbmFibGVzIHRoZSBNTDIgYmluZGluZyBwYXRoIGZvciBOZXV0cm9uIHBvcnRzIHVzaW5nIHZuaWNfdHlwZT1iYXJlbWV0YWwuDQpUaGF0IGlzIHdoeSB0aGlzIGNoYW5nZSBhcHBlbmRzIGJhcmVtZXRhbCBhbG9uZ3NpZGUgdGhlIGV4aXN0aW5nIEF0bW9zcGhlcmUgbmV0d29yayBiYWNrZW5kIG9ubHkgd2hlbiBvcGVyYXRvcnMgb3B0IGluIGJ5IGVuYWJsaW5nIG1hbmlmZXN0cy5kZXBsb3ltZW50X2lyb25pY19hZ2VudC4gSXQga2VlcHMgdGhlIGRlZmF1bHQgTmV1dHJvbiBkZXBsb3ltZW50IHVuY2hhbmdlZCwgd2hpbGUgbWFraW5nIHRoZSBvcHQtaW4gSXJvbmljIG5ldHdvcmtpbmcgcGF0aCBjb21wbGV0ZS4NCg0KIyMgTm90ZXMNCg0KVGhpcyBpbnRlbnRpb25hbGx5IHBvcnRzIG9ubHkgdGhlIGByb2xlcy9uZXV0cm9uL3ZhcnMvbWFpbi55bWxgIGFuZCBgcm9sZXMvbmV1dHJvbi90YXNrcy9tYWluLnltbGAgcG9ydGlvbnMgZnJvbSBgcmljb2xpbi9hdG1vc3BoZXJlIzExYC4gSXQgZG9lcyBub3Qgc2V0IGBtYW5pZmVzdHMuZGVwbG95bWVudF9pcm9uaWNfYWdlbnRgOyBvcGVyYXRvcnMgc3RpbGwgb3B0IGluIHRocm91Z2ggYG5ldXRyb25faGVsbV92YWx1ZXNgLg0KDQojIyBWYWxpZGF0aW9uDQoNCi0gYHB5dGhvbjNgIFlBTUwgcGFyc2UgZm9yIGByb2xlcy9uZXV0cm9uL3ZhcnMvbWFpbi55bWxgIGFuZCBgcm9sZXMvbmV1dHJvbi90YXNrcy9tYWluLnltbGANCi0gbG9jYWwgYGFuc2libGUtcGxheWJvb2tgIHNtb2tlIHRlc3QgZm9yIGZhbHNlL3RydWUgYGRlcGxveW1lbnRfaXJvbmljX2FnZW50YCBjb25kaXRpb25hbCBiZWhhdmlvcg0KLSBgZ2l0IGRpZmYgLS1jaGVja2A=
      patchset: b9c00747f53e63945d40627f03c104f9cbb63660
      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: ed0f095ba6ab599b5ceb065cc98b92655c20b45f
          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: ed0f095ba6ab599b5ceb065cc98b92655c20b45f
          untrusted/project_3/github.com/vexxhost/atmosphere-zuul-jobs:
            canonical_name: github.com/vexxhost/atmosphere-zuul-jobs
            checkout: main
            commit: acb8e36a801f3b93fdd30dec43a15b6f8d809c2f
          untrusted/project_4/opendev.org/openstack/openstack-helm:
            canonical_name: opendev.org/openstack/openstack-helm
            checkout: master
            commit: 99d96acbaa328426c113da33f5611b10cf1af0e2
        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: ca8efe529eaceccf3e0104550abd47b8fac161ae
          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: e199e4a0978b463f9d8213ae7874f87452f34e48
          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: 70ce1dfc91895595cfa7e72ac6073ed396cce6d8
          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: 3e239e5853cf7e48ce5d7f8ea05dc24fc2a0f2f4
          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: bb80dde66d51c820be6c594c0bacc56d6d5a3dfa
          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: 865ef1786f9695b6d40aeea222cf192c66a6ab77
          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: b9c00747f53e63945d40627f03c104f9cbb63660
          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
