all:
  children:
    tempest:
      hosts:
        controller: null
    zuul_unreachable:
      hosts: {}
  hosts:
    controller:
      ansible_connection: ssh
      ansible_host: 162.253.55.223
      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_prefix: ubuntu-24.04
      image_release: 2026.05-7
      image_url: https://github.com/vexxhost/capo-image-elements/releases/download/{{
        image_release }}/{{ image_prefix }}-{{ kube_tag }}.qcow2
      kube_tag: v1.36.1
      network_driver: calico
      nodepool:
        az: yul2
        cloud: public
        external_id: cb5646e9-12a1-43ad-a7c9-c46d65014e36
        host_id: 295be722de1fea3f7e3e51fa3e8841b85f43ad2d1df63019fdbc1696
        interface_ip: 162.253.55.223
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 162.253.55.223
        private_ipv6: null
        provider: yul1
        public_ipv4: 162.253.55.223
        public_ipv6: 2604:e100:1:0:f816:3eff:fea6:27e4
        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: yul2
        cloud: public
        external_id: cb5646e9-12a1-43ad-a7c9-c46d65014e36
        host_id: 295be722de1fea3f7e3e51fa3e8841b85f43ad2d1df63019fdbc1696
        interface_ip: 162.253.55.223
        label: ubuntu-noble-16
        node_properties: {}
        private_ipv4: 162.253.55.223
        private_ipv6: null
        provider: yul1
        public_ipv4: 162.253.55.223
        public_ipv6: 2604:e100:1:0:f816:3eff:fea6:27e4
        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_prefix: ubuntu-24.04
    image_release: 2026.05-7
    image_url: https://github.com/vexxhost/capo-image-elements/releases/download/{{
      image_release }}/{{ image_prefix }}-{{ kube_tag }}.qcow2
    kube_tag: v1.36.1
    network_driver: calico
    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#378>'
      - '<Job devstack-minimal explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#512>'
      - '<Job devstack explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: openstack/devstack/.zuul.yaml@master#555>'
      - '<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/hydrophone-jobs.yaml@main#23>'
      - '<Job magnum-cluster-api-hydrophone-v1.36.1 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/hydrophone-jobs.yaml@main#83>'
      - '<Job magnum-cluster-api-hydrophone-v1.36.1-calico explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: vexxhost/magnum-cluster-api/zuul.d/hydrophone-jobs.yaml@main#89>'
      - '<Job magnum-cluster-api-hydrophone-v1.36.1-calico explicit: None implied:
        None source: vexxhost/magnum-cluster-api/zuul.d/hydrophone-jobs.yaml@main#1>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: ea099b4b187d49df8e723c5b5ba7e6e6
      build_refs:
      - branch: main
        change: '1153'
        change_message: "fix: run under Magnum 2026.2, which dropped eventlet and
          novaclient\n\nMagnum 2026.2 (23.0.0) breaks the driver in two ways. Both
          show up as soon as the conductor runs the 2026.2 code; we hit them upgrading
          a production cloud and have been running this change there since.\n\n###
          1. Calls through `tpool.Proxy` hang on native threads\n\nMagnum 2026.2 dropped
          eventlet (`2e1821ea Drop eventlet`): `magnum/cmd/__init__.py` no longer
          monkey-patches, and the conductor serves RPC and periodic tasks on native
          threads. The driver still wraps the Rust `Driver`, `KubeClient` and `Monitor`
          in `eventlet.tpool.Proxy`. Without a hub, tpool hands each result back through
          the hub of the thread that first used the pool, so a call made from any
          other native thread never returns. The first cluster operation works; every
          later create/delete/resize and the health-status periodic task hang. A minimal
          reproduction (Python 3.14, eventlet 0.41.2): one call from the main thread
          returns in 0.2 s, calls from four other threads all hang, with `greenlet.error:
          Cannot switch to a different thread`.\n\n#1055 drops the proxies altogether,
          and @mnaser pointed out there that they were added because blocking calls
          froze the whole process under eventlet. Both are right for their release,
          so this change keeps them where they are needed: `utils.offload_blocking_calls()`
          returns `tpool.Proxy(obj)` when eventlet has monkey-patched threading (Magnum
          2026.1 and older) and the object itself otherwise. Behaviour on 2026.1 and
          older is unchanged.\n\n### 2. `novaclient` is no longer installed\n\nMagnum
          2026.2 replaced its per-service clients with openstacksdk and dropped `python-novaclient`
          from its requirements. `clients.py` already handles both APIs (#1071), but
          it and `utils.py` still import novaclient at module level, so the driver
          fails to load:\n\n```\nModuleNotFoundError: No module named 'novaclient'\n```\n\nThe
          import is now optional in `clients.py` (the not-found exceptions caught
          become a tuple that includes novaclient's only when it is present), and
          `utils.py` used it for a type annotation alone. novaclient moves to the
          dev dependencies because the unit tests build its `Flavor` objects. #1031
          removes these imports as part of a much larger openstacksdk migration; this
          is the minimal version of that part.\n\n### Testing\n\n- New unit tests:
          the tpool path under eventlet (mocked), and four native threads calling
          through `offload_blocking_calls()` all returning, which hangs with the old
          `tpool.Proxy`.\n- Unit tests in the Magnum 2026.2 image (Python 3.14, no
          novaclient installed; the driver imports) and in the 2026.1 image: 220 passed.
          8 `test_update_nodegroup*` cases fail, the same ones as on `main` without
          this change, with the Rust extension from those images.\n- black 25.1.0,
          isort 6.0.1, flake8 7.2.0 (the pre-commit versions) pass on the changed
          files.\n- In production on Magnum 2026.2: create a cluster (1 control plane
          + 1 worker), health turns HEALTHY within a minute through the monitor periodic
          task, resize to 2 workers, delete. All complete, and nothing is left behind.\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1153
        commit_id: 8e06a2b5c6c62c45c2da002113efda0321e1d44b
        patchset: 8e06a2b5c6c62c45c2da002113efda0321e1d44b
        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: dd70b32f7f8b49b8861dc6e8e7c056b7
      buildset_refs:
      - branch: main
        change: '1153'
        change_message: "fix: run under Magnum 2026.2, which dropped eventlet and
          novaclient\n\nMagnum 2026.2 (23.0.0) breaks the driver in two ways. Both
          show up as soon as the conductor runs the 2026.2 code; we hit them upgrading
          a production cloud and have been running this change there since.\n\n###
          1. Calls through `tpool.Proxy` hang on native threads\n\nMagnum 2026.2 dropped
          eventlet (`2e1821ea Drop eventlet`): `magnum/cmd/__init__.py` no longer
          monkey-patches, and the conductor serves RPC and periodic tasks on native
          threads. The driver still wraps the Rust `Driver`, `KubeClient` and `Monitor`
          in `eventlet.tpool.Proxy`. Without a hub, tpool hands each result back through
          the hub of the thread that first used the pool, so a call made from any
          other native thread never returns. The first cluster operation works; every
          later create/delete/resize and the health-status periodic task hang. A minimal
          reproduction (Python 3.14, eventlet 0.41.2): one call from the main thread
          returns in 0.2 s, calls from four other threads all hang, with `greenlet.error:
          Cannot switch to a different thread`.\n\n#1055 drops the proxies altogether,
          and @mnaser pointed out there that they were added because blocking calls
          froze the whole process under eventlet. Both are right for their release,
          so this change keeps them where they are needed: `utils.offload_blocking_calls()`
          returns `tpool.Proxy(obj)` when eventlet has monkey-patched threading (Magnum
          2026.1 and older) and the object itself otherwise. Behaviour on 2026.1 and
          older is unchanged.\n\n### 2. `novaclient` is no longer installed\n\nMagnum
          2026.2 replaced its per-service clients with openstacksdk and dropped `python-novaclient`
          from its requirements. `clients.py` already handles both APIs (#1071), but
          it and `utils.py` still import novaclient at module level, so the driver
          fails to load:\n\n```\nModuleNotFoundError: No module named 'novaclient'\n```\n\nThe
          import is now optional in `clients.py` (the not-found exceptions caught
          become a tuple that includes novaclient's only when it is present), and
          `utils.py` used it for a type annotation alone. novaclient moves to the
          dev dependencies because the unit tests build its `Flavor` objects. #1031
          removes these imports as part of a much larger openstacksdk migration; this
          is the minimal version of that part.\n\n### Testing\n\n- New unit tests:
          the tpool path under eventlet (mocked), and four native threads calling
          through `offload_blocking_calls()` all returning, which hangs with the old
          `tpool.Proxy`.\n- Unit tests in the Magnum 2026.2 image (Python 3.14, no
          novaclient installed; the driver imports) and in the 2026.1 image: 220 passed.
          8 `test_update_nodegroup*` cases fail, the same ones as on `main` without
          this change, with the Rust extension from those images.\n- black 25.1.0,
          isort 6.0.1, flake8 7.2.0 (the pre-commit versions) pass on the changed
          files.\n- In production on Magnum 2026.2: create a cluster (1 control plane
          + 1 worker), health turns HEALTHY within a minute through the monitor periodic
          task, resize to 2 workers, delete. All complete, and nothing is left behind.\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1153
        commit_id: 8e06a2b5c6c62c45c2da002113efda0321e1d44b
        patchset: 8e06a2b5c6c62c45c2da002113efda0321e1d44b
        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: '1153'
      change_message: "fix: run under Magnum 2026.2, which dropped eventlet and novaclient\n\nMagnum
        2026.2 (23.0.0) breaks the driver in two ways. Both show up as soon as the
        conductor runs the 2026.2 code; we hit them upgrading a production cloud and
        have been running this change there since.\n\n### 1. Calls through `tpool.Proxy`
        hang on native threads\n\nMagnum 2026.2 dropped eventlet (`2e1821ea Drop eventlet`):
        `magnum/cmd/__init__.py` no longer monkey-patches, and the conductor serves
        RPC and periodic tasks on native threads. The driver still wraps the Rust
        `Driver`, `KubeClient` and `Monitor` in `eventlet.tpool.Proxy`. Without a
        hub, tpool hands each result back through the hub of the thread that first
        used the pool, so a call made from any other native thread never returns.
        The first cluster operation works; every later create/delete/resize and the
        health-status periodic task hang. A minimal reproduction (Python 3.14, eventlet
        0.41.2): one call from the main thread returns in 0.2 s, calls from four other
        threads all hang, with `greenlet.error: Cannot switch to a different thread`.\n\n#1055
        drops the proxies altogether, and @mnaser pointed out there that they were
        added because blocking calls froze the whole process under eventlet. Both
        are right for their release, so this change keeps them where they are needed:
        `utils.offload_blocking_calls()` returns `tpool.Proxy(obj)` when eventlet
        has monkey-patched threading (Magnum 2026.1 and older) and the object itself
        otherwise. Behaviour on 2026.1 and older is unchanged.\n\n### 2. `novaclient`
        is no longer installed\n\nMagnum 2026.2 replaced its per-service clients with
        openstacksdk and dropped `python-novaclient` from its requirements. `clients.py`
        already handles both APIs (#1071), but it and `utils.py` still import novaclient
        at module level, so the driver fails to load:\n\n```\nModuleNotFoundError:
        No module named 'novaclient'\n```\n\nThe import is now optional in `clients.py`
        (the not-found exceptions caught become a tuple that includes novaclient's
        only when it is present), and `utils.py` used it for a type annotation alone.
        novaclient moves to the dev dependencies because the unit tests build its
        `Flavor` objects. #1031 removes these imports as part of a much larger openstacksdk
        migration; this is the minimal version of that part.\n\n### Testing\n\n- New
        unit tests: the tpool path under eventlet (mocked), and four native threads
        calling through `offload_blocking_calls()` all returning, which hangs with
        the old `tpool.Proxy`.\n- Unit tests in the Magnum 2026.2 image (Python 3.14,
        no novaclient installed; the driver imports) and in the 2026.1 image: 220
        passed. 8 `test_update_nodegroup*` cases fail, the same ones as on `main`
        without this change, with the Rust extension from those images.\n- black 25.1.0,
        isort 6.0.1, flake8 7.2.0 (the pre-commit versions) pass on the changed files.\n-
        In production on Magnum 2026.2: create a cluster (1 control plane + 1 worker),
        health turns HEALTHY within a minute through the monitor periodic task, resize
        to 2 workers, delete. All complete, and nothing is left behind.\n\n\U0001F916
        Generated with [Claude Code](https://claude.com/claude-code)\n"
      change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1153
      child_jobs: []
      commit_id: 8e06a2b5c6c62c45c2da002113efda0321e1d44b
      event_id: cee951b0-c2c1-11f1-8830-5d3c814be696
      executor:
        hostname: 2d72f0692154
        inventory_file: /var/lib/zuul/builds/ea099b4b187d49df8e723c5b5ba7e6e6/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/ea099b4b187d49df8e723c5b5ba7e6e6/work/logs
        result_data_file: /var/lib/zuul/builds/ea099b4b187d49df8e723c5b5ba7e6e6/work/results.json
        src_root: /var/lib/zuul/builds/ea099b4b187d49df8e723c5b5ba7e6e6/work/src
        work_root: /var/lib/zuul/builds/ea099b4b187d49df8e723c5b5ba7e6e6/work
      include_vars: []
      items:
      - branch: main
        change: '1153'
        change_message: "fix: run under Magnum 2026.2, which dropped eventlet and
          novaclient\n\nMagnum 2026.2 (23.0.0) breaks the driver in two ways. Both
          show up as soon as the conductor runs the 2026.2 code; we hit them upgrading
          a production cloud and have been running this change there since.\n\n###
          1. Calls through `tpool.Proxy` hang on native threads\n\nMagnum 2026.2 dropped
          eventlet (`2e1821ea Drop eventlet`): `magnum/cmd/__init__.py` no longer
          monkey-patches, and the conductor serves RPC and periodic tasks on native
          threads. The driver still wraps the Rust `Driver`, `KubeClient` and `Monitor`
          in `eventlet.tpool.Proxy`. Without a hub, tpool hands each result back through
          the hub of the thread that first used the pool, so a call made from any
          other native thread never returns. The first cluster operation works; every
          later create/delete/resize and the health-status periodic task hang. A minimal
          reproduction (Python 3.14, eventlet 0.41.2): one call from the main thread
          returns in 0.2 s, calls from four other threads all hang, with `greenlet.error:
          Cannot switch to a different thread`.\n\n#1055 drops the proxies altogether,
          and @mnaser pointed out there that they were added because blocking calls
          froze the whole process under eventlet. Both are right for their release,
          so this change keeps them where they are needed: `utils.offload_blocking_calls()`
          returns `tpool.Proxy(obj)` when eventlet has monkey-patched threading (Magnum
          2026.1 and older) and the object itself otherwise. Behaviour on 2026.1 and
          older is unchanged.\n\n### 2. `novaclient` is no longer installed\n\nMagnum
          2026.2 replaced its per-service clients with openstacksdk and dropped `python-novaclient`
          from its requirements. `clients.py` already handles both APIs (#1071), but
          it and `utils.py` still import novaclient at module level, so the driver
          fails to load:\n\n```\nModuleNotFoundError: No module named 'novaclient'\n```\n\nThe
          import is now optional in `clients.py` (the not-found exceptions caught
          become a tuple that includes novaclient's only when it is present), and
          `utils.py` used it for a type annotation alone. novaclient moves to the
          dev dependencies because the unit tests build its `Flavor` objects. #1031
          removes these imports as part of a much larger openstacksdk migration; this
          is the minimal version of that part.\n\n### Testing\n\n- New unit tests:
          the tpool path under eventlet (mocked), and four native threads calling
          through `offload_blocking_calls()` all returning, which hangs with the old
          `tpool.Proxy`.\n- Unit tests in the Magnum 2026.2 image (Python 3.14, no
          novaclient installed; the driver imports) and in the 2026.1 image: 220 passed.
          8 `test_update_nodegroup*` cases fail, the same ones as on `main` without
          this change, with the Rust extension from those images.\n- black 25.1.0,
          isort 6.0.1, flake8 7.2.0 (the pre-commit versions) pass on the changed
          files.\n- In production on Magnum 2026.2: create a cluster (1 control plane
          + 1 worker), health turns HEALTHY within a minute through the monitor periodic
          task, resize to 2 workers, delete. All complete, and nothing is left behind.\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/1153
        commit_id: 8e06a2b5c6c62c45c2da002113efda0321e1d44b
        patchset: 8e06a2b5c6c62c45c2da002113efda0321e1d44b
        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.36.1-calico
      jobtags: []
      max_attempts: 3
      message: Zml4OiBydW4gdW5kZXIgTWFnbnVtIDIwMjYuMiwgd2hpY2ggZHJvcHBlZCBldmVudGxldCBhbmQgbm92YWNsaWVudAoKTWFnbnVtIDIwMjYuMiAoMjMuMC4wKSBicmVha3MgdGhlIGRyaXZlciBpbiB0d28gd2F5cy4gQm90aCBzaG93IHVwIGFzIHNvb24gYXMgdGhlIGNvbmR1Y3RvciBydW5zIHRoZSAyMDI2LjIgY29kZTsgd2UgaGl0IHRoZW0gdXBncmFkaW5nIGEgcHJvZHVjdGlvbiBjbG91ZCBhbmQgaGF2ZSBiZWVuIHJ1bm5pbmcgdGhpcyBjaGFuZ2UgdGhlcmUgc2luY2UuCgojIyMgMS4gQ2FsbHMgdGhyb3VnaCBgdHBvb2wuUHJveHlgIGhhbmcgb24gbmF0aXZlIHRocmVhZHMKCk1hZ251bSAyMDI2LjIgZHJvcHBlZCBldmVudGxldCAoYDJlMTgyMWVhIERyb3AgZXZlbnRsZXRgKTogYG1hZ251bS9jbWQvX19pbml0X18ucHlgIG5vIGxvbmdlciBtb25rZXktcGF0Y2hlcywgYW5kIHRoZSBjb25kdWN0b3Igc2VydmVzIFJQQyBhbmQgcGVyaW9kaWMgdGFza3Mgb24gbmF0aXZlIHRocmVhZHMuIFRoZSBkcml2ZXIgc3RpbGwgd3JhcHMgdGhlIFJ1c3QgYERyaXZlcmAsIGBLdWJlQ2xpZW50YCBhbmQgYE1vbml0b3JgIGluIGBldmVudGxldC50cG9vbC5Qcm94eWAuIFdpdGhvdXQgYSBodWIsIHRwb29sIGhhbmRzIGVhY2ggcmVzdWx0IGJhY2sgdGhyb3VnaCB0aGUgaHViIG9mIHRoZSB0aHJlYWQgdGhhdCBmaXJzdCB1c2VkIHRoZSBwb29sLCBzbyBhIGNhbGwgbWFkZSBmcm9tIGFueSBvdGhlciBuYXRpdmUgdGhyZWFkIG5ldmVyIHJldHVybnMuIFRoZSBmaXJzdCBjbHVzdGVyIG9wZXJhdGlvbiB3b3JrczsgZXZlcnkgbGF0ZXIgY3JlYXRlL2RlbGV0ZS9yZXNpemUgYW5kIHRoZSBoZWFsdGgtc3RhdHVzIHBlcmlvZGljIHRhc2sgaGFuZy4gQSBtaW5pbWFsIHJlcHJvZHVjdGlvbiAoUHl0aG9uIDMuMTQsIGV2ZW50bGV0IDAuNDEuMik6IG9uZSBjYWxsIGZyb20gdGhlIG1haW4gdGhyZWFkIHJldHVybnMgaW4gMC4yIHMsIGNhbGxzIGZyb20gZm91ciBvdGhlciB0aHJlYWRzIGFsbCBoYW5nLCB3aXRoIGBncmVlbmxldC5lcnJvcjogQ2Fubm90IHN3aXRjaCB0byBhIGRpZmZlcmVudCB0aHJlYWRgLgoKIzEwNTUgZHJvcHMgdGhlIHByb3hpZXMgYWx0b2dldGhlciwgYW5kIEBtbmFzZXIgcG9pbnRlZCBvdXQgdGhlcmUgdGhhdCB0aGV5IHdlcmUgYWRkZWQgYmVjYXVzZSBibG9ja2luZyBjYWxscyBmcm96ZSB0aGUgd2hvbGUgcHJvY2VzcyB1bmRlciBldmVudGxldC4gQm90aCBhcmUgcmlnaHQgZm9yIHRoZWlyIHJlbGVhc2UsIHNvIHRoaXMgY2hhbmdlIGtlZXBzIHRoZW0gd2hlcmUgdGhleSBhcmUgbmVlZGVkOiBgdXRpbHMub2ZmbG9hZF9ibG9ja2luZ19jYWxscygpYCByZXR1cm5zIGB0cG9vbC5Qcm94eShvYmopYCB3aGVuIGV2ZW50bGV0IGhhcyBtb25rZXktcGF0Y2hlZCB0aHJlYWRpbmcgKE1hZ251bSAyMDI2LjEgYW5kIG9sZGVyKSBhbmQgdGhlIG9iamVjdCBpdHNlbGYgb3RoZXJ3aXNlLiBCZWhhdmlvdXIgb24gMjAyNi4xIGFuZCBvbGRlciBpcyB1bmNoYW5nZWQuCgojIyMgMi4gYG5vdmFjbGllbnRgIGlzIG5vIGxvbmdlciBpbnN0YWxsZWQKCk1hZ251bSAyMDI2LjIgcmVwbGFjZWQgaXRzIHBlci1zZXJ2aWNlIGNsaWVudHMgd2l0aCBvcGVuc3RhY2tzZGsgYW5kIGRyb3BwZWQgYHB5dGhvbi1ub3ZhY2xpZW50YCBmcm9tIGl0cyByZXF1aXJlbWVudHMuIGBjbGllbnRzLnB5YCBhbHJlYWR5IGhhbmRsZXMgYm90aCBBUElzICgjMTA3MSksIGJ1dCBpdCBhbmQgYHV0aWxzLnB5YCBzdGlsbCBpbXBvcnQgbm92YWNsaWVudCBhdCBtb2R1bGUgbGV2ZWwsIHNvIHRoZSBkcml2ZXIgZmFpbHMgdG8gbG9hZDoKCmBgYApNb2R1bGVOb3RGb3VuZEVycm9yOiBObyBtb2R1bGUgbmFtZWQgJ25vdmFjbGllbnQnCmBgYAoKVGhlIGltcG9ydCBpcyBub3cgb3B0aW9uYWwgaW4gYGNsaWVudHMucHlgICh0aGUgbm90LWZvdW5kIGV4Y2VwdGlvbnMgY2F1Z2h0IGJlY29tZSBhIHR1cGxlIHRoYXQgaW5jbHVkZXMgbm92YWNsaWVudCdzIG9ubHkgd2hlbiBpdCBpcyBwcmVzZW50KSwgYW5kIGB1dGlscy5weWAgdXNlZCBpdCBmb3IgYSB0eXBlIGFubm90YXRpb24gYWxvbmUuIG5vdmFjbGllbnQgbW92ZXMgdG8gdGhlIGRldiBkZXBlbmRlbmNpZXMgYmVjYXVzZSB0aGUgdW5pdCB0ZXN0cyBidWlsZCBpdHMgYEZsYXZvcmAgb2JqZWN0cy4gIzEwMzEgcmVtb3ZlcyB0aGVzZSBpbXBvcnRzIGFzIHBhcnQgb2YgYSBtdWNoIGxhcmdlciBvcGVuc3RhY2tzZGsgbWlncmF0aW9uOyB0aGlzIGlzIHRoZSBtaW5pbWFsIHZlcnNpb24gb2YgdGhhdCBwYXJ0LgoKIyMjIFRlc3RpbmcKCi0gTmV3IHVuaXQgdGVzdHM6IHRoZSB0cG9vbCBwYXRoIHVuZGVyIGV2ZW50bGV0IChtb2NrZWQpLCBhbmQgZm91ciBuYXRpdmUgdGhyZWFkcyBjYWxsaW5nIHRocm91Z2ggYG9mZmxvYWRfYmxvY2tpbmdfY2FsbHMoKWAgYWxsIHJldHVybmluZywgd2hpY2ggaGFuZ3Mgd2l0aCB0aGUgb2xkIGB0cG9vbC5Qcm94eWAuCi0gVW5pdCB0ZXN0cyBpbiB0aGUgTWFnbnVtIDIwMjYuMiBpbWFnZSAoUHl0aG9uIDMuMTQsIG5vIG5vdmFjbGllbnQgaW5zdGFsbGVkOyB0aGUgZHJpdmVyIGltcG9ydHMpIGFuZCBpbiB0aGUgMjAyNi4xIGltYWdlOiAyMjAgcGFzc2VkLiA4IGB0ZXN0X3VwZGF0ZV9ub2RlZ3JvdXAqYCBjYXNlcyBmYWlsLCB0aGUgc2FtZSBvbmVzIGFzIG9uIGBtYWluYCB3aXRob3V0IHRoaXMgY2hhbmdlLCB3aXRoIHRoZSBSdXN0IGV4dGVuc2lvbiBmcm9tIHRob3NlIGltYWdlcy4KLSBibGFjayAyNS4xLjAsIGlzb3J0IDYuMC4xLCBmbGFrZTggNy4yLjAgKHRoZSBwcmUtY29tbWl0IHZlcnNpb25zKSBwYXNzIG9uIHRoZSBjaGFuZ2VkIGZpbGVzLgotIEluIHByb2R1Y3Rpb24gb24gTWFnbnVtIDIwMjYuMjogY3JlYXRlIGEgY2x1c3RlciAoMSBjb250cm9sIHBsYW5lICsgMSB3b3JrZXIpLCBoZWFsdGggdHVybnMgSEVBTFRIWSB3aXRoaW4gYSBtaW51dGUgdGhyb3VnaCB0aGUgbW9uaXRvciBwZXJpb2RpYyB0YXNrLCByZXNpemUgdG8gMiB3b3JrZXJzLCBkZWxldGUuIEFsbCBjb21wbGV0ZSwgYW5kIG5vdGhpbmcgaXMgbGVmdCBiZWhpbmQuCgrwn6SWIEdlbmVyYXRlZCB3aXRoIFtDbGF1ZGUgQ29kZV0oaHR0cHM6Ly9jbGF1ZGUuY29tL2NsYXVkZS1jb2RlKQo=
      override_checkout: master
      patchset: 8e06a2b5c6c62c45c2da002113efda0321e1d44b
      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: be52461cd48abccbf95b13a58b2551ac673d8ad7
          trusted/project_2/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: c286bf94224b5660b8e49e9a058289e61062a9a0
          untrusted/project_0/opendev.org/openstack/devstack:
            canonical_name: opendev.org/openstack/devstack
            checkout: master
            commit: 64d59574473c148c3d855124ae5f79681854cd0a
          untrusted/project_1/opendev.org/openstack/openstack-zuul-jobs:
            canonical_name: opendev.org/openstack/openstack-zuul-jobs
            checkout: master
            commit: 913885b578b905e66c7f0b0ddfd8c996e7859cef
          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: be52461cd48abccbf95b13a58b2551ac673d8ad7
          untrusted/project_4/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: c286bf94224b5660b8e49e9a058289e61062a9a0
          untrusted/project_5/github.com/vexxhost/magnum-cluster-api:
            canonical_name: github.com/vexxhost/magnum-cluster-api
            checkout: main
            commit: 8e06a2b5c6c62c45c2da002113efda0321e1d44b
        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: b17d04c1a1a926a59f4a04bb866332b429f2ce37
          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: 8e06a2b5c6c62c45c2da002113efda0321e1d44b
          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: 9df3aa8848ec96395d5417e3e5e0a827e469579c
          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: d816eec0c177ad906c04368e750e9efb02b4bb6f
          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: 64d59574473c148c3d855124ae5f79681854cd0a
          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: ac770b0e6189be8586b33f3372484442e9af383c
          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: 77db3e62a449b7cadda589fa24407124766bdba8
          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: 5fca26c307be637ffc3da38a17731c6afb37053b
          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: 20b721293904f59ae429539fb70dc1343c68dc3b
          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: 13d7f61ddd363f8da3732c0885439f0b7d1860d1
          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: 2c0bccc92579ae63b23736973d83303e6a6c2af5
          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: 0caf1efea92079b3ccf23690bb71c2b2f3d06b49
          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: 840ecd26fa6ba394512d9ddca91eb93dc4dd176a
          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: 3f6b411dc16e0cd7e0e17641979826df2518d547
          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: 0609658b480d3934a0d5aaf8620e2d31801661ea
          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: 6adff3716e64de4b59de7396195d2a18189ac348
          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: d1e29fd1be12f0c3baa5af738f33a8584e0816b6
          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: 7d523586e18623f825d57dbf29b361f57da8c200
          name: openstack/swift
          required: true
          short_name: swift
          src_dir: src/opendev.org/openstack/swift
      ref: refs/pull/1153/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
