all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe88:8b97
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: eb8aa467-8368-4636-9868-f863355ad767
        host_id: df70f2a3f3d0c26428f22685cfc722ebc48099d99e7332c39e017195
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe88:8b97
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.0.108
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.138
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe88:8b97
        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 flake8 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#32>'
      - '<Job flake8 explicit: None implied: None source: osism/testbed/.zuul.yaml@main#325>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 9693aede5d5a40fba27033817eeaa24f
      build_refs:
      - branch: main
        change: '2917'
        change_message: "manager: make operator key reachable in seed\n\n## What\n\nMake
          the operator private key reachable inside the `osism/seed` container\nduring
          `osism update manager`, by placing it in the bind-mounted\nconfiguration
          directory and reading it from there.\n\n## Why\n\n`osism update manager`
          runs the keypair play inside the `osism/seed`\ncontainer (the default `CONTAINER=auto`
          path on a manager). That container\nbind-mounts only `/opt/configuration`,
          but `environments/secrets.yml`\nresolved `operator_private_key` from host
          paths *outside* the mount\n(`/home/dragon/.ssh/id_rsa`, `/ansible/secrets/id_rsa.operator`).
          Inside\nthe container the lookup resolved to an empty string, so the keypair
          play\nwrote a zero-byte `id_rsa.operator` and the manager apply failed with
          an\nopaque SSH error:\n\n```\nLoad key \".../id_rsa.operator\": error in
          libcrypto: unsupported\n... Permission denied (publickey).\n```\n\nThis
          broke the midnight upgrade/update lanes (all three failed identically\nonce
          the seed-container update path became active).\n\n## How\n\n* `scripts/deploy/000-manager.sh`
          copies `/home/dragon/.ssh/id_rsa` to\n  `/opt/configuration/environments/secrets/id_rsa.operator`
          after the repo\n  is synced into `/opt/configuration`, alongside the existing
          public-key\n  copy.\n* `environments/secrets.yml` looks up that in-mount
          path first, keeping the\n  two host paths as fallbacks so managers deployed
          before this change still\n  work.\n\n`configuration_directory` is `/opt/configuration`
          both on the manager host\nand as the seed bind-mount, so the absolute path
          resolves in the seed\ncontainer and in the venv/on-manager contexts alike.\n`environments/secrets/`
          is already gitignored, so the key never lands in\ngit.\n\nThis keeps the
          testbed's existing design (dynamic Nova keypair,\nlookup-based `operator_private_key`);
          it deliberately does not adopt the\nproduction vault-literal model (that
          is tbng's role).\n\n## Testing\n\nIntegration test in the `osism/seed` container
          against a simulated\n`/opt/configuration` mount:\n\n- in-mount key present
          -> keypair play resolves the new lookup and writes a\n  loadable `id_rsa.operator`
          (`ssh-keygen -y` succeeds)\n- in-mount key absent (and no host key) -> lookup
          resolves empty; pairs with\n  the empty-key guard in osism/ansible-playbooks-manager#52\n\n`yamllint`
          (repo config) and `shellcheck` clean. A full deploy + upgrade on\na real
          testbed has not been run.\n\n## Related\n\n- osism/ansible-playbooks-manager#52
          (defense-in-depth: fail loudly on an empty operator key)\n\n\U0001F916 Generated
          with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/testbed/pull/2917
        commit_id: 0339f2db79d78f6807b6f761ab1d2cc0fa32d06c
        patchset: 0339f2db79d78f6807b6f761ab1d2cc0fa32d06c
        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: b87a9d9a78b0434fb8eb4208d737e87e
      buildset_refs:
      - branch: main
        change: '2917'
        change_message: "manager: make operator key reachable in seed\n\n## What\n\nMake
          the operator private key reachable inside the `osism/seed` container\nduring
          `osism update manager`, by placing it in the bind-mounted\nconfiguration
          directory and reading it from there.\n\n## Why\n\n`osism update manager`
          runs the keypair play inside the `osism/seed`\ncontainer (the default `CONTAINER=auto`
          path on a manager). That container\nbind-mounts only `/opt/configuration`,
          but `environments/secrets.yml`\nresolved `operator_private_key` from host
          paths *outside* the mount\n(`/home/dragon/.ssh/id_rsa`, `/ansible/secrets/id_rsa.operator`).
          Inside\nthe container the lookup resolved to an empty string, so the keypair
          play\nwrote a zero-byte `id_rsa.operator` and the manager apply failed with
          an\nopaque SSH error:\n\n```\nLoad key \".../id_rsa.operator\": error in
          libcrypto: unsupported\n... Permission denied (publickey).\n```\n\nThis
          broke the midnight upgrade/update lanes (all three failed identically\nonce
          the seed-container update path became active).\n\n## How\n\n* `scripts/deploy/000-manager.sh`
          copies `/home/dragon/.ssh/id_rsa` to\n  `/opt/configuration/environments/secrets/id_rsa.operator`
          after the repo\n  is synced into `/opt/configuration`, alongside the existing
          public-key\n  copy.\n* `environments/secrets.yml` looks up that in-mount
          path first, keeping the\n  two host paths as fallbacks so managers deployed
          before this change still\n  work.\n\n`configuration_directory` is `/opt/configuration`
          both on the manager host\nand as the seed bind-mount, so the absolute path
          resolves in the seed\ncontainer and in the venv/on-manager contexts alike.\n`environments/secrets/`
          is already gitignored, so the key never lands in\ngit.\n\nThis keeps the
          testbed's existing design (dynamic Nova keypair,\nlookup-based `operator_private_key`);
          it deliberately does not adopt the\nproduction vault-literal model (that
          is tbng's role).\n\n## Testing\n\nIntegration test in the `osism/seed` container
          against a simulated\n`/opt/configuration` mount:\n\n- in-mount key present
          -> keypair play resolves the new lookup and writes a\n  loadable `id_rsa.operator`
          (`ssh-keygen -y` succeeds)\n- in-mount key absent (and no host key) -> lookup
          resolves empty; pairs with\n  the empty-key guard in osism/ansible-playbooks-manager#52\n\n`yamllint`
          (repo config) and `shellcheck` clean. A full deploy + upgrade on\na real
          testbed has not been run.\n\n## Related\n\n- osism/ansible-playbooks-manager#52
          (defense-in-depth: fail loudly on an empty operator key)\n\n\U0001F916 Generated
          with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/testbed/pull/2917
        commit_id: 0339f2db79d78f6807b6f761ab1d2cc0fa32d06c
        patchset: 0339f2db79d78f6807b6f761ab1d2cc0fa32d06c
        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: '2917'
      change_message: "manager: make operator key reachable in seed\n\n## What\n\nMake
        the operator private key reachable inside the `osism/seed` container\nduring
        `osism update manager`, by placing it in the bind-mounted\nconfiguration directory
        and reading it from there.\n\n## Why\n\n`osism update manager` runs the keypair
        play inside the `osism/seed`\ncontainer (the default `CONTAINER=auto` path
        on a manager). That container\nbind-mounts only `/opt/configuration`, but
        `environments/secrets.yml`\nresolved `operator_private_key` from host paths
        *outside* the mount\n(`/home/dragon/.ssh/id_rsa`, `/ansible/secrets/id_rsa.operator`).
        Inside\nthe container the lookup resolved to an empty string, so the keypair
        play\nwrote a zero-byte `id_rsa.operator` and the manager apply failed with
        an\nopaque SSH error:\n\n```\nLoad key \".../id_rsa.operator\": error in libcrypto:
        unsupported\n... Permission denied (publickey).\n```\n\nThis broke the midnight
        upgrade/update lanes (all three failed identically\nonce the seed-container
        update path became active).\n\n## How\n\n* `scripts/deploy/000-manager.sh`
        copies `/home/dragon/.ssh/id_rsa` to\n  `/opt/configuration/environments/secrets/id_rsa.operator`
        after the repo\n  is synced into `/opt/configuration`, alongside the existing
        public-key\n  copy.\n* `environments/secrets.yml` looks up that in-mount path
        first, keeping the\n  two host paths as fallbacks so managers deployed before
        this change still\n  work.\n\n`configuration_directory` is `/opt/configuration`
        both on the manager host\nand as the seed bind-mount, so the absolute path
        resolves in the seed\ncontainer and in the venv/on-manager contexts alike.\n`environments/secrets/`
        is already gitignored, so the key never lands in\ngit.\n\nThis keeps the testbed's
        existing design (dynamic Nova keypair,\nlookup-based `operator_private_key`);
        it deliberately does not adopt the\nproduction vault-literal model (that is
        tbng's role).\n\n## Testing\n\nIntegration test in the `osism/seed` container
        against a simulated\n`/opt/configuration` mount:\n\n- in-mount key present
        -> keypair play resolves the new lookup and writes a\n  loadable `id_rsa.operator`
        (`ssh-keygen -y` succeeds)\n- in-mount key absent (and no host key) -> lookup
        resolves empty; pairs with\n  the empty-key guard in osism/ansible-playbooks-manager#52\n\n`yamllint`
        (repo config) and `shellcheck` clean. A full deploy + upgrade on\na real testbed
        has not been run.\n\n## Related\n\n- osism/ansible-playbooks-manager#52 (defense-in-depth:
        fail loudly on an empty operator key)\n\n\U0001F916 Generated with [Claude
        Code](https://claude.com/claude-code)"
      change_url: https://github.com/osism/testbed/pull/2917
      child_jobs: []
      commit_id: 0339f2db79d78f6807b6f761ab1d2cc0fa32d06c
      event_id: 0b095750-739c-11f1-893d-5f95b2e36c9f
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/9693aede5d5a40fba27033817eeaa24f/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/9693aede5d5a40fba27033817eeaa24f/work/logs
        result_data_file: /var/lib/zuul/builds/9693aede5d5a40fba27033817eeaa24f/work/results.json
        src_root: /var/lib/zuul/builds/9693aede5d5a40fba27033817eeaa24f/work/src
        work_root: /var/lib/zuul/builds/9693aede5d5a40fba27033817eeaa24f/work
      include_vars: []
      items:
      - branch: main
        change: '2917'
        change_message: "manager: make operator key reachable in seed\n\n## What\n\nMake
          the operator private key reachable inside the `osism/seed` container\nduring
          `osism update manager`, by placing it in the bind-mounted\nconfiguration
          directory and reading it from there.\n\n## Why\n\n`osism update manager`
          runs the keypair play inside the `osism/seed`\ncontainer (the default `CONTAINER=auto`
          path on a manager). That container\nbind-mounts only `/opt/configuration`,
          but `environments/secrets.yml`\nresolved `operator_private_key` from host
          paths *outside* the mount\n(`/home/dragon/.ssh/id_rsa`, `/ansible/secrets/id_rsa.operator`).
          Inside\nthe container the lookup resolved to an empty string, so the keypair
          play\nwrote a zero-byte `id_rsa.operator` and the manager apply failed with
          an\nopaque SSH error:\n\n```\nLoad key \".../id_rsa.operator\": error in
          libcrypto: unsupported\n... Permission denied (publickey).\n```\n\nThis
          broke the midnight upgrade/update lanes (all three failed identically\nonce
          the seed-container update path became active).\n\n## How\n\n* `scripts/deploy/000-manager.sh`
          copies `/home/dragon/.ssh/id_rsa` to\n  `/opt/configuration/environments/secrets/id_rsa.operator`
          after the repo\n  is synced into `/opt/configuration`, alongside the existing
          public-key\n  copy.\n* `environments/secrets.yml` looks up that in-mount
          path first, keeping the\n  two host paths as fallbacks so managers deployed
          before this change still\n  work.\n\n`configuration_directory` is `/opt/configuration`
          both on the manager host\nand as the seed bind-mount, so the absolute path
          resolves in the seed\ncontainer and in the venv/on-manager contexts alike.\n`environments/secrets/`
          is already gitignored, so the key never lands in\ngit.\n\nThis keeps the
          testbed's existing design (dynamic Nova keypair,\nlookup-based `operator_private_key`);
          it deliberately does not adopt the\nproduction vault-literal model (that
          is tbng's role).\n\n## Testing\n\nIntegration test in the `osism/seed` container
          against a simulated\n`/opt/configuration` mount:\n\n- in-mount key present
          -> keypair play resolves the new lookup and writes a\n  loadable `id_rsa.operator`
          (`ssh-keygen -y` succeeds)\n- in-mount key absent (and no host key) -> lookup
          resolves empty; pairs with\n  the empty-key guard in osism/ansible-playbooks-manager#52\n\n`yamllint`
          (repo config) and `shellcheck` clean. A full deploy + upgrade on\na real
          testbed has not been run.\n\n## Related\n\n- osism/ansible-playbooks-manager#52
          (defense-in-depth: fail loudly on an empty operator key)\n\n\U0001F916 Generated
          with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/testbed/pull/2917
        commit_id: 0339f2db79d78f6807b6f761ab1d2cc0fa32d06c
        patchset: 0339f2db79d78f6807b6f761ab1d2cc0fa32d06c
        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: flake8
      jobtags: []
      max_attempts: 3
      message: bWFuYWdlcjogbWFrZSBvcGVyYXRvciBrZXkgcmVhY2hhYmxlIGluIHNlZWQKCiMjIFdoYXQKCk1ha2UgdGhlIG9wZXJhdG9yIHByaXZhdGUga2V5IHJlYWNoYWJsZSBpbnNpZGUgdGhlIGBvc2lzbS9zZWVkYCBjb250YWluZXIKZHVyaW5nIGBvc2lzbSB1cGRhdGUgbWFuYWdlcmAsIGJ5IHBsYWNpbmcgaXQgaW4gdGhlIGJpbmQtbW91bnRlZApjb25maWd1cmF0aW9uIGRpcmVjdG9yeSBhbmQgcmVhZGluZyBpdCBmcm9tIHRoZXJlLgoKIyMgV2h5Cgpgb3Npc20gdXBkYXRlIG1hbmFnZXJgIHJ1bnMgdGhlIGtleXBhaXIgcGxheSBpbnNpZGUgdGhlIGBvc2lzbS9zZWVkYApjb250YWluZXIgKHRoZSBkZWZhdWx0IGBDT05UQUlORVI9YXV0b2AgcGF0aCBvbiBhIG1hbmFnZXIpLiBUaGF0IGNvbnRhaW5lcgpiaW5kLW1vdW50cyBvbmx5IGAvb3B0L2NvbmZpZ3VyYXRpb25gLCBidXQgYGVudmlyb25tZW50cy9zZWNyZXRzLnltbGAKcmVzb2x2ZWQgYG9wZXJhdG9yX3ByaXZhdGVfa2V5YCBmcm9tIGhvc3QgcGF0aHMgKm91dHNpZGUqIHRoZSBtb3VudAooYC9ob21lL2RyYWdvbi8uc3NoL2lkX3JzYWAsIGAvYW5zaWJsZS9zZWNyZXRzL2lkX3JzYS5vcGVyYXRvcmApLiBJbnNpZGUKdGhlIGNvbnRhaW5lciB0aGUgbG9va3VwIHJlc29sdmVkIHRvIGFuIGVtcHR5IHN0cmluZywgc28gdGhlIGtleXBhaXIgcGxheQp3cm90ZSBhIHplcm8tYnl0ZSBgaWRfcnNhLm9wZXJhdG9yYCBhbmQgdGhlIG1hbmFnZXIgYXBwbHkgZmFpbGVkIHdpdGggYW4Kb3BhcXVlIFNTSCBlcnJvcjoKCmBgYApMb2FkIGtleSAiLi4uL2lkX3JzYS5vcGVyYXRvciI6IGVycm9yIGluIGxpYmNyeXB0bzogdW5zdXBwb3J0ZWQKLi4uIFBlcm1pc3Npb24gZGVuaWVkIChwdWJsaWNrZXkpLgpgYGAKClRoaXMgYnJva2UgdGhlIG1pZG5pZ2h0IHVwZ3JhZGUvdXBkYXRlIGxhbmVzIChhbGwgdGhyZWUgZmFpbGVkIGlkZW50aWNhbGx5Cm9uY2UgdGhlIHNlZWQtY29udGFpbmVyIHVwZGF0ZSBwYXRoIGJlY2FtZSBhY3RpdmUpLgoKIyMgSG93CgoqIGBzY3JpcHRzL2RlcGxveS8wMDAtbWFuYWdlci5zaGAgY29waWVzIGAvaG9tZS9kcmFnb24vLnNzaC9pZF9yc2FgIHRvCiAgYC9vcHQvY29uZmlndXJhdGlvbi9lbnZpcm9ubWVudHMvc2VjcmV0cy9pZF9yc2Eub3BlcmF0b3JgIGFmdGVyIHRoZSByZXBvCiAgaXMgc3luY2VkIGludG8gYC9vcHQvY29uZmlndXJhdGlvbmAsIGFsb25nc2lkZSB0aGUgZXhpc3RpbmcgcHVibGljLWtleQogIGNvcHkuCiogYGVudmlyb25tZW50cy9zZWNyZXRzLnltbGAgbG9va3MgdXAgdGhhdCBpbi1tb3VudCBwYXRoIGZpcnN0LCBrZWVwaW5nIHRoZQogIHR3byBob3N0IHBhdGhzIGFzIGZhbGxiYWNrcyBzbyBtYW5hZ2VycyBkZXBsb3llZCBiZWZvcmUgdGhpcyBjaGFuZ2Ugc3RpbGwKICB3b3JrLgoKYGNvbmZpZ3VyYXRpb25fZGlyZWN0b3J5YCBpcyBgL29wdC9jb25maWd1cmF0aW9uYCBib3RoIG9uIHRoZSBtYW5hZ2VyIGhvc3QKYW5kIGFzIHRoZSBzZWVkIGJpbmQtbW91bnQsIHNvIHRoZSBhYnNvbHV0ZSBwYXRoIHJlc29sdmVzIGluIHRoZSBzZWVkCmNvbnRhaW5lciBhbmQgaW4gdGhlIHZlbnYvb24tbWFuYWdlciBjb250ZXh0cyBhbGlrZS4KYGVudmlyb25tZW50cy9zZWNyZXRzL2AgaXMgYWxyZWFkeSBnaXRpZ25vcmVkLCBzbyB0aGUga2V5IG5ldmVyIGxhbmRzIGluCmdpdC4KClRoaXMga2VlcHMgdGhlIHRlc3RiZWQncyBleGlzdGluZyBkZXNpZ24gKGR5bmFtaWMgTm92YSBrZXlwYWlyLApsb29rdXAtYmFzZWQgYG9wZXJhdG9yX3ByaXZhdGVfa2V5YCk7IGl0IGRlbGliZXJhdGVseSBkb2VzIG5vdCBhZG9wdCB0aGUKcHJvZHVjdGlvbiB2YXVsdC1saXRlcmFsIG1vZGVsICh0aGF0IGlzIHRibmcncyByb2xlKS4KCiMjIFRlc3RpbmcKCkludGVncmF0aW9uIHRlc3QgaW4gdGhlIGBvc2lzbS9zZWVkYCBjb250YWluZXIgYWdhaW5zdCBhIHNpbXVsYXRlZApgL29wdC9jb25maWd1cmF0aW9uYCBtb3VudDoKCi0gaW4tbW91bnQga2V5IHByZXNlbnQgLT4ga2V5cGFpciBwbGF5IHJlc29sdmVzIHRoZSBuZXcgbG9va3VwIGFuZCB3cml0ZXMgYQogIGxvYWRhYmxlIGBpZF9yc2Eub3BlcmF0b3JgIChgc3NoLWtleWdlbiAteWAgc3VjY2VlZHMpCi0gaW4tbW91bnQga2V5IGFic2VudCAoYW5kIG5vIGhvc3Qga2V5KSAtPiBsb29rdXAgcmVzb2x2ZXMgZW1wdHk7IHBhaXJzIHdpdGgKICB0aGUgZW1wdHkta2V5IGd1YXJkIGluIG9zaXNtL2Fuc2libGUtcGxheWJvb2tzLW1hbmFnZXIjNTIKCmB5YW1sbGludGAgKHJlcG8gY29uZmlnKSBhbmQgYHNoZWxsY2hlY2tgIGNsZWFuLiBBIGZ1bGwgZGVwbG95ICsgdXBncmFkZSBvbgphIHJlYWwgdGVzdGJlZCBoYXMgbm90IGJlZW4gcnVuLgoKIyMgUmVsYXRlZAoKLSBvc2lzbS9hbnNpYmxlLXBsYXlib29rcy1tYW5hZ2VyIzUyIChkZWZlbnNlLWluLWRlcHRoOiBmYWlsIGxvdWRseSBvbiBhbiBlbXB0eSBvcGVyYXRvciBrZXkpCgrwn6SWIEdlbmVyYXRlZCB3aXRoIFtDbGF1ZGUgQ29kZV0oaHR0cHM6Ly9jbGF1ZGUuY29tL2NsYXVkZS1jb2RlKQ==
      patchset: 0339f2db79d78f6807b6f761ab1d2cc0fa32d06c
      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/flake8/run.yaml
          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: c062cd64ab066d86d0591bb8043a67e617279d95
          name: osism/testbed
          required: false
          short_name: testbed
          src_dir: src/github.com/osism/testbed
      ref: refs/pull/2917/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
