all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe63:e349
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 96807db6-c889-4c76-8dbe-1294d9a0ca10
        host_id: 7f2607eceb24f4583c6f9496c53c64b51afe50de5eacda4379b21c42
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe63:e349
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.0.99
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.112
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe63:e349
        region: null
        slot: null
  vars:
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-config/zuul.d/jobs.yaml@main#2>'
      - '<Job python-black explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#54>'
      - '<Job python-black explicit: None implied: None source: osism/testbed/.zuul.yaml@main#325>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 00b426347927422fb5fc7d0e7c0e7610
      build_refs:
      - branch: main
        change: '2929'
        change_message: "deploy: capture cloud state on manager ssh fail\n\n## What\n\nAdds
          read-only cloud-side diagnostics to the manager bring-up **rescue**\nblock
          in `playbooks/deploy.yml`. When manager bring-up fails, the rescue path\nnow
          captures and prints, using the build's own `OS_CLOUD` credentials:\n\n-
          `openstack floating ip show <manager address>` \u2014 its `port_id` shows\n
          \ whether the floating IP is associated to the expected manager port\n  (control-plane)
          vs a correct association that is mis-routed at L2 (stale\n  ARP/conntrack).\n-
          `openstack server/port/floating ip list` \u2014 leftover or unexpected\n
          \ resources in the shared project (e.g. leaked managers).\n- a live `ssh-keyscan
          \u2026 | ssh-keygen -lf` fingerprint of the manager address\n  \u2014 which
          host actually answered, to compare against the captured\n  serial-console
          host keys.\n\nAll tasks are read-only and best-effort (`changed_when`/`failed_when:
          false`),\nrun **only** in the rescue path (no overhead on a passing deploy),
          and need no\nCI credential access \u2014 the evidence lands in the job log.\n\n##
          Why (motivation, not scope)\n\nA recurring failure: the ssh probe *\"Wait
          until ssh public key authentication\nto the manager works\"* aborts with
          `REMOTE HOST IDENTIFICATION HAS CHANGED`.\nLog analysis of two occurrences
          shows the manager booted **once** with a\nstable key and the floating IP
          reached it correctly early in the probe, yet\nthe **same** floating IP reached
          a **different** host by the time the probe\ngave up \u2014 the FIP is re-routed
          mid-build to a host that is not the manager\nthis build booted. Neither
          a stale `known_hosts` entry nor the purge in the\nearlier fix explains that:\n\n-
          #2928\n\n**We would rather collect more decisive data before attempting
          another fix.**\nThe earlier attempt addressed the wrong layer, and guessing
          again is likely to\ndo the same. The single most decisive datum is the floating
          IP's `port_id` at\nfailure time (control-plane mis-association vs L2 mis-routing);
          these\ndiagnostics exist to capture it \u2014 and related state \u2014 from
          the next\noccurrence, so any follow-up fix targets the layer that is actually
          at fault.\nThey are general enough to keep long-term.\n\n## Occurrences
          (Zuul)\n\n- 2026-07-12 `testbed-deploy-next-in-a-nutshell-with-tempest-ubuntu-24.04`:\n
          \ https://zuul.services.osism.tech/t/osism/build/af7b9a8f7bf54b7582e4274744a781c4\n-
          2026-07-15 `testbed-update-stable-current-ubuntu-24.04`:\n  https://zuul.services.osism.tech/t/osism/build/2e71da7b41e045b4840a261450ba030c\n\nBoth
          ran on orchestrator `zuul-testbed04`.\n\n\U0001F916 Generated with [Claude
          Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/testbed/pull/2929
        commit_id: 7743520007141ffc69d43ef1ce355782a1dbbfb8
        patchset: 7743520007141ffc69d43ef1ce355782a1dbbfb8
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/testbed
          name: osism/testbed
          short_name: testbed
        src_dir: src/github.com/osism/testbed
        topic: null
      buildset: 49e341aac16a4437b82e6aaf1e61b261
      buildset_refs:
      - branch: main
        change: '2929'
        change_message: "deploy: capture cloud state on manager ssh fail\n\n## What\n\nAdds
          read-only cloud-side diagnostics to the manager bring-up **rescue**\nblock
          in `playbooks/deploy.yml`. When manager bring-up fails, the rescue path\nnow
          captures and prints, using the build's own `OS_CLOUD` credentials:\n\n-
          `openstack floating ip show <manager address>` \u2014 its `port_id` shows\n
          \ whether the floating IP is associated to the expected manager port\n  (control-plane)
          vs a correct association that is mis-routed at L2 (stale\n  ARP/conntrack).\n-
          `openstack server/port/floating ip list` \u2014 leftover or unexpected\n
          \ resources in the shared project (e.g. leaked managers).\n- a live `ssh-keyscan
          \u2026 | ssh-keygen -lf` fingerprint of the manager address\n  \u2014 which
          host actually answered, to compare against the captured\n  serial-console
          host keys.\n\nAll tasks are read-only and best-effort (`changed_when`/`failed_when:
          false`),\nrun **only** in the rescue path (no overhead on a passing deploy),
          and need no\nCI credential access \u2014 the evidence lands in the job log.\n\n##
          Why (motivation, not scope)\n\nA recurring failure: the ssh probe *\"Wait
          until ssh public key authentication\nto the manager works\"* aborts with
          `REMOTE HOST IDENTIFICATION HAS CHANGED`.\nLog analysis of two occurrences
          shows the manager booted **once** with a\nstable key and the floating IP
          reached it correctly early in the probe, yet\nthe **same** floating IP reached
          a **different** host by the time the probe\ngave up \u2014 the FIP is re-routed
          mid-build to a host that is not the manager\nthis build booted. Neither
          a stale `known_hosts` entry nor the purge in the\nearlier fix explains that:\n\n-
          #2928\n\n**We would rather collect more decisive data before attempting
          another fix.**\nThe earlier attempt addressed the wrong layer, and guessing
          again is likely to\ndo the same. The single most decisive datum is the floating
          IP's `port_id` at\nfailure time (control-plane mis-association vs L2 mis-routing);
          these\ndiagnostics exist to capture it \u2014 and related state \u2014 from
          the next\noccurrence, so any follow-up fix targets the layer that is actually
          at fault.\nThey are general enough to keep long-term.\n\n## Occurrences
          (Zuul)\n\n- 2026-07-12 `testbed-deploy-next-in-a-nutshell-with-tempest-ubuntu-24.04`:\n
          \ https://zuul.services.osism.tech/t/osism/build/af7b9a8f7bf54b7582e4274744a781c4\n-
          2026-07-15 `testbed-update-stable-current-ubuntu-24.04`:\n  https://zuul.services.osism.tech/t/osism/build/2e71da7b41e045b4840a261450ba030c\n\nBoth
          ran on orchestrator `zuul-testbed04`.\n\n\U0001F916 Generated with [Claude
          Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/testbed/pull/2929
        commit_id: 7743520007141ffc69d43ef1ce355782a1dbbfb8
        patchset: 7743520007141ffc69d43ef1ce355782a1dbbfb8
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/testbed
          name: osism/testbed
          short_name: testbed
        src_dir: src/github.com/osism/testbed
        topic: null
      change: '2929'
      change_message: "deploy: capture cloud state on manager ssh fail\n\n## What\n\nAdds
        read-only cloud-side diagnostics to the manager bring-up **rescue**\nblock
        in `playbooks/deploy.yml`. When manager bring-up fails, the rescue path\nnow
        captures and prints, using the build's own `OS_CLOUD` credentials:\n\n- `openstack
        floating ip show <manager address>` \u2014 its `port_id` shows\n  whether
        the floating IP is associated to the expected manager port\n  (control-plane)
        vs a correct association that is mis-routed at L2 (stale\n  ARP/conntrack).\n-
        `openstack server/port/floating ip list` \u2014 leftover or unexpected\n  resources
        in the shared project (e.g. leaked managers).\n- a live `ssh-keyscan \u2026
        | ssh-keygen -lf` fingerprint of the manager address\n  \u2014 which host
        actually answered, to compare against the captured\n  serial-console host
        keys.\n\nAll tasks are read-only and best-effort (`changed_when`/`failed_when:
        false`),\nrun **only** in the rescue path (no overhead on a passing deploy),
        and need no\nCI credential access \u2014 the evidence lands in the job log.\n\n##
        Why (motivation, not scope)\n\nA recurring failure: the ssh probe *\"Wait
        until ssh public key authentication\nto the manager works\"* aborts with `REMOTE
        HOST IDENTIFICATION HAS CHANGED`.\nLog analysis of two occurrences shows the
        manager booted **once** with a\nstable key and the floating IP reached it
        correctly early in the probe, yet\nthe **same** floating IP reached a **different**
        host by the time the probe\ngave up \u2014 the FIP is re-routed mid-build
        to a host that is not the manager\nthis build booted. Neither a stale `known_hosts`
        entry nor the purge in the\nearlier fix explains that:\n\n- #2928\n\n**We
        would rather collect more decisive data before attempting another fix.**\nThe
        earlier attempt addressed the wrong layer, and guessing again is likely to\ndo
        the same. The single most decisive datum is the floating IP's `port_id` at\nfailure
        time (control-plane mis-association vs L2 mis-routing); these\ndiagnostics
        exist to capture it \u2014 and related state \u2014 from the next\noccurrence,
        so any follow-up fix targets the layer that is actually at fault.\nThey are
        general enough to keep long-term.\n\n## Occurrences (Zuul)\n\n- 2026-07-12
        `testbed-deploy-next-in-a-nutshell-with-tempest-ubuntu-24.04`:\n  https://zuul.services.osism.tech/t/osism/build/af7b9a8f7bf54b7582e4274744a781c4\n-
        2026-07-15 `testbed-update-stable-current-ubuntu-24.04`:\n  https://zuul.services.osism.tech/t/osism/build/2e71da7b41e045b4840a261450ba030c\n\nBoth
        ran on orchestrator `zuul-testbed04`.\n\n\U0001F916 Generated with [Claude
        Code](https://claude.com/claude-code)\n"
      change_url: https://github.com/osism/testbed/pull/2929
      child_jobs: []
      commit_id: 7743520007141ffc69d43ef1ce355782a1dbbfb8
      event_id: 3cde6fd0-8022-11f1-99d0-0638c00f1959
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/00b426347927422fb5fc7d0e7c0e7610/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/00b426347927422fb5fc7d0e7c0e7610/work/logs
        result_data_file: /var/lib/zuul/builds/00b426347927422fb5fc7d0e7c0e7610/work/results.json
        src_root: /var/lib/zuul/builds/00b426347927422fb5fc7d0e7c0e7610/work/src
        work_root: /var/lib/zuul/builds/00b426347927422fb5fc7d0e7c0e7610/work
      include_vars: []
      items:
      - branch: main
        change: '2929'
        change_message: "deploy: capture cloud state on manager ssh fail\n\n## What\n\nAdds
          read-only cloud-side diagnostics to the manager bring-up **rescue**\nblock
          in `playbooks/deploy.yml`. When manager bring-up fails, the rescue path\nnow
          captures and prints, using the build's own `OS_CLOUD` credentials:\n\n-
          `openstack floating ip show <manager address>` \u2014 its `port_id` shows\n
          \ whether the floating IP is associated to the expected manager port\n  (control-plane)
          vs a correct association that is mis-routed at L2 (stale\n  ARP/conntrack).\n-
          `openstack server/port/floating ip list` \u2014 leftover or unexpected\n
          \ resources in the shared project (e.g. leaked managers).\n- a live `ssh-keyscan
          \u2026 | ssh-keygen -lf` fingerprint of the manager address\n  \u2014 which
          host actually answered, to compare against the captured\n  serial-console
          host keys.\n\nAll tasks are read-only and best-effort (`changed_when`/`failed_when:
          false`),\nrun **only** in the rescue path (no overhead on a passing deploy),
          and need no\nCI credential access \u2014 the evidence lands in the job log.\n\n##
          Why (motivation, not scope)\n\nA recurring failure: the ssh probe *\"Wait
          until ssh public key authentication\nto the manager works\"* aborts with
          `REMOTE HOST IDENTIFICATION HAS CHANGED`.\nLog analysis of two occurrences
          shows the manager booted **once** with a\nstable key and the floating IP
          reached it correctly early in the probe, yet\nthe **same** floating IP reached
          a **different** host by the time the probe\ngave up \u2014 the FIP is re-routed
          mid-build to a host that is not the manager\nthis build booted. Neither
          a stale `known_hosts` entry nor the purge in the\nearlier fix explains that:\n\n-
          #2928\n\n**We would rather collect more decisive data before attempting
          another fix.**\nThe earlier attempt addressed the wrong layer, and guessing
          again is likely to\ndo the same. The single most decisive datum is the floating
          IP's `port_id` at\nfailure time (control-plane mis-association vs L2 mis-routing);
          these\ndiagnostics exist to capture it \u2014 and related state \u2014 from
          the next\noccurrence, so any follow-up fix targets the layer that is actually
          at fault.\nThey are general enough to keep long-term.\n\n## Occurrences
          (Zuul)\n\n- 2026-07-12 `testbed-deploy-next-in-a-nutshell-with-tempest-ubuntu-24.04`:\n
          \ https://zuul.services.osism.tech/t/osism/build/af7b9a8f7bf54b7582e4274744a781c4\n-
          2026-07-15 `testbed-update-stable-current-ubuntu-24.04`:\n  https://zuul.services.osism.tech/t/osism/build/2e71da7b41e045b4840a261450ba030c\n\nBoth
          ran on orchestrator `zuul-testbed04`.\n\n\U0001F916 Generated with [Claude
          Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/testbed/pull/2929
        commit_id: 7743520007141ffc69d43ef1ce355782a1dbbfb8
        patchset: 7743520007141ffc69d43ef1ce355782a1dbbfb8
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/testbed
          name: osism/testbed
          short_name: testbed
          src_dir: src/github.com/osism/testbed
        topic: null
      job: python-black
      jobtags: []
      max_attempts: 3
      message: ZGVwbG95OiBjYXB0dXJlIGNsb3VkIHN0YXRlIG9uIG1hbmFnZXIgc3NoIGZhaWwKCiMjIFdoYXQKCkFkZHMgcmVhZC1vbmx5IGNsb3VkLXNpZGUgZGlhZ25vc3RpY3MgdG8gdGhlIG1hbmFnZXIgYnJpbmctdXAgKipyZXNjdWUqKgpibG9jayBpbiBgcGxheWJvb2tzL2RlcGxveS55bWxgLiBXaGVuIG1hbmFnZXIgYnJpbmctdXAgZmFpbHMsIHRoZSByZXNjdWUgcGF0aApub3cgY2FwdHVyZXMgYW5kIHByaW50cywgdXNpbmcgdGhlIGJ1aWxkJ3Mgb3duIGBPU19DTE9VRGAgY3JlZGVudGlhbHM6CgotIGBvcGVuc3RhY2sgZmxvYXRpbmcgaXAgc2hvdyA8bWFuYWdlciBhZGRyZXNzPmAg4oCUIGl0cyBgcG9ydF9pZGAgc2hvd3MKICB3aGV0aGVyIHRoZSBmbG9hdGluZyBJUCBpcyBhc3NvY2lhdGVkIHRvIHRoZSBleHBlY3RlZCBtYW5hZ2VyIHBvcnQKICAoY29udHJvbC1wbGFuZSkgdnMgYSBjb3JyZWN0IGFzc29jaWF0aW9uIHRoYXQgaXMgbWlzLXJvdXRlZCBhdCBMMiAoc3RhbGUKICBBUlAvY29ubnRyYWNrKS4KLSBgb3BlbnN0YWNrIHNlcnZlci9wb3J0L2Zsb2F0aW5nIGlwIGxpc3RgIOKAlCBsZWZ0b3ZlciBvciB1bmV4cGVjdGVkCiAgcmVzb3VyY2VzIGluIHRoZSBzaGFyZWQgcHJvamVjdCAoZS5nLiBsZWFrZWQgbWFuYWdlcnMpLgotIGEgbGl2ZSBgc3NoLWtleXNjYW4g4oCmIHwgc3NoLWtleWdlbiAtbGZgIGZpbmdlcnByaW50IG9mIHRoZSBtYW5hZ2VyIGFkZHJlc3MKICDigJQgd2hpY2ggaG9zdCBhY3R1YWxseSBhbnN3ZXJlZCwgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBjYXB0dXJlZAogIHNlcmlhbC1jb25zb2xlIGhvc3Qga2V5cy4KCkFsbCB0YXNrcyBhcmUgcmVhZC1vbmx5IGFuZCBiZXN0LWVmZm9ydCAoYGNoYW5nZWRfd2hlbmAvYGZhaWxlZF93aGVuOiBmYWxzZWApLApydW4gKipvbmx5KiogaW4gdGhlIHJlc2N1ZSBwYXRoIChubyBvdmVyaGVhZCBvbiBhIHBhc3NpbmcgZGVwbG95KSwgYW5kIG5lZWQgbm8KQ0kgY3JlZGVudGlhbCBhY2Nlc3Mg4oCUIHRoZSBldmlkZW5jZSBsYW5kcyBpbiB0aGUgam9iIGxvZy4KCiMjIFdoeSAobW90aXZhdGlvbiwgbm90IHNjb3BlKQoKQSByZWN1cnJpbmcgZmFpbHVyZTogdGhlIHNzaCBwcm9iZSAqIldhaXQgdW50aWwgc3NoIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24KdG8gdGhlIG1hbmFnZXIgd29ya3MiKiBhYm9ydHMgd2l0aCBgUkVNT1RFIEhPU1QgSURFTlRJRklDQVRJT04gSEFTIENIQU5HRURgLgpMb2cgYW5hbHlzaXMgb2YgdHdvIG9jY3VycmVuY2VzIHNob3dzIHRoZSBtYW5hZ2VyIGJvb3RlZCAqKm9uY2UqKiB3aXRoIGEKc3RhYmxlIGtleSBhbmQgdGhlIGZsb2F0aW5nIElQIHJlYWNoZWQgaXQgY29ycmVjdGx5IGVhcmx5IGluIHRoZSBwcm9iZSwgeWV0CnRoZSAqKnNhbWUqKiBmbG9hdGluZyBJUCByZWFjaGVkIGEgKipkaWZmZXJlbnQqKiBob3N0IGJ5IHRoZSB0aW1lIHRoZSBwcm9iZQpnYXZlIHVwIOKAlCB0aGUgRklQIGlzIHJlLXJvdXRlZCBtaWQtYnVpbGQgdG8gYSBob3N0IHRoYXQgaXMgbm90IHRoZSBtYW5hZ2VyCnRoaXMgYnVpbGQgYm9vdGVkLiBOZWl0aGVyIGEgc3RhbGUgYGtub3duX2hvc3RzYCBlbnRyeSBub3IgdGhlIHB1cmdlIGluIHRoZQplYXJsaWVyIGZpeCBleHBsYWlucyB0aGF0OgoKLSAjMjkyOAoKKipXZSB3b3VsZCByYXRoZXIgY29sbGVjdCBtb3JlIGRlY2lzaXZlIGRhdGEgYmVmb3JlIGF0dGVtcHRpbmcgYW5vdGhlciBmaXguKioKVGhlIGVhcmxpZXIgYXR0ZW1wdCBhZGRyZXNzZWQgdGhlIHdyb25nIGxheWVyLCBhbmQgZ3Vlc3NpbmcgYWdhaW4gaXMgbGlrZWx5IHRvCmRvIHRoZSBzYW1lLiBUaGUgc2luZ2xlIG1vc3QgZGVjaXNpdmUgZGF0dW0gaXMgdGhlIGZsb2F0aW5nIElQJ3MgYHBvcnRfaWRgIGF0CmZhaWx1cmUgdGltZSAoY29udHJvbC1wbGFuZSBtaXMtYXNzb2NpYXRpb24gdnMgTDIgbWlzLXJvdXRpbmcpOyB0aGVzZQpkaWFnbm9zdGljcyBleGlzdCB0byBjYXB0dXJlIGl0IOKAlCBhbmQgcmVsYXRlZCBzdGF0ZSDigJQgZnJvbSB0aGUgbmV4dApvY2N1cnJlbmNlLCBzbyBhbnkgZm9sbG93LXVwIGZpeCB0YXJnZXRzIHRoZSBsYXllciB0aGF0IGlzIGFjdHVhbGx5IGF0IGZhdWx0LgpUaGV5IGFyZSBnZW5lcmFsIGVub3VnaCB0byBrZWVwIGxvbmctdGVybS4KCiMjIE9jY3VycmVuY2VzIChadXVsKQoKLSAyMDI2LTA3LTEyIGB0ZXN0YmVkLWRlcGxveS1uZXh0LWluLWEtbnV0c2hlbGwtd2l0aC10ZW1wZXN0LXVidW50dS0yNC4wNGA6CiAgaHR0cHM6Ly96dXVsLnNlcnZpY2VzLm9zaXNtLnRlY2gvdC9vc2lzbS9idWlsZC9hZjdiOWE4ZjdiZjU0Yjc1ODJlNDI3NDc0NGE3ODFjNAotIDIwMjYtMDctMTUgYHRlc3RiZWQtdXBkYXRlLXN0YWJsZS1jdXJyZW50LXVidW50dS0yNC4wNGA6CiAgaHR0cHM6Ly96dXVsLnNlcnZpY2VzLm9zaXNtLnRlY2gvdC9vc2lzbS9idWlsZC8yZTcxZGE3YjQxZTA0NWI0ODQwYTI2MTQ1MGJhMDMwYwoKQm90aCByYW4gb24gb3JjaGVzdHJhdG9yIGB6dXVsLXRlc3RiZWQwNGAuCgrwn6SWIEdlbmVyYXRlZCB3aXRoIFtDbGF1ZGUgQ29kZV0oaHR0cHM6Ly9jbGF1ZGUuY29tL2NsYXVkZS1jb2RlKQo=
      patchset: 7743520007141ffc69d43ef1ce355782a1dbbfb8
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 71b711c422c10c242a8f785dc6d41ed9d12e9cd3
          trusted/project_1/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 242732586e2cba04d04867d3e302888c766bc231
          trusted/project_2/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 1d71e58c93442038e695a5d883d57a603182c7ae
          untrusted/project_0/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 1d71e58c93442038e695a5d883d57a603182c7ae
          untrusted/project_1/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 71b711c422c10c242a8f785dc6d41ed9d12e9cd3
          untrusted/project_2/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 242732586e2cba04d04867d3e302888c766bc231
        playbooks:
        - path: untrusted/project_0/github.com/osism/zuul-jobs/playbooks/python-black/run.yml
          roles:
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_0/zuul-config
            link_target: untrusted/project_1/github.com/osism/zuul-config
            role_path: ansible/playbook_0/role_0/zuul-config/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/playbook_0/role_1/openinfra-zuul-jobs
            link_target: untrusted/project_2/github.com/osism/openinfra-zuul-jobs
            role_path: ansible/playbook_0/role_1/openinfra-zuul-jobs/roles
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/playbook_0/role_2/zuul-jobs
            link_target: untrusted/project_0/github.com/osism/zuul-jobs
            role_path: ansible/playbook_0/role_2/zuul-jobs/roles
      post_review: false
      post_timeout: 1800
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/osism/testbed
        name: osism/testbed
        short_name: testbed
        src_dir: src/github.com/osism/testbed
      projects:
        github.com/osism/testbed:
          canonical_hostname: github.com
          canonical_name: github.com/osism/testbed
          checkout: main
          checkout_description: zuul branch
          commit: 54aa962e6294f69cb6874d7a433de54f0242f8d3
          name: osism/testbed
          required: false
          short_name: testbed
          src_dir: src/github.com/osism/testbed
      ref: refs/pull/2929/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
