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.35
      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: 9eefe19b-59a5-4eff-b9af-ffe5b93b85df
        host_id: be92abac58cdf319c41ec3044bb265315879370c10aa7110cfdbfb5f
        interface_ip: 199.204.45.35
        label: ubuntu-jammy-16
        node_properties: {}
        private_ipv4: 199.204.45.35
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.35
        public_ipv6: 2604:e100:1:0:f816:3eff:fedf:7583
        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: 9eefe19b-59a5-4eff-b9af-ffe5b93b85df
        host_id: be92abac58cdf319c41ec3044bb265315879370c10aa7110cfdbfb5f
        interface_ip: 199.204.45.35
        label: ubuntu-jammy-16
        node_properties: {}
        private_ipv4: 199.204.45.35
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.35
        public_ipv6: 2604:e100:1:0:f816:3eff:fedf:7583
        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
    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.yaml@main#24>'
      - '<Job atmosphere-molecule-aio explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/atmosphere/.zuul.yaml@main#92>'
      - '<Job atmosphere-molecule-aio-openvswitch explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/atmosphere/.zuul.yaml@main#274>'
      - '<Job atmosphere-molecule-aio-openvswitch explicit: None implied: None source:
        vexxhost/atmosphere/.zuul.yaml@main#308>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 4135932661a84326834e01f4ef0834ba
      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: d8e2f1fec9dfdf2b1d5438096bb18411a6903c47
        patchset: d8e2f1fec9dfdf2b1d5438096bb18411a6903c47
        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: a3c3309d00ab48e19b1d6065d21d66aa
      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: d8e2f1fec9dfdf2b1d5438096bb18411a6903c47
        patchset: d8e2f1fec9dfdf2b1d5438096bb18411a6903c47
        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: d8e2f1fec9dfdf2b1d5438096bb18411a6903c47
      event_id: 92540d40-62e9-11f1-98e4-ab931f8804fe
      executor:
        hostname: 2d72f0692154
        inventory_file: /var/lib/zuul/builds/4135932661a84326834e01f4ef0834ba/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/4135932661a84326834e01f4ef0834ba/work/logs
        result_data_file: /var/lib/zuul/builds/4135932661a84326834e01f4ef0834ba/work/results.json
        src_root: /var/lib/zuul/builds/4135932661a84326834e01f4ef0834ba/work/src
        work_root: /var/lib/zuul/builds/4135932661a84326834e01f4ef0834ba/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: d8e2f1fec9dfdf2b1d5438096bb18411a6903c47
        patchset: d8e2f1fec9dfdf2b1d5438096bb18411a6903c47
        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: d8e2f1fec9dfdf2b1d5438096bb18411a6903c47
      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:
            canonical_name: github.com/vexxhost/atmosphere
            checkout: main
            commit: d8e2f1fec9dfdf2b1d5438096bb18411a6903c47
          untrusted/project_4/opendev.org/openstack/openstack-helm:
            canonical_name: opendev.org/openstack/openstack-helm
            checkout: master
            commit: d3fa14f5129df62a449dd466f0f09e99bf5c291f
        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/test-playbooks/molecule/post.yml
          roles:
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/post_playbook_0/role_0/atmosphere
            link_target: untrusted/project_3/github.com/vexxhost/atmosphere
            role_path: ansible/post_playbook_0/role_0/atmosphere/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/test-playbooks/molecule/pre.yml
          roles:
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/pre_playbook_2/role_0/atmosphere
            link_target: untrusted/project_3/github.com/vexxhost/atmosphere
            role_path: ansible/pre_playbook_2/role_0/atmosphere/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: 5e8bce3962751255a446afd072ce59b0f4f57c60
          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: f7945c4bc9b5f976bc5e64c16ce0777027db0f6d
          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: d2d3e6b411373b1c65156c15ee73b4258260b903
          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: deb4ee3c24c6cc6c96fd2eb582c2a44f997972f0
          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: 877f20f278a35f89e41b9309387f514c8ef4e8d6
          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: 7b4edb1820fba744a11f967ca6e10ec27c480839
          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: d8e2f1fec9dfdf2b1d5438096bb18411a6903c47
          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: c81422e3f6be86394284ce2db3e28ed87a530428
          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
