all:
  children:
    cephs:
      hosts:
        instance: null
    computes:
      hosts:
        instance: null
    controllers:
      hosts:
        instance: null
    zuul_unreachable:
      hosts: {}
  hosts:
    instance:
      ansible_connection: ssh
      ansible_host: 162.253.55.72
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      atmosphere_image_prefix: harbor.atmosphere.dev/
      nodepool:
        az: yul2
        cloud: public
        external_id: caacd817-fa5a-434e-8e3e-1985dd0c8c93
        host_id: 3cc3064f3f299d3d37bf8eb0728708985d63c3ec9e6e6eb729dd744b
        interface_ip: 162.253.55.72
        label: ubuntu-jammy
        node_properties: {}
        private_ipv4: 162.253.55.72
        private_ipv6: null
        provider: yul1
        public_ipv4: 162.253.55.72
        public_ipv6: 2604:e100:1:0:f816:3eff:fe5f:f5dd
        region: ca-ymq-1
        slot: null
      zuul_node:
        az: yul2
        cloud: public
        external_id: caacd817-fa5a-434e-8e3e-1985dd0c8c93
        host_id: 3cc3064f3f299d3d37bf8eb0728708985d63c3ec9e6e6eb729dd744b
        interface_ip: 162.253.55.72
        label: ubuntu-jammy
        node_properties: {}
        private_ipv4: 162.253.55.72
        private_ipv6: null
        provider: yul1
        public_ipv4: 162.253.55.72
        public_ipv6: 2604:e100:1:0:f816:3eff:fe5f:f5dd
        region: ca-ymq-1
        slot: null
        uuid: null
  vars:
    atmosphere_image_prefix: harbor.atmosphere.dev/
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#1>'
      - '<Job atmosphere-zuul-jobs-test-atmosphere-build-manifest explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: vexxhost/atmosphere-zuul-jobs/zuul.d/tests.yaml@main#1>'
      - '<Job atmosphere-zuul-jobs-test-atmosphere-build-manifest explicit: None implied:
        None source: vexxhost/atmosphere-zuul-jobs/zuul.d/tests.yaml@main#15>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: e98bed0705c84488b4d07788fbef61c8
      build_refs:
      - branch: main
        change: '8'
        change_message: 'test: add a job for the atmosphere-build-manifest role


          Adds a test job for the `atmosphere-build-manifest` role from #7, following
          the pattern used in opendev''s `zuul/zuul-jobs`: a job that runs only when
          the role or its test changes, and a playbook under `test-playbooks/` that
          includes the role and checks its result.


          `atmosphere-zuul-jobs-test-atmosphere-build-manifest` runs the role against
          the Atmosphere checkout with `atmosphere_image_prefix: harbor.atmosphere.dev/`,
          the same as the molecule jobs, and checks that:


          - `atmosphere_release_manifest` is set to the generated manifest

          - the manifest is a valid release manifest with every image pinned by digest

          - images are recorded with their original references, not the cache prefix
          used to resolve them

          - the manifest is saved with the job logs


          The job lives in `zuul.d/tests.yaml`, since loading a separate `zuul-tests.d/`
          like opendev does needs a tenant configuration change.


          Depends-On: https://github.com/vexxhost/atmosphere-zuul-jobs/pull/7

          Depends-On: https://github.com/vexxhost/atmosphere/pull/4420

          '
        change_url: https://github.com/vexxhost/atmosphere-zuul-jobs/pull/8
        commit_id: 3f4c9f424682057d8ebc613c5f892dac7a58eede
        patchset: 3f4c9f424682057d8ebc613c5f892dac7a58eede
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere-zuul-jobs
          name: vexxhost/atmosphere-zuul-jobs
          short_name: atmosphere-zuul-jobs
          src_dir: src/github.com/vexxhost/atmosphere-zuul-jobs
        src_dir: src/github.com/vexxhost/atmosphere-zuul-jobs
        topic: null
      buildset: 808a38d1e0ca4f0f88e01647e2fe4542
      buildset_refs:
      - branch: main
        change: '8'
        change_message: 'test: add a job for the atmosphere-build-manifest role


          Adds a test job for the `atmosphere-build-manifest` role from #7, following
          the pattern used in opendev''s `zuul/zuul-jobs`: a job that runs only when
          the role or its test changes, and a playbook under `test-playbooks/` that
          includes the role and checks its result.


          `atmosphere-zuul-jobs-test-atmosphere-build-manifest` runs the role against
          the Atmosphere checkout with `atmosphere_image_prefix: harbor.atmosphere.dev/`,
          the same as the molecule jobs, and checks that:


          - `atmosphere_release_manifest` is set to the generated manifest

          - the manifest is a valid release manifest with every image pinned by digest

          - images are recorded with their original references, not the cache prefix
          used to resolve them

          - the manifest is saved with the job logs


          The job lives in `zuul.d/tests.yaml`, since loading a separate `zuul-tests.d/`
          like opendev does needs a tenant configuration change.


          Depends-On: https://github.com/vexxhost/atmosphere-zuul-jobs/pull/7

          Depends-On: https://github.com/vexxhost/atmosphere/pull/4420

          '
        change_url: https://github.com/vexxhost/atmosphere-zuul-jobs/pull/8
        commit_id: 3f4c9f424682057d8ebc613c5f892dac7a58eede
        patchset: 3f4c9f424682057d8ebc613c5f892dac7a58eede
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere-zuul-jobs
          name: vexxhost/atmosphere-zuul-jobs
          short_name: atmosphere-zuul-jobs
          src_dir: src/github.com/vexxhost/atmosphere-zuul-jobs
        src_dir: src/github.com/vexxhost/atmosphere-zuul-jobs
        topic: null
      change: '8'
      change_message: 'test: add a job for the atmosphere-build-manifest role


        Adds a test job for the `atmosphere-build-manifest` role from #7, following
        the pattern used in opendev''s `zuul/zuul-jobs`: a job that runs only when
        the role or its test changes, and a playbook under `test-playbooks/` that
        includes the role and checks its result.


        `atmosphere-zuul-jobs-test-atmosphere-build-manifest` runs the role against
        the Atmosphere checkout with `atmosphere_image_prefix: harbor.atmosphere.dev/`,
        the same as the molecule jobs, and checks that:


        - `atmosphere_release_manifest` is set to the generated manifest

        - the manifest is a valid release manifest with every image pinned by digest

        - images are recorded with their original references, not the cache prefix
        used to resolve them

        - the manifest is saved with the job logs


        The job lives in `zuul.d/tests.yaml`, since loading a separate `zuul-tests.d/`
        like opendev does needs a tenant configuration change.


        Depends-On: https://github.com/vexxhost/atmosphere-zuul-jobs/pull/7

        Depends-On: https://github.com/vexxhost/atmosphere/pull/4420

        '
      change_url: https://github.com/vexxhost/atmosphere-zuul-jobs/pull/8
      child_jobs: []
      commit_id: 3f4c9f424682057d8ebc613c5f892dac7a58eede
      event_id: c5840900-c94f-11f1-9e99-857a6aa743ce
      executor:
        hostname: 2d72f0692154
        inventory_file: /var/lib/zuul/builds/e98bed0705c84488b4d07788fbef61c8/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/e98bed0705c84488b4d07788fbef61c8/work/logs
        result_data_file: /var/lib/zuul/builds/e98bed0705c84488b4d07788fbef61c8/work/results.json
        src_root: /var/lib/zuul/builds/e98bed0705c84488b4d07788fbef61c8/work/src
        work_root: /var/lib/zuul/builds/e98bed0705c84488b4d07788fbef61c8/work
      include_vars: []
      items:
      - branch: main
        change: '7'
        change_message: 'feat(molecule): deploy from a generated release manifest


          The molecule jobs deploy whatever image tags `roles/defaults/vars/main.yml`
          points at when the job runs, while releases ship digest-pinned images. With
          vexxhost/atmosphere#4420, Atmosphere publishes a digest-pinned release manifest
          for every commit, and this makes CI deploy exactly that manifest for the
          change under test.


          - The pre-run playbook checks for `cmd/atmosphere-release` in the change
          under test. When it exists, it installs Go (`ensure-go`, 1.24.4), runs `atmosphere-release
          generate --resolve-prefix harbor.atmosphere.dev/`, which resolves tags through
          the image cache to avoid Docker Hub rate limits while recording the original
          references, and saves the manifest with the job logs.

          - `atmosphere_release_manifest` points the deployment at that file. Combined
          with the existing `atmosphere_image_prefix`, every image is pulled as `harbor.atmosphere.dev/<original
          reference>@<digest>`.

          - Branches without release manifest support (all stable branches until the
          backports land) skip the generation, and their `defaults` role does not
          know the new variable, so nothing changes for them.


          This is tested through `Depends-On` from vexxhost/atmosphere#4420.

          '
        change_url: https://github.com/vexxhost/atmosphere-zuul-jobs/pull/7
        commit_id: a7dd6c92a21aa01d1650c252214c63e38b86c497
        patchset: a7dd6c92a21aa01d1650c252214c63e38b86c497
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere-zuul-jobs
          name: vexxhost/atmosphere-zuul-jobs
          short_name: atmosphere-zuul-jobs
          src_dir: src/github.com/vexxhost/atmosphere-zuul-jobs
        topic: null
      - branch: main
        change: '4420'
        change_message: "feat: publish release manifests and deploy from them\n\nToday
          a release resolves image tags at release time, after CI has run: 88 of the
          232 entries in `roles/defaults/vars/main.yml` are plain tags, and `cmd/pinimages`
          resolves them into the Galaxy collection, silently skipping any it cannot
          resolve (it logs 94 errors on `main` today). The digests a release ships
          are only recorded inside the Galaxy tarball, and mirroring for air-gapped
          installs goes through the `image_manifest` role, whose registry rewrite
          keeps only the last path component, so `rook/ceph` and `ceph/ceph` both
          become `<registry>/ceph`.\n\nThis PR makes a digest-pinned **release manifest**
          the source of truth for which images a commit or release deploys.\n\n**Publishing**\n-
          The `build` job already resolved every image on each push; it now publishes
          the result as an OCI artifact to `ghcr.io/vexxhost/atmosphere-release`,
          tagged with the full commit SHA and the branch (`main`, `stable-2025.2`,
          ...) as computed by `docker/metadata-action`.\n- `release.yaml` uses `docker/metadata-action`
          for the release tag and promotes the released commit's manifest to it (no
          tag is resolved again). GoReleaser (`.goreleaser.yaml`) attaches `atmosphere-release`
          archives for linux/darwin amd64/arm64, their checksums and the release manifest
          to the existing GitHub release without touching its notes, and the Galaxy
          collection is pinned from that same manifest.\n\n**Deploying**\n- `atmosphere_release_manifest`
          (OCI reference or file path) deploys exactly a manifest's images. Kubernetes
          control plane images fall back to the tag when another `atmosphere_kubernetes_version`
          is deployed.\n- `atmosphere_image_mirrors` redirects images per registry,
          namespace or repository (most specific rule wins); `atmosphere_image_prefix`
          still applies to everything no rule matches, so Harbor proxy projects with
          custom names now work too.\n- Resolution happens in the rendered references,
          so it works with any Kubernetes and container runtime. `atmosphere_image_overrides`
          are applied last, unchanged.\n\n**`atmosphere-release` command** (`cmd/atmosphere-release`,
          replaces `cmd/pinimages`)\n- `generate [--write-vars] [--resolve-prefix]`,
          `push`, `promote`, `show`, `diff`, `check`. `push` and `promote` take `repository:tag`
          references, so they consume `docker/metadata-action` output directly; `--resolve-prefix`
          resolves tags through a pull-through cache (falling back to the source registry)
          to avoid upstream rate limits.\n- `mirror` to a registry, or `--to-dir`
          / `--from-dir` for disconnected sites, in `nested`, `flat` (`quay.io--ceph--ceph`)
          or `single-repo` layouts. Images are copied with every platform so digests
          never change, each digest is verified, kubeadm's images stay under one prefix
          with their original names, the manifest artifact itself is copied with its
          digest intact, and the `atmosphere_release_manifest` / `atmosphere_image_mirrors`
          vars are written out.\n\nThe `image_manifest` role keeps working but now
          warns that it is deprecated.\n\n### Compatibility\n\nDeployments that set
          none of the new variables get byte-identical `atmosphere_images`: I rendered
          the `defaults` role through `ansible-playbook` before and after this change
          with no prefix, with a Harbor prefix, and with prefix + overrides, on `main`
          (231 images) and on `stable/zed` (216 images); all outputs are identical.
          `write-vars` produces the same vars file as `pinimages` except that Ceph
          is now pinned too (`pinimages` could not resolve its `{{ ceph_version }}`
          template).\n\n### Testing\n\n- Go: `internal/releasemanifest` tests cover
          generation, `write-vars`, push/fetch/promote, every mirror layout with multi-arch
          images in in-memory registries, directory export/import, digest-mismatch
          detection, registries with ports and retry on rate limits.\n- Python: the
          `resolve_images` filter and the Go resolver run the same cases from `internal/releasemanifest/testdata/resolve.yaml`;
          the lookup is tested against a local HTTP registry with token auth and blob
          redirects (credentials must not reach storage) and tampered content. A new
          `python-test` CI job runs these (the existing `tests/unit` suite is not
          run in CI and has a stale magnum expectation, so the job only runs the new
          tests).\n- End to end against a local CNCF Distribution registry with real
          images from `registry.k8s.io`, `ghcr.io` and Docker Hub: `generate`, `push`,
          `promote`, `show`, nested mirror, export \u2192 flat import, `check`, `diff`,
          plus deploying the mirrored manifest through the lookup.\n- `generate` against
          the real registries resolves all 231 images on `main` and `stable/2025.2`.\n\n###
          Backports\n\n`go.mod` and `go.sum` are untouched; every dependency is already
          present at the same version on all stable branches.\n\n- `stable/2025.2`
          cherry-picks cleanly and passes everything above.\n- `stable/2025.1` back
          to `stable/zed` conflict in one hunk of `roles/defaults/vars/main.yml`:
          the conflict context includes `main`'s `_atmosphere_storage` block, which
          those branches don't have. Resolve it by keeping the new `atmosphere_images`
          block and dropping the `_atmosphere_storage` lines. I did this on `stable/zed`
          and the Go tests, Python tests and the old/new rendering comparison all
          pass.\n\n### CI deploys the manifest\n\nvexxhost/atmosphere-zuul-jobs#7
          makes the molecule jobs generate this change's release manifest (through
          the `harbor.atmosphere.dev/` cache) and deploy from it with `atmosphere_release_manifest`,
          so the AIO, CSI and Keycloak jobs exercise the manifest path and deploy
          exactly the images that would be published.\n\n### Before merging / follow-ups\n\n-
          After the first push publishes `ghcr.io/vexxhost/atmosphere-release`, make
          the package public and set retention (keep release tags; commit tags can
          be pruned).\n- Docker Hub's anonymous rate limit can still fail `generate`
          after its retries; previously this silently produced unpinned images.\n-
          `harbor.atmosphere.dev` has no proxy project for `packages.vexxhost.com`
          (used by `prometheus_smartctl_exporter`).\n- The docs build with `-W` already
          fails on `main` because of existing warnings in `admin/monitoring.rst` and
          `arch/images.rst`; the new page adds none.\n\nDepends-On: https://github.com/vexxhost/atmosphere-zuul-jobs/pull/7\n"
        change_url: https://github.com/vexxhost/atmosphere/pull/4420
        commit_id: f214a51208af4f64ef3bf55f2bd13cce5102c26e
        patchset: f214a51208af4f64ef3bf55f2bd13cce5102c26e
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere
          name: vexxhost/atmosphere
          short_name: atmosphere
          src_dir: src/github.com/vexxhost/atmosphere
        topic: null
      - branch: main
        change: '8'
        change_message: 'test: add a job for the atmosphere-build-manifest role


          Adds a test job for the `atmosphere-build-manifest` role from #7, following
          the pattern used in opendev''s `zuul/zuul-jobs`: a job that runs only when
          the role or its test changes, and a playbook under `test-playbooks/` that
          includes the role and checks its result.


          `atmosphere-zuul-jobs-test-atmosphere-build-manifest` runs the role against
          the Atmosphere checkout with `atmosphere_image_prefix: harbor.atmosphere.dev/`,
          the same as the molecule jobs, and checks that:


          - `atmosphere_release_manifest` is set to the generated manifest

          - the manifest is a valid release manifest with every image pinned by digest

          - images are recorded with their original references, not the cache prefix
          used to resolve them

          - the manifest is saved with the job logs


          The job lives in `zuul.d/tests.yaml`, since loading a separate `zuul-tests.d/`
          like opendev does needs a tenant configuration change.


          Depends-On: https://github.com/vexxhost/atmosphere-zuul-jobs/pull/7

          Depends-On: https://github.com/vexxhost/atmosphere/pull/4420

          '
        change_url: https://github.com/vexxhost/atmosphere-zuul-jobs/pull/8
        commit_id: 3f4c9f424682057d8ebc613c5f892dac7a58eede
        patchset: 3f4c9f424682057d8ebc613c5f892dac7a58eede
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere-zuul-jobs
          name: vexxhost/atmosphere-zuul-jobs
          short_name: atmosphere-zuul-jobs
          src_dir: src/github.com/vexxhost/atmosphere-zuul-jobs
        topic: null
      job: atmosphere-zuul-jobs-test-atmosphere-build-manifest
      jobtags: []
      max_attempts: 3
      message: dGVzdDogYWRkIGEgam9iIGZvciB0aGUgYXRtb3NwaGVyZS1idWlsZC1tYW5pZmVzdCByb2xlCgpBZGRzIGEgdGVzdCBqb2IgZm9yIHRoZSBgYXRtb3NwaGVyZS1idWlsZC1tYW5pZmVzdGAgcm9sZSBmcm9tICM3LCBmb2xsb3dpbmcgdGhlIHBhdHRlcm4gdXNlZCBpbiBvcGVuZGV2J3MgYHp1dWwvenV1bC1qb2JzYDogYSBqb2IgdGhhdCBydW5zIG9ubHkgd2hlbiB0aGUgcm9sZSBvciBpdHMgdGVzdCBjaGFuZ2VzLCBhbmQgYSBwbGF5Ym9vayB1bmRlciBgdGVzdC1wbGF5Ym9va3MvYCB0aGF0IGluY2x1ZGVzIHRoZSByb2xlIGFuZCBjaGVja3MgaXRzIHJlc3VsdC4KCmBhdG1vc3BoZXJlLXp1dWwtam9icy10ZXN0LWF0bW9zcGhlcmUtYnVpbGQtbWFuaWZlc3RgIHJ1bnMgdGhlIHJvbGUgYWdhaW5zdCB0aGUgQXRtb3NwaGVyZSBjaGVja291dCB3aXRoIGBhdG1vc3BoZXJlX2ltYWdlX3ByZWZpeDogaGFyYm9yLmF0bW9zcGhlcmUuZGV2L2AsIHRoZSBzYW1lIGFzIHRoZSBtb2xlY3VsZSBqb2JzLCBhbmQgY2hlY2tzIHRoYXQ6CgotIGBhdG1vc3BoZXJlX3JlbGVhc2VfbWFuaWZlc3RgIGlzIHNldCB0byB0aGUgZ2VuZXJhdGVkIG1hbmlmZXN0Ci0gdGhlIG1hbmlmZXN0IGlzIGEgdmFsaWQgcmVsZWFzZSBtYW5pZmVzdCB3aXRoIGV2ZXJ5IGltYWdlIHBpbm5lZCBieSBkaWdlc3QKLSBpbWFnZXMgYXJlIHJlY29yZGVkIHdpdGggdGhlaXIgb3JpZ2luYWwgcmVmZXJlbmNlcywgbm90IHRoZSBjYWNoZSBwcmVmaXggdXNlZCB0byByZXNvbHZlIHRoZW0KLSB0aGUgbWFuaWZlc3QgaXMgc2F2ZWQgd2l0aCB0aGUgam9iIGxvZ3MKClRoZSBqb2IgbGl2ZXMgaW4gYHp1dWwuZC90ZXN0cy55YW1sYCwgc2luY2UgbG9hZGluZyBhIHNlcGFyYXRlIGB6dXVsLXRlc3RzLmQvYCBsaWtlIG9wZW5kZXYgZG9lcyBuZWVkcyBhIHRlbmFudCBjb25maWd1cmF0aW9uIGNoYW5nZS4KCkRlcGVuZHMtT246IGh0dHBzOi8vZ2l0aHViLmNvbS92ZXh4aG9zdC9hdG1vc3BoZXJlLXp1dWwtam9icy9wdWxsLzcKRGVwZW5kcy1PbjogaHR0cHM6Ly9naXRodWIuY29tL3ZleHhob3N0L2F0bW9zcGhlcmUvcHVsbC80NDIwCg==
      patchset: 3f4c9f424682057d8ebc613c5f892dac7a58eede
      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/github.com/vexxhost/atmosphere-zuul-jobs:
            canonical_name: github.com/vexxhost/atmosphere-zuul-jobs
            checkout: main
            commit: 4e9e069aa243d7112dbdbc85c86331a4cbdf6ff5
          untrusted/project_1/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 298983cd1253e6833abdb49d87d912527e0e6597
          untrusted/project_2/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: be52461cd48abccbf95b13a58b2551ac673d8ad7
          untrusted/project_3/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: c286bf94224b5660b8e49e9a058289e61062a9a0
        playbooks:
        - path: untrusted/project_0/github.com/vexxhost/atmosphere-zuul-jobs/test-playbooks/atmosphere-build-manifest.yaml
          roles:
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/playbook_0/role_0/atmosphere-zuul-jobs
            link_target: untrusted/project_0/github.com/vexxhost/atmosphere-zuul-jobs
            role_path: ansible/playbook_0/role_0/atmosphere-zuul-jobs/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/playbook_0/role_2/zuul-jobs
            link_target: untrusted/project_2/opendev.org/zuul/zuul-jobs
            role_path: ansible/playbook_0/role_2/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_3/zuul-jobs
            link_target: untrusted/project_3/github.com/vexxhost/zuul-jobs
            role_path: ansible/playbook_0/role_3/zuul-jobs/roles
        post_playbooks:
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/post.yaml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/post_playbook_0/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_0/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_0/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_0/role_2/zuul-jobs/roles
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/post-logs.yaml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/post_playbook_1/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_1/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_1/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_1/role_2/zuul-jobs/roles
        pre_playbooks:
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/pre.yaml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/pre_playbook_0/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_0/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_0/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_0/role_2/zuul-jobs/roles
      post_review: false
      post_timeout: null
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/vexxhost/atmosphere-zuul-jobs
        name: vexxhost/atmosphere-zuul-jobs
        short_name: atmosphere-zuul-jobs
        src_dir: src/github.com/vexxhost/atmosphere-zuul-jobs
      projects:
        github.com/vexxhost/atmosphere:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere
          checkout: main
          checkout_description: zuul branch
          commit: f214a51208af4f64ef3bf55f2bd13cce5102c26e
          name: vexxhost/atmosphere
          required: true
          short_name: atmosphere
          src_dir: src/github.com/vexxhost/atmosphere
        github.com/vexxhost/atmosphere-zuul-jobs:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere-zuul-jobs
          checkout: main
          checkout_description: zuul branch
          commit: 4e9e069aa243d7112dbdbc85c86331a4cbdf6ff5
          name: vexxhost/atmosphere-zuul-jobs
          required: false
          short_name: atmosphere-zuul-jobs
          src_dir: src/github.com/vexxhost/atmosphere-zuul-jobs
      ref: refs/pull/8/head
      resources: {}
      tenant: oss
      timeout: 1800
      topic: null
      voting: true
