all:
  children:
    tempest:
      hosts:
        controller: null
    zuul_unreachable:
      hosts: {}
  hosts:
    controller:
      ansible_connection: ssh
      ansible_host: 199.204.45.19
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      configure_swap_size: 8192
      devstack_local_conf:
        post-config:
          $NEUTRON_CONF:
            DEFAULT:
              global_physnet_mtu: '{{ external_bridge_mtu }}'
          /etc/magnum/magnum.conf:
            cluster_template:
              kubernetes_allowed_network_drivers: calico,cilium
              kubernetes_default_network_driver: calico
            nova_client:
              api_version: 2.15
          /etc/manila/manila.conf:
            generic:
              connect_share_server_to_tenant_network: true
              driver_handles_share_servers: true
      devstack_localrc:
        ADMIN_PASSWORD: secretadmin
        DATABASE_PASSWORD: secretdatabase
        DEBUG_LIBVIRT_COREDUMPS: true
        DISABLE_AMP_IMAGE_BUILD: true
        ENABLE_SYSCTL_MEM_TUNING: true
        ENABLE_SYSCTL_NET_TUNING: true
        ENABLE_ZSWAP: true
        ERROR_ON_CLONE: true
        FIXED_RANGE: 10.1.0.0/20
        FLOATING_RANGE: 172.24.5.0/24
        GIT_BASE: https://github.com
        HOST_IP: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
        IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
        LIBVIRT_TYPE: '{{ devstack_libvirt_type | default("qemu") }}'
        LOGFILE: /opt/stack/logs/devstacklog.txt
        LOG_COLOR: false
        MAGNUM_GUEST_IMAGE_URL: '{{ image_url }}'
        MANILA_DEFAULT_SHARE_TYPE_EXTRA_SPECS: snapshot_support=True create_share_from_snapshot_support=True
        MANILA_ENABLED_BACKENDS: generic
        MANILA_USE_SERVICE_INSTANCE_PASSWORD: true
        NETWORK_GATEWAY: 10.1.0.1
        NOVA_LIBVIRT_TB_CACHE_SIZE: 128
        NOVA_VNC_ENABLED: true
        OCTAVIA_NODE: api
        OVN_DBS_LOG_LEVEL: dbg
        PUBLIC_BRIDGE_MTU: '{{ external_bridge_mtu }}'
        PUBLIC_NETWORK_GATEWAY: 172.24.5.1
        RABBIT_PASSWORD: secretrabbit
        SERVICE_HOST: '{{ hostvars[''controller''][''nodepool''][''private_ipv4'']
          }}'
        SERVICE_PASSWORD: secretservice
        SWIFT_HASH: 1234123412341234
        SWIFT_REPLICAS: 1
        SWIFT_START_ALL_SERVICES: false
        VERBOSE: true
        VERBOSE_NO_TIMESTAMP: true
      devstack_plugins:
        barbican: https://github.com/openstack/barbican
        magnum: https://review.opendev.org/openstack/magnum
        magnum-cluster-api: https://github.com/vexxhost/magnum-cluster-api
        manila: https://github.com/openstack/manila
        octavia: https://github.com/openstack/octavia
        ovn-octavia-provider: https://github.com/openstack/ovn-octavia-provider
      devstack_services:
        base: false
        c-api: true
        c-bak: true
        c-sch: true
        c-vol: true
        dstat: false
        etcd3: true
        file_tracker: true
        g-api: true
        horizon: false
        key: true
        memory_tracker: true
        mysql: true
        n-api: true
        n-api-meta: true
        n-cond: true
        n-cpu: true
        n-novnc: true
        n-sch: true
        o-api: true
        o-da: true
        o-hk: true
        octavia: true
        openstack-cli-server: true
        ovn-controller: true
        ovn-northd: true
        ovs-vswitchd: true
        ovsdb-server: true
        placement-api: true
        q-ovn-agent: true
        q-svc: true
        rabbit: true
        s-account: false
        s-container: false
        s-object: false
        s-proxy: false
        tempest: false
        tls-proxy: true
      extensions_to_txt:
        auto: true
        conf: true
        localrc: true
        log: true
        stackenv: true
      image_url: https://github.com/vexxhost/capo-image-elements/releases/latest/download/ubuntu-22.04-{{
        kube_tag }}.qcow2
      kube_tag: v1.33.11
      network_driver: cilium
      nodepool:
        az: nova
        cloud: public
        external_id: dbf2f1fc-180f-4eec-91cb-185ceb0bb304
        host_id: d953b2b79ff732b94d97ea6274a0c4d1174b1c52cbf038923e842d1b
        interface_ip: 199.204.45.19
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.19
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.19
        public_ipv6: 2604:e100:1:0:f816:3eff:fe40:27d7
        region: ca-ymq-1
        slot: null
      zuul_copy_output:
        /etc/ceph: logs
        /etc/glusterfs/glusterd.vol: logs
        /etc/libvirt: logs
        /etc/lvm: logs
        /etc/resolv.conf: logs
        /etc/sudoers: logs
        /etc/sudoers.d: logs
        /var/log/ceph: logs
        /var/log/glusterfs: logs
        /var/log/libvirt: logs
        /var/log/mysql: logs
        /var/log/openvswitch: logs
        /var/log/postgresql: logs
        /var/log/rabbitmq: logs
        /var/log/unbound.log: logs
        '{{ devstack_conf_dir }}/.localrc.auto': logs
        '{{ devstack_conf_dir }}/.stackenv': logs
        '{{ devstack_conf_dir }}/local.conf': logs
        '{{ devstack_conf_dir }}/localrc': logs
        '{{ devstack_full_log}}': logs
        '{{ devstack_log_dir }}/atop': logs
        '{{ devstack_log_dir }}/devstacklog.txt': logs
        '{{ devstack_log_dir }}/devstacklog.txt.summary': logs
        '{{ devstack_log_dir }}/dstat-csv.log': logs
        '{{ devstack_log_dir }}/qemu.coredump': logs
        '{{ devstack_log_dir }}/tcpdump.pcap': logs
        '{{ devstack_log_dir }}/worlddump-latest.txt': logs
        '{{ stage_dir }}/apache': logs
        '{{ stage_dir }}/apache_config': logs
        '{{ stage_dir }}/audit.log': logs
        '{{ stage_dir }}/core': logs
        '{{ stage_dir }}/deprecations.log': logs
        '{{ stage_dir }}/df.txt': logs
        '{{ stage_dir }}/dpkg-l.txt': logs
        '{{ stage_dir }}/etc': logs
        '{{ stage_dir }}/iptables.txt': logs
        '{{ stage_dir }}/listen53.txt': logs
        '{{ stage_dir }}/mount.txt': logs
        '{{ stage_dir }}/performance.json': logs
        '{{ stage_dir }}/pip2-freeze.txt': logs
        '{{ stage_dir }}/pip3-freeze.txt': logs
        '{{ stage_dir }}/rpm-qa.txt': logs
        '{{ stage_dir }}/services.txt': logs
        '{{ stage_dir }}/verify_tempest_conf.log': logs
      zuul_node:
        az: nova
        cloud: public
        external_id: dbf2f1fc-180f-4eec-91cb-185ceb0bb304
        host_id: d953b2b79ff732b94d97ea6274a0c4d1174b1c52cbf038923e842d1b
        interface_ip: 199.204.45.19
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 199.204.45.19
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.204.45.19
        public_ipv6: 2604:e100:1:0:f816:3eff:fe40:27d7
        region: ca-ymq-1
        slot: null
        uuid: null
  vars:
    configure_swap_size: 8192
    devstack_local_conf:
      post-config:
        $NEUTRON_CONF:
          DEFAULT:
            global_physnet_mtu: '{{ external_bridge_mtu }}'
        /etc/magnum/magnum.conf:
          cluster_template:
            kubernetes_allowed_network_drivers: calico,cilium
            kubernetes_default_network_driver: calico
          nova_client:
            api_version: 2.15
        /etc/manila/manila.conf:
          generic:
            connect_share_server_to_tenant_network: true
            driver_handles_share_servers: true
    devstack_localrc:
      ADMIN_PASSWORD: secretadmin
      DATABASE_PASSWORD: secretdatabase
      DEBUG_LIBVIRT_COREDUMPS: true
      DISABLE_AMP_IMAGE_BUILD: true
      ENABLE_SYSCTL_MEM_TUNING: true
      ENABLE_SYSCTL_NET_TUNING: true
      ENABLE_ZSWAP: true
      ERROR_ON_CLONE: true
      FIXED_RANGE: 10.1.0.0/20
      FLOATING_RANGE: 172.24.5.0/24
      GIT_BASE: https://github.com
      HOST_IP: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
      IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
      LIBVIRT_TYPE: '{{ devstack_libvirt_type | default("qemu") }}'
      LOGFILE: /opt/stack/logs/devstacklog.txt
      LOG_COLOR: false
      MAGNUM_GUEST_IMAGE_URL: '{{ image_url }}'
      MANILA_DEFAULT_SHARE_TYPE_EXTRA_SPECS: snapshot_support=True create_share_from_snapshot_support=True
      MANILA_ENABLED_BACKENDS: generic
      MANILA_USE_SERVICE_INSTANCE_PASSWORD: true
      NETWORK_GATEWAY: 10.1.0.1
      NOVA_LIBVIRT_TB_CACHE_SIZE: 128
      NOVA_VNC_ENABLED: true
      OCTAVIA_NODE: api
      OVN_DBS_LOG_LEVEL: dbg
      PUBLIC_BRIDGE_MTU: '{{ external_bridge_mtu }}'
      PUBLIC_NETWORK_GATEWAY: 172.24.5.1
      RABBIT_PASSWORD: secretrabbit
      SERVICE_HOST: '{{ hostvars[''controller''][''nodepool''][''private_ipv4''] }}'
      SERVICE_PASSWORD: secretservice
      SWIFT_HASH: 1234123412341234
      SWIFT_REPLICAS: 1
      SWIFT_START_ALL_SERVICES: false
      VERBOSE: true
      VERBOSE_NO_TIMESTAMP: true
    devstack_plugins:
      barbican: https://github.com/openstack/barbican
      magnum: https://review.opendev.org/openstack/magnum
      magnum-cluster-api: https://github.com/vexxhost/magnum-cluster-api
      manila: https://github.com/openstack/manila
      octavia: https://github.com/openstack/octavia
      ovn-octavia-provider: https://github.com/openstack/ovn-octavia-provider
    devstack_services:
      base: false
      c-api: true
      c-bak: true
      c-sch: true
      c-vol: true
      dstat: false
      etcd3: true
      file_tracker: true
      g-api: true
      horizon: false
      key: true
      memory_tracker: true
      mysql: true
      n-api: true
      n-api-meta: true
      n-cond: true
      n-cpu: true
      n-novnc: true
      n-sch: true
      o-api: true
      o-da: true
      o-hk: true
      octavia: true
      openstack-cli-server: true
      ovn-controller: true
      ovn-northd: true
      ovs-vswitchd: true
      ovsdb-server: true
      placement-api: true
      q-ovn-agent: true
      q-svc: true
      rabbit: true
      s-account: false
      s-container: false
      s-object: false
      s-proxy: false
      tempest: false
      tls-proxy: true
    extensions_to_txt:
      auto: true
      conf: true
      localrc: true
      log: true
      stackenv: true
    image_url: https://github.com/vexxhost/capo-image-elements/releases/latest/download/ubuntu-22.04-{{
      kube_tag }}.qcow2
    kube_tag: v1.33.11
    network_driver: cilium
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#1>'
      - '<Job openstack-multinode-fips explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#17>'
      - '<Job devstack-base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#368>'
      - '<Job devstack-minimal explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#502>'
      - '<Job devstack explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#545>'
      - '<Job magnum-cluster-api-devstack explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#1>'
      - '<Job magnum-cluster-api-hydrophone explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#60>'
      - '<Job magnum-cluster-api-hydrophone-v1.33.11 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#72>'
      - '<Job magnum-cluster-api-hydrophone-v1.33.11-cilium explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#84>'
      - '<Job magnum-cluster-api-hydrophone-v1.33.11-cilium explicit: None implied:
        None source: vexxhost/magnum-cluster-api/zuul.d/project.yaml@main#1>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: bda389082ea044988ebd262f187aafd9
      build_refs:
      - branch: main
        change: '1022'
        change_message: "feat(bootstrap_status): explicit sentinel + error-log capture
          for cloud-init failures\n\n## Problem\n\nWhen user-supplied bootstrap commands
          (e.g. `extra_post_kubeadm_commands`, custom `runcmd` from extra cloud-init)
          fail mid-bootstrap, the failure can be silent from Magnum's point of view:\n\n*
          cloud-init writes its `boot-finished` sentinel based on the *overall* runcmd
          block, not the *last* command's exit status, so a partial-success boot can
          still leave the sentinel in place.\n* CAPI's kubeadm bootstrap provider
          has no error-log path it can populate from the failing node \u2014 there
          is no file at the canonical location.\n* The cluster ends up in `UNHEALTHY`
          / `CREATE_FAILED` state with an empty `status_reason`, leaving the operator
          to SSH into the master to find out what broke.\n\n## Solution\n\nIntroduces
          a new `bootstrap_status` feature that injects a small, idempotent trailer
          into both control-plane (`KubeadmControlPlaneTemplate`) and worker (`KubeadmConfigTemplate`)
          bootstrap specs:\n\n1. **`preKubeadmCommands`** installs a bash `ERR`/`EXIT`
          trap that, on any non-zero exit during the userdata, copies the tail of
          `/var/log/cloud-init-output.log` to `/run/cluster-api/bootstrap-error.log`.
          CAPI's kubeadm bootstrap provider surfaces this file as a Machine condition
          automatically.\n2. **`postKubeadmCommands`** writes `/run/cluster-api/bootstrap-success.complete`
          explicitly. The explicit write guarantees the sentinel reflects the *last*
          user-supplied command's exit status \u2014 not just cloud-init's overall
          block.\n\nLayer 2 (ship the error log into a ConfigMap on the management
          cluster) and Layer 3 (driver-side aggregation of `KubeadmConfig.Status.Conditions`)
          are deliberately out of scope: they require kubectl + injected credentials
          on the failing node, and a separate poller change that mirrors the Machine.Status.Conditions
          walk added by the companion `status_reason` aggregator.\n\nGated by an opt-out
          label `bootstrap_status_enabled` (default `true`) so integration tests that
          intentionally exercise broken bootstrap can disable the trailer.\n\nAlso
          initialises empty `preKubeadmCommands` / `postKubeadmCommands` arrays in
          the worker static template fixture so feature patches can safely append
          via JSON-Patch `/-` (the CP fixture already had these).\n\n## Changes\n\n*
          `src/features/bootstrap_status.rs` \u2014 new feature module emitting the
          pre/post trailers.\n* `src/features/mod.rs` \u2014 register `bootstrap_status`.\n*
          `src/magnum.rs` \u2014 `bootstrap_status_enabled` label (default `true`).\n*
          `src/resources.rs` \u2014 bump topology-variable count + add `bootstrapStatus`
          assertion.\n* CP/worker static template fixtures \u2014 empty pre/post arrays
          initialised.\n* New unit tests in `src/features/bootstrap_status.rs`.\n\n##
          Tests\n\n`cargo test --lib` \u2014 all green.\n\n## Why draft\n\nE2E validation
          in progress. The repro recipe needs a runcmd that genuinely fails (single
          `false` in a runcmd entry; `;exit N` chains do *not* fail bootstrap because
          cloud-init splits on `;` into separate runcmd entries and `exit N` only
          exits its own subshell). Once a clean repro confirms the error-log path
          surfaces in `cluster.status_reason`, the PR will be marked Ready.\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1022
        commit_id: 85c145966d0542f833596e5a85d2a7ea807cddb2
        patchset: 85c145966d0542f833596e5a85d2a7ea807cddb2
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          name: vexxhost/magnum-cluster-api
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        src_dir: src/github.com/vexxhost/magnum-cluster-api
        topic: null
      buildset: 3a690ba31fa74cffb21f39ecbc8a682b
      buildset_refs:
      - branch: main
        change: '1022'
        change_message: "feat(bootstrap_status): explicit sentinel + error-log capture
          for cloud-init failures\n\n## Problem\n\nWhen user-supplied bootstrap commands
          (e.g. `extra_post_kubeadm_commands`, custom `runcmd` from extra cloud-init)
          fail mid-bootstrap, the failure can be silent from Magnum's point of view:\n\n*
          cloud-init writes its `boot-finished` sentinel based on the *overall* runcmd
          block, not the *last* command's exit status, so a partial-success boot can
          still leave the sentinel in place.\n* CAPI's kubeadm bootstrap provider
          has no error-log path it can populate from the failing node \u2014 there
          is no file at the canonical location.\n* The cluster ends up in `UNHEALTHY`
          / `CREATE_FAILED` state with an empty `status_reason`, leaving the operator
          to SSH into the master to find out what broke.\n\n## Solution\n\nIntroduces
          a new `bootstrap_status` feature that injects a small, idempotent trailer
          into both control-plane (`KubeadmControlPlaneTemplate`) and worker (`KubeadmConfigTemplate`)
          bootstrap specs:\n\n1. **`preKubeadmCommands`** installs a bash `ERR`/`EXIT`
          trap that, on any non-zero exit during the userdata, copies the tail of
          `/var/log/cloud-init-output.log` to `/run/cluster-api/bootstrap-error.log`.
          CAPI's kubeadm bootstrap provider surfaces this file as a Machine condition
          automatically.\n2. **`postKubeadmCommands`** writes `/run/cluster-api/bootstrap-success.complete`
          explicitly. The explicit write guarantees the sentinel reflects the *last*
          user-supplied command's exit status \u2014 not just cloud-init's overall
          block.\n\nLayer 2 (ship the error log into a ConfigMap on the management
          cluster) and Layer 3 (driver-side aggregation of `KubeadmConfig.Status.Conditions`)
          are deliberately out of scope: they require kubectl + injected credentials
          on the failing node, and a separate poller change that mirrors the Machine.Status.Conditions
          walk added by the companion `status_reason` aggregator.\n\nGated by an opt-out
          label `bootstrap_status_enabled` (default `true`) so integration tests that
          intentionally exercise broken bootstrap can disable the trailer.\n\nAlso
          initialises empty `preKubeadmCommands` / `postKubeadmCommands` arrays in
          the worker static template fixture so feature patches can safely append
          via JSON-Patch `/-` (the CP fixture already had these).\n\n## Changes\n\n*
          `src/features/bootstrap_status.rs` \u2014 new feature module emitting the
          pre/post trailers.\n* `src/features/mod.rs` \u2014 register `bootstrap_status`.\n*
          `src/magnum.rs` \u2014 `bootstrap_status_enabled` label (default `true`).\n*
          `src/resources.rs` \u2014 bump topology-variable count + add `bootstrapStatus`
          assertion.\n* CP/worker static template fixtures \u2014 empty pre/post arrays
          initialised.\n* New unit tests in `src/features/bootstrap_status.rs`.\n\n##
          Tests\n\n`cargo test --lib` \u2014 all green.\n\n## Why draft\n\nE2E validation
          in progress. The repro recipe needs a runcmd that genuinely fails (single
          `false` in a runcmd entry; `;exit N` chains do *not* fail bootstrap because
          cloud-init splits on `;` into separate runcmd entries and `exit N` only
          exits its own subshell). Once a clean repro confirms the error-log path
          surfaces in `cluster.status_reason`, the PR will be marked Ready.\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1022
        commit_id: 85c145966d0542f833596e5a85d2a7ea807cddb2
        patchset: 85c145966d0542f833596e5a85d2a7ea807cddb2
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          name: vexxhost/magnum-cluster-api
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        src_dir: src/github.com/vexxhost/magnum-cluster-api
        topic: null
      change: '1022'
      change_message: "feat(bootstrap_status): explicit sentinel + error-log capture
        for cloud-init failures\n\n## Problem\n\nWhen user-supplied bootstrap commands
        (e.g. `extra_post_kubeadm_commands`, custom `runcmd` from extra cloud-init)
        fail mid-bootstrap, the failure can be silent from Magnum's point of view:\n\n*
        cloud-init writes its `boot-finished` sentinel based on the *overall* runcmd
        block, not the *last* command's exit status, so a partial-success boot can
        still leave the sentinel in place.\n* CAPI's kubeadm bootstrap provider has
        no error-log path it can populate from the failing node \u2014 there is no
        file at the canonical location.\n* The cluster ends up in `UNHEALTHY` / `CREATE_FAILED`
        state with an empty `status_reason`, leaving the operator to SSH into the
        master to find out what broke.\n\n## Solution\n\nIntroduces a new `bootstrap_status`
        feature that injects a small, idempotent trailer into both control-plane (`KubeadmControlPlaneTemplate`)
        and worker (`KubeadmConfigTemplate`) bootstrap specs:\n\n1. **`preKubeadmCommands`**
        installs a bash `ERR`/`EXIT` trap that, on any non-zero exit during the userdata,
        copies the tail of `/var/log/cloud-init-output.log` to `/run/cluster-api/bootstrap-error.log`.
        CAPI's kubeadm bootstrap provider surfaces this file as a Machine condition
        automatically.\n2. **`postKubeadmCommands`** writes `/run/cluster-api/bootstrap-success.complete`
        explicitly. The explicit write guarantees the sentinel reflects the *last*
        user-supplied command's exit status \u2014 not just cloud-init's overall block.\n\nLayer
        2 (ship the error log into a ConfigMap on the management cluster) and Layer
        3 (driver-side aggregation of `KubeadmConfig.Status.Conditions`) are deliberately
        out of scope: they require kubectl + injected credentials on the failing node,
        and a separate poller change that mirrors the Machine.Status.Conditions walk
        added by the companion `status_reason` aggregator.\n\nGated by an opt-out
        label `bootstrap_status_enabled` (default `true`) so integration tests that
        intentionally exercise broken bootstrap can disable the trailer.\n\nAlso initialises
        empty `preKubeadmCommands` / `postKubeadmCommands` arrays in the worker static
        template fixture so feature patches can safely append via JSON-Patch `/-`
        (the CP fixture already had these).\n\n## Changes\n\n* `src/features/bootstrap_status.rs`
        \u2014 new feature module emitting the pre/post trailers.\n* `src/features/mod.rs`
        \u2014 register `bootstrap_status`.\n* `src/magnum.rs` \u2014 `bootstrap_status_enabled`
        label (default `true`).\n* `src/resources.rs` \u2014 bump topology-variable
        count + add `bootstrapStatus` assertion.\n* CP/worker static template fixtures
        \u2014 empty pre/post arrays initialised.\n* New unit tests in `src/features/bootstrap_status.rs`.\n\n##
        Tests\n\n`cargo test --lib` \u2014 all green.\n\n## Why draft\n\nE2E validation
        in progress. The repro recipe needs a runcmd that genuinely fails (single
        `false` in a runcmd entry; `;exit N` chains do *not* fail bootstrap because
        cloud-init splits on `;` into separate runcmd entries and `exit N` only exits
        its own subshell). Once a clean repro confirms the error-log path surfaces
        in `cluster.status_reason`, the PR will be marked Ready.\n"
      change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1022
      child_jobs: []
      commit_id: 85c145966d0542f833596e5a85d2a7ea807cddb2
      event_id: 86f5a2b0-4f57-11f1-902a-0f19e622a3c1
      executor:
        hostname: 2d72f0692154
        inventory_file: /var/lib/zuul/builds/bda389082ea044988ebd262f187aafd9/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/bda389082ea044988ebd262f187aafd9/work/logs
        result_data_file: /var/lib/zuul/builds/bda389082ea044988ebd262f187aafd9/work/results.json
        src_root: /var/lib/zuul/builds/bda389082ea044988ebd262f187aafd9/work/src
        work_root: /var/lib/zuul/builds/bda389082ea044988ebd262f187aafd9/work
      include_vars: []
      items:
      - branch: main
        change: '1022'
        change_message: "feat(bootstrap_status): explicit sentinel + error-log capture
          for cloud-init failures\n\n## Problem\n\nWhen user-supplied bootstrap commands
          (e.g. `extra_post_kubeadm_commands`, custom `runcmd` from extra cloud-init)
          fail mid-bootstrap, the failure can be silent from Magnum's point of view:\n\n*
          cloud-init writes its `boot-finished` sentinel based on the *overall* runcmd
          block, not the *last* command's exit status, so a partial-success boot can
          still leave the sentinel in place.\n* CAPI's kubeadm bootstrap provider
          has no error-log path it can populate from the failing node \u2014 there
          is no file at the canonical location.\n* The cluster ends up in `UNHEALTHY`
          / `CREATE_FAILED` state with an empty `status_reason`, leaving the operator
          to SSH into the master to find out what broke.\n\n## Solution\n\nIntroduces
          a new `bootstrap_status` feature that injects a small, idempotent trailer
          into both control-plane (`KubeadmControlPlaneTemplate`) and worker (`KubeadmConfigTemplate`)
          bootstrap specs:\n\n1. **`preKubeadmCommands`** installs a bash `ERR`/`EXIT`
          trap that, on any non-zero exit during the userdata, copies the tail of
          `/var/log/cloud-init-output.log` to `/run/cluster-api/bootstrap-error.log`.
          CAPI's kubeadm bootstrap provider surfaces this file as a Machine condition
          automatically.\n2. **`postKubeadmCommands`** writes `/run/cluster-api/bootstrap-success.complete`
          explicitly. The explicit write guarantees the sentinel reflects the *last*
          user-supplied command's exit status \u2014 not just cloud-init's overall
          block.\n\nLayer 2 (ship the error log into a ConfigMap on the management
          cluster) and Layer 3 (driver-side aggregation of `KubeadmConfig.Status.Conditions`)
          are deliberately out of scope: they require kubectl + injected credentials
          on the failing node, and a separate poller change that mirrors the Machine.Status.Conditions
          walk added by the companion `status_reason` aggregator.\n\nGated by an opt-out
          label `bootstrap_status_enabled` (default `true`) so integration tests that
          intentionally exercise broken bootstrap can disable the trailer.\n\nAlso
          initialises empty `preKubeadmCommands` / `postKubeadmCommands` arrays in
          the worker static template fixture so feature patches can safely append
          via JSON-Patch `/-` (the CP fixture already had these).\n\n## Changes\n\n*
          `src/features/bootstrap_status.rs` \u2014 new feature module emitting the
          pre/post trailers.\n* `src/features/mod.rs` \u2014 register `bootstrap_status`.\n*
          `src/magnum.rs` \u2014 `bootstrap_status_enabled` label (default `true`).\n*
          `src/resources.rs` \u2014 bump topology-variable count + add `bootstrapStatus`
          assertion.\n* CP/worker static template fixtures \u2014 empty pre/post arrays
          initialised.\n* New unit tests in `src/features/bootstrap_status.rs`.\n\n##
          Tests\n\n`cargo test --lib` \u2014 all green.\n\n## Why draft\n\nE2E validation
          in progress. The repro recipe needs a runcmd that genuinely fails (single
          `false` in a runcmd entry; `;exit N` chains do *not* fail bootstrap because
          cloud-init splits on `;` into separate runcmd entries and `exit N` only
          exits its own subshell). Once a clean repro confirms the error-log path
          surfaces in `cluster.status_reason`, the PR will be marked Ready.\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1022
        commit_id: 85c145966d0542f833596e5a85d2a7ea807cddb2
        patchset: 85c145966d0542f833596e5a85d2a7ea807cddb2
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          name: vexxhost/magnum-cluster-api
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        topic: null
      job: magnum-cluster-api-hydrophone-v1.33.11-cilium
      jobtags: []
      max_attempts: 3
      message: ZmVhdChib290c3RyYXBfc3RhdHVzKTogZXhwbGljaXQgc2VudGluZWwgKyBlcnJvci1sb2cgY2FwdHVyZSBmb3IgY2xvdWQtaW5pdCBmYWlsdXJlcwoKIyMgUHJvYmxlbQoKV2hlbiB1c2VyLXN1cHBsaWVkIGJvb3RzdHJhcCBjb21tYW5kcyAoZS5nLiBgZXh0cmFfcG9zdF9rdWJlYWRtX2NvbW1hbmRzYCwgY3VzdG9tIGBydW5jbWRgIGZyb20gZXh0cmEgY2xvdWQtaW5pdCkgZmFpbCBtaWQtYm9vdHN0cmFwLCB0aGUgZmFpbHVyZSBjYW4gYmUgc2lsZW50IGZyb20gTWFnbnVtJ3MgcG9pbnQgb2YgdmlldzoKCiogY2xvdWQtaW5pdCB3cml0ZXMgaXRzIGBib290LWZpbmlzaGVkYCBzZW50aW5lbCBiYXNlZCBvbiB0aGUgKm92ZXJhbGwqIHJ1bmNtZCBibG9jaywgbm90IHRoZSAqbGFzdCogY29tbWFuZCdzIGV4aXQgc3RhdHVzLCBzbyBhIHBhcnRpYWwtc3VjY2VzcyBib290IGNhbiBzdGlsbCBsZWF2ZSB0aGUgc2VudGluZWwgaW4gcGxhY2UuCiogQ0FQSSdzIGt1YmVhZG0gYm9vdHN0cmFwIHByb3ZpZGVyIGhhcyBubyBlcnJvci1sb2cgcGF0aCBpdCBjYW4gcG9wdWxhdGUgZnJvbSB0aGUgZmFpbGluZyBub2RlIOKAlCB0aGVyZSBpcyBubyBmaWxlIGF0IHRoZSBjYW5vbmljYWwgbG9jYXRpb24uCiogVGhlIGNsdXN0ZXIgZW5kcyB1cCBpbiBgVU5IRUFMVEhZYCAvIGBDUkVBVEVfRkFJTEVEYCBzdGF0ZSB3aXRoIGFuIGVtcHR5IGBzdGF0dXNfcmVhc29uYCwgbGVhdmluZyB0aGUgb3BlcmF0b3IgdG8gU1NIIGludG8gdGhlIG1hc3RlciB0byBmaW5kIG91dCB3aGF0IGJyb2tlLgoKIyMgU29sdXRpb24KCkludHJvZHVjZXMgYSBuZXcgYGJvb3RzdHJhcF9zdGF0dXNgIGZlYXR1cmUgdGhhdCBpbmplY3RzIGEgc21hbGwsIGlkZW1wb3RlbnQgdHJhaWxlciBpbnRvIGJvdGggY29udHJvbC1wbGFuZSAoYEt1YmVhZG1Db250cm9sUGxhbmVUZW1wbGF0ZWApIGFuZCB3b3JrZXIgKGBLdWJlYWRtQ29uZmlnVGVtcGxhdGVgKSBib290c3RyYXAgc3BlY3M6CgoxLiAqKmBwcmVLdWJlYWRtQ29tbWFuZHNgKiogaW5zdGFsbHMgYSBiYXNoIGBFUlJgL2BFWElUYCB0cmFwIHRoYXQsIG9uIGFueSBub24temVybyBleGl0IGR1cmluZyB0aGUgdXNlcmRhdGEsIGNvcGllcyB0aGUgdGFpbCBvZiBgL3Zhci9sb2cvY2xvdWQtaW5pdC1vdXRwdXQubG9nYCB0byBgL3J1bi9jbHVzdGVyLWFwaS9ib290c3RyYXAtZXJyb3IubG9nYC4gQ0FQSSdzIGt1YmVhZG0gYm9vdHN0cmFwIHByb3ZpZGVyIHN1cmZhY2VzIHRoaXMgZmlsZSBhcyBhIE1hY2hpbmUgY29uZGl0aW9uIGF1dG9tYXRpY2FsbHkuCjIuICoqYHBvc3RLdWJlYWRtQ29tbWFuZHNgKiogd3JpdGVzIGAvcnVuL2NsdXN0ZXItYXBpL2Jvb3RzdHJhcC1zdWNjZXNzLmNvbXBsZXRlYCBleHBsaWNpdGx5LiBUaGUgZXhwbGljaXQgd3JpdGUgZ3VhcmFudGVlcyB0aGUgc2VudGluZWwgcmVmbGVjdHMgdGhlICpsYXN0KiB1c2VyLXN1cHBsaWVkIGNvbW1hbmQncyBleGl0IHN0YXR1cyDigJQgbm90IGp1c3QgY2xvdWQtaW5pdCdzIG92ZXJhbGwgYmxvY2suCgpMYXllciAyIChzaGlwIHRoZSBlcnJvciBsb2cgaW50byBhIENvbmZpZ01hcCBvbiB0aGUgbWFuYWdlbWVudCBjbHVzdGVyKSBhbmQgTGF5ZXIgMyAoZHJpdmVyLXNpZGUgYWdncmVnYXRpb24gb2YgYEt1YmVhZG1Db25maWcuU3RhdHVzLkNvbmRpdGlvbnNgKSBhcmUgZGVsaWJlcmF0ZWx5IG91dCBvZiBzY29wZTogdGhleSByZXF1aXJlIGt1YmVjdGwgKyBpbmplY3RlZCBjcmVkZW50aWFscyBvbiB0aGUgZmFpbGluZyBub2RlLCBhbmQgYSBzZXBhcmF0ZSBwb2xsZXIgY2hhbmdlIHRoYXQgbWlycm9ycyB0aGUgTWFjaGluZS5TdGF0dXMuQ29uZGl0aW9ucyB3YWxrIGFkZGVkIGJ5IHRoZSBjb21wYW5pb24gYHN0YXR1c19yZWFzb25gIGFnZ3JlZ2F0b3IuCgpHYXRlZCBieSBhbiBvcHQtb3V0IGxhYmVsIGBib290c3RyYXBfc3RhdHVzX2VuYWJsZWRgIChkZWZhdWx0IGB0cnVlYCkgc28gaW50ZWdyYXRpb24gdGVzdHMgdGhhdCBpbnRlbnRpb25hbGx5IGV4ZXJjaXNlIGJyb2tlbiBib290c3RyYXAgY2FuIGRpc2FibGUgdGhlIHRyYWlsZXIuCgpBbHNvIGluaXRpYWxpc2VzIGVtcHR5IGBwcmVLdWJlYWRtQ29tbWFuZHNgIC8gYHBvc3RLdWJlYWRtQ29tbWFuZHNgIGFycmF5cyBpbiB0aGUgd29ya2VyIHN0YXRpYyB0ZW1wbGF0ZSBmaXh0dXJlIHNvIGZlYXR1cmUgcGF0Y2hlcyBjYW4gc2FmZWx5IGFwcGVuZCB2aWEgSlNPTi1QYXRjaCBgLy1gICh0aGUgQ1AgZml4dHVyZSBhbHJlYWR5IGhhZCB0aGVzZSkuCgojIyBDaGFuZ2VzCgoqIGBzcmMvZmVhdHVyZXMvYm9vdHN0cmFwX3N0YXR1cy5yc2Ag4oCUIG5ldyBmZWF0dXJlIG1vZHVsZSBlbWl0dGluZyB0aGUgcHJlL3Bvc3QgdHJhaWxlcnMuCiogYHNyYy9mZWF0dXJlcy9tb2QucnNgIOKAlCByZWdpc3RlciBgYm9vdHN0cmFwX3N0YXR1c2AuCiogYHNyYy9tYWdudW0ucnNgIOKAlCBgYm9vdHN0cmFwX3N0YXR1c19lbmFibGVkYCBsYWJlbCAoZGVmYXVsdCBgdHJ1ZWApLgoqIGBzcmMvcmVzb3VyY2VzLnJzYCDigJQgYnVtcCB0b3BvbG9neS12YXJpYWJsZSBjb3VudCArIGFkZCBgYm9vdHN0cmFwU3RhdHVzYCBhc3NlcnRpb24uCiogQ1Avd29ya2VyIHN0YXRpYyB0ZW1wbGF0ZSBmaXh0dXJlcyDigJQgZW1wdHkgcHJlL3Bvc3QgYXJyYXlzIGluaXRpYWxpc2VkLgoqIE5ldyB1bml0IHRlc3RzIGluIGBzcmMvZmVhdHVyZXMvYm9vdHN0cmFwX3N0YXR1cy5yc2AuCgojIyBUZXN0cwoKYGNhcmdvIHRlc3QgLS1saWJgIOKAlCBhbGwgZ3JlZW4uCgojIyBXaHkgZHJhZnQKCkUyRSB2YWxpZGF0aW9uIGluIHByb2dyZXNzLiBUaGUgcmVwcm8gcmVjaXBlIG5lZWRzIGEgcnVuY21kIHRoYXQgZ2VudWluZWx5IGZhaWxzIChzaW5nbGUgYGZhbHNlYCBpbiBhIHJ1bmNtZCBlbnRyeTsgYDtleGl0IE5gIGNoYWlucyBkbyAqbm90KiBmYWlsIGJvb3RzdHJhcCBiZWNhdXNlIGNsb3VkLWluaXQgc3BsaXRzIG9uIGA7YCBpbnRvIHNlcGFyYXRlIHJ1bmNtZCBlbnRyaWVzIGFuZCBgZXhpdCBOYCBvbmx5IGV4aXRzIGl0cyBvd24gc3Vic2hlbGwpLiBPbmNlIGEgY2xlYW4gcmVwcm8gY29uZmlybXMgdGhlIGVycm9yLWxvZyBwYXRoIHN1cmZhY2VzIGluIGBjbHVzdGVyLnN0YXR1c19yZWFzb25gLCB0aGUgUFIgd2lsbCBiZSBtYXJrZWQgUmVhZHkuCg==
      override_checkout: master
      patchset: 85c145966d0542f833596e5a85d2a7ea807cddb2
      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: 79fe3eb1d01f8ac5739b0b7bc4759c407b6e248d
          trusted/project_2/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: a6e68243e02ef030ce5e75f8b67630880c475f33
          untrusted/project_0/opendev.org/openstack/devstack:
            canonical_name: opendev.org/openstack/devstack
            checkout: master
            commit: 81ed81ebbee6642f0959d6dd0480ed42ab383e30
          untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs:
            canonical_name: opendev.org/openstack/openstack-zuul-jobs
            checkout: master
            commit: 26e5947a427032d10118c88870adef4b7b95d3ee
          untrusted/project_2/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 298983cd1253e6833abdb49d87d912527e0e6597
          untrusted/project_3/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: 79fe3eb1d01f8ac5739b0b7bc4759c407b6e248d
          untrusted/project_4/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: a6e68243e02ef030ce5e75f8b67630880c475f33
          untrusted/project_5/github.com/vexxhost/magnum-cluster-api:
            canonical_name: github.com/vexxhost/magnum-cluster-api
            checkout: main
            commit: 85c145966d0542f833596e5a85d2a7ea807cddb2
        playbooks:
        - path: untrusted/project_5/github.com/vexxhost/magnum-cluster-api/zuul.d/playbooks/hydrophone/run.yml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/playbook_0/role_1/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/playbook_0/role_1/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/playbook_0/role_2/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/playbook_0/role_2/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/playbook_0/role_4/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/playbook_0/role_4/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_5/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/playbook_0/role_5/zuul-jobs/roles
        post_playbooks:
        - path: untrusted/project_5/github.com/vexxhost/magnum-cluster-api/zuul.d/playbooks/hydrophone/post.yml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_0/role_1/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/post_playbook_0/role_1/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_0/role_2/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/post_playbook_0/role_2/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_0/role_4/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_0/role_4/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_0/role_5/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_0/role_5/zuul-jobs/roles
        - path: untrusted/project_0/opendev.org/openstack/devstack/playbooks/post.yaml
          roles:
          - checkout: master
            checkout_description: playbook branch
            link_name: ansible/post_playbook_1/role_0/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/post_playbook_1/role_0/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_1/role_1/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/post_playbook_1/role_1/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_1/role_3/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_1/role_3/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_1/role_4/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_1/role_4/zuul-jobs/roles
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/post.yaml
          roles:
          - checkout: master
            checkout_description: job override ref
            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
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/post-logs.yaml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/post_playbook_3/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_3/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_3/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_3/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: job override ref
            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/opendev.org/openstack/devstack/playbooks/pre.yaml
          roles:
          - checkout: master
            checkout_description: playbook branch
            link_name: ansible/pre_playbook_1/role_0/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/pre_playbook_1/role_0/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_1/role_1/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/pre_playbook_1/role_1/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_1/role_3/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_1/role_3/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_1/role_4/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_1/role_4/zuul-jobs/roles
        - path: untrusted/project_5/github.com/vexxhost/magnum-cluster-api/zuul.d/playbooks/hydrophone/pre.yml
          roles:
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_2/role_1/devstack
            link_target: untrusted/project_0/opendev.org/openstack/devstack
            role_path: ansible/pre_playbook_2/role_1/devstack/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_2/role_2/openstack-zuul-jobs
            link_target: untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs
            role_path: ansible/pre_playbook_2/role_2/openstack-zuul-jobs/roles
          - checkout: master
            checkout_description: job override ref
            link_name: ansible/pre_playbook_2/role_4/zuul-jobs
            link_target: untrusted/project_3/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_2/role_4/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_2/role_5/zuul-jobs
            link_target: untrusted/project_4/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_2/role_5/zuul-jobs/roles
      post_review: false
      post_timeout: null
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/vexxhost/magnum-cluster-api
        name: vexxhost/magnum-cluster-api
        short_name: magnum-cluster-api
        src_dir: src/github.com/vexxhost/magnum-cluster-api
      projects:
        github.com/novnc/novnc:
          canonical_hostname: github.com
          canonical_name: github.com/novnc/novnc
          checkout: master
          checkout_description: job override ref
          commit: 8e1ebdffba02e651c399dacef841f8941f6ad6e4
          name: novnc/novnc
          required: true
          short_name: novnc
          src_dir: src/github.com/novnc/novnc
        github.com/vexxhost/magnum-cluster-api:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          checkout: main
          checkout_description: zuul branch
          commit: 85c145966d0542f833596e5a85d2a7ea807cddb2
          name: vexxhost/magnum-cluster-api
          required: false
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        opendev.org/openstack/barbican:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/barbican
          checkout: master
          checkout_description: job override ref
          commit: e05bcda51a132411955ca9ea1371bc9ec2946a13
          name: openstack/barbican
          required: true
          short_name: barbican
          src_dir: src/opendev.org/openstack/barbican
        opendev.org/openstack/cinder:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/cinder
          checkout: master
          checkout_description: job override ref
          commit: 72c1bf33b552eeb7b0a8fd8c2b3857773a42056f
          name: openstack/cinder
          required: true
          short_name: cinder
          src_dir: src/opendev.org/openstack/cinder
        opendev.org/openstack/devstack:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/devstack
          checkout: master
          checkout_description: job override ref
          commit: 81ed81ebbee6642f0959d6dd0480ed42ab383e30
          name: openstack/devstack
          required: true
          short_name: devstack
          src_dir: src/opendev.org/openstack/devstack
        opendev.org/openstack/glance:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/glance
          checkout: master
          checkout_description: job override ref
          commit: eac2fa47f26da3515c7a1e8c91226750517c52d4
          name: openstack/glance
          required: true
          short_name: glance
          src_dir: src/opendev.org/openstack/glance
        opendev.org/openstack/keystone:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/keystone
          checkout: master
          checkout_description: job override ref
          commit: 2230026f77a8ed50493d2d58be9120910ceb2089
          name: openstack/keystone
          required: true
          short_name: keystone
          src_dir: src/opendev.org/openstack/keystone
        opendev.org/openstack/magnum:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/magnum
          checkout: master
          checkout_description: job override ref
          commit: 67475d47b0ab7284188d783df25d9b12d72df7a2
          name: openstack/magnum
          required: true
          short_name: magnum
          src_dir: src/opendev.org/openstack/magnum
        opendev.org/openstack/manila:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/manila
          checkout: master
          checkout_description: job override ref
          commit: bfa1c563e2349f55a663fcf6dd7aee2d9f6c31fe
          name: openstack/manila
          required: true
          short_name: manila
          src_dir: src/opendev.org/openstack/manila
        opendev.org/openstack/neutron:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/neutron
          checkout: master
          checkout_description: job override ref
          commit: 112ecc8d8dde26263d37bffffce4fb7afeacc6a8
          name: openstack/neutron
          required: true
          short_name: neutron
          src_dir: src/opendev.org/openstack/neutron
        opendev.org/openstack/nova:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/nova
          checkout: master
          checkout_description: job override ref
          commit: b2d747f7d7248edb632e5982203d2e90e8e57703
          name: openstack/nova
          required: true
          short_name: nova
          src_dir: src/opendev.org/openstack/nova
        opendev.org/openstack/octavia:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/octavia
          checkout: master
          checkout_description: job override ref
          commit: d16fa5e723701c95cf97a3e9ea57b3856e09aaa7
          name: openstack/octavia
          required: true
          short_name: octavia
          src_dir: src/opendev.org/openstack/octavia
        opendev.org/openstack/os-test-images:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/os-test-images
          checkout: master
          checkout_description: job override ref
          commit: 5d0367e03788764f41da8effffa14e3eac513201
          name: openstack/os-test-images
          required: true
          short_name: os-test-images
          src_dir: src/opendev.org/openstack/os-test-images
        opendev.org/openstack/ovn-octavia-provider:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/ovn-octavia-provider
          checkout: master
          checkout_description: job override ref
          commit: d0a7783cd02566847600d5db1c330e6865594331
          name: openstack/ovn-octavia-provider
          required: true
          short_name: ovn-octavia-provider
          src_dir: src/opendev.org/openstack/ovn-octavia-provider
        opendev.org/openstack/placement:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/placement
          checkout: master
          checkout_description: job override ref
          commit: d2727844011a8f144c818556ed7e8d43f756576f
          name: openstack/placement
          required: true
          short_name: placement
          src_dir: src/opendev.org/openstack/placement
        opendev.org/openstack/python-magnumclient:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/python-magnumclient
          checkout: master
          checkout_description: job override ref
          commit: bfc9dbc2aa9a113c12e591a87f774a6d986a981f
          name: openstack/python-magnumclient
          required: true
          short_name: python-magnumclient
          src_dir: src/opendev.org/openstack/python-magnumclient
        opendev.org/openstack/requirements:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/requirements
          checkout: master
          checkout_description: job override ref
          commit: 6015fe784a11a9066457cf45795423ca585443bb
          name: openstack/requirements
          required: true
          short_name: requirements
          src_dir: src/opendev.org/openstack/requirements
        opendev.org/openstack/swift:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/swift
          checkout: master
          checkout_description: job override ref
          commit: 33967853276f0987a58e5b3aca450173adadc064
          name: openstack/swift
          required: true
          short_name: swift
          src_dir: src/opendev.org/openstack/swift
      ref: refs/pull/1022/head
      resources: {}
      tenant: oss
      timeout: 7200
      topic: null
      voting: true
    zuul_copy_output:
      /etc/ceph: logs
      /etc/glusterfs/glusterd.vol: logs
      /etc/libvirt: logs
      /etc/lvm: logs
      /etc/resolv.conf: logs
      /etc/sudoers: logs
      /etc/sudoers.d: logs
      /var/log/ceph: logs
      /var/log/glusterfs: logs
      /var/log/libvirt: logs
      /var/log/mysql: logs
      /var/log/openvswitch: logs
      /var/log/postgresql: logs
      /var/log/rabbitmq: logs
      /var/log/unbound.log: logs
      '{{ devstack_conf_dir }}/.localrc.auto': logs
      '{{ devstack_conf_dir }}/.stackenv': logs
      '{{ devstack_conf_dir }}/local.conf': logs
      '{{ devstack_conf_dir }}/localrc': logs
      '{{ devstack_full_log}}': logs
      '{{ devstack_log_dir }}/atop': logs
      '{{ devstack_log_dir }}/devstacklog.txt': logs
      '{{ devstack_log_dir }}/devstacklog.txt.summary': logs
      '{{ devstack_log_dir }}/dstat-csv.log': logs
      '{{ devstack_log_dir }}/qemu.coredump': logs
      '{{ devstack_log_dir }}/tcpdump.pcap': logs
      '{{ devstack_log_dir }}/worlddump-latest.txt': logs
      '{{ stage_dir }}/apache': logs
      '{{ stage_dir }}/apache_config': logs
      '{{ stage_dir }}/audit.log': logs
      '{{ stage_dir }}/core': logs
      '{{ stage_dir }}/deprecations.log': logs
      '{{ stage_dir }}/df.txt': logs
      '{{ stage_dir }}/dpkg-l.txt': logs
      '{{ stage_dir }}/etc': logs
      '{{ stage_dir }}/iptables.txt': logs
      '{{ stage_dir }}/listen53.txt': logs
      '{{ stage_dir }}/mount.txt': logs
      '{{ stage_dir }}/performance.json': logs
      '{{ stage_dir }}/pip2-freeze.txt': logs
      '{{ stage_dir }}/pip3-freeze.txt': logs
      '{{ stage_dir }}/rpm-qa.txt': logs
      '{{ stage_dir }}/services.txt': logs
      '{{ stage_dir }}/verify_tempest_conf.log': logs
