all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe37:867c
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 0f5f894c-98fd-417f-ac3b-05b83e459b9b
        host_id: 7f2607eceb24f4583c6f9496c53c64b51afe50de5eacda4379b21c42
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe37:867c
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.0.110
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.191
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe37:867c
        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 yamllint explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#59>'
      - '<Job yamllint explicit: None implied: None source: osism/container-image-kolla-ansible/.zuul.yaml@main#163>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 63030777ef1c4bd8998c1710727d6023
      build_refs:
      - branch: main
        change: '911'
        change_message: "horizon: healthcheck follows login redirect\n\n## What\n\nMake
          the Horizon container healthcheck follow the redirect from `/` to the\nlogin
          page (add `-L`), so a broken django-compressor offline manifest is\ndetected
          instead of being masked.\n\n## Why\n\nThe stock healthcheck curls `/`, which
          Horizon answers with a 302 redirect to\nthe login page. `healthcheck_curl`
          is `curl --fail` **without** `-L`, so the 302\ncounts as success and the
          login page is never rendered. A broken offline\nmanifest only fails when
          the login page renders (HTTP 500,\n`OfflineGenerationError`), so the container
          stays `healthy` and HAProxy keeps\nrouting to a backend that serves 500s
          on roughly every 2nd/3rd request.\nSee osism/issues#1363 (split from #1360).\n\n##
          How\n\nAdd `-L` to `horizon_healthcheck_test` so curl follows the redirect
          and fetches\nthe login page, which renders the offline-compressed block.
          A backend with a\nmissing/stale manifest is now reported `unhealthy`. The
          login page renders\nwithout a Keystone round-trip, so it stays a lightweight
          liveness probe.\n\nFollowing the redirect (rather than hardcoding `/auth/login/`)
          keeps the check\ncorrect under a custom `WEBROOT`: kolla-ansible has no
          WEBROOT variable, so a\nhardcoded path would 404 and mark a healthy container
          unhealthy. It does rely on\n`/` redirecting to the dashboard, which the
          stock kolla vhost does.\n\nPatches for 2024.2, 2025.1 and 2025.2 (byte-identical).
          This carries the fix\nuntil an equivalent change lands upstream in `openstack/kolla-ansible`.\n\n##
          Verification\n\nVerified end-to-end on a 3-controller testbed (OpenStack
          2024.2) with the patched\nkolla-ansible image injected via `testbed-operator.py
          deploy --local-image`:\n\n- Clean deploy: all three horizon containers `healthy`;
          the `-L` probe returns\n  exit 0 (no false negative).\n- Reproduced the
          real failure mode on one controller \u2014 removed the offline\n  manifest
          (`.../static/dashboard/manifest.json`; Horizon sets\n  `COMPRESS_OUTPUT_DIR=dashboard`)
          and restarted, so `extend_start.sh` skipped\n  `compress` (settings unchanged)
          and the worker came up with no manifest \u2192 the\n  login page returns
          HTTP 500.\n- On the broken backend the healthcheck command (what Docker
          runs) returns\n  **exit 0 without `-L`** (misses it) and **exit 1 with `-L`**
          (catches it).\n- A non-zero healthcheck marks the container `unhealthy`:
          confirmed in an\n  equivalent run where the affected backend went `unhealthy`
          while the other two\n  stayed `healthy`, and recovered once the manifest
          was restored.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/container-image-kolla-ansible/pull/911
        commit_id: 67159f9790a7162263ceab2c9e282f9ec6009e68
        patchset: 67159f9790a7162263ceab2c9e282f9ec6009e68
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/container-image-kolla-ansible
          name: osism/container-image-kolla-ansible
          short_name: container-image-kolla-ansible
        src_dir: src/github.com/osism/container-image-kolla-ansible
        topic: null
      buildset: d1b768b5362b4e75a690e232e4ebc553
      buildset_refs:
      - branch: main
        change: '911'
        change_message: "horizon: healthcheck follows login redirect\n\n## What\n\nMake
          the Horizon container healthcheck follow the redirect from `/` to the\nlogin
          page (add `-L`), so a broken django-compressor offline manifest is\ndetected
          instead of being masked.\n\n## Why\n\nThe stock healthcheck curls `/`, which
          Horizon answers with a 302 redirect to\nthe login page. `healthcheck_curl`
          is `curl --fail` **without** `-L`, so the 302\ncounts as success and the
          login page is never rendered. A broken offline\nmanifest only fails when
          the login page renders (HTTP 500,\n`OfflineGenerationError`), so the container
          stays `healthy` and HAProxy keeps\nrouting to a backend that serves 500s
          on roughly every 2nd/3rd request.\nSee osism/issues#1363 (split from #1360).\n\n##
          How\n\nAdd `-L` to `horizon_healthcheck_test` so curl follows the redirect
          and fetches\nthe login page, which renders the offline-compressed block.
          A backend with a\nmissing/stale manifest is now reported `unhealthy`. The
          login page renders\nwithout a Keystone round-trip, so it stays a lightweight
          liveness probe.\n\nFollowing the redirect (rather than hardcoding `/auth/login/`)
          keeps the check\ncorrect under a custom `WEBROOT`: kolla-ansible has no
          WEBROOT variable, so a\nhardcoded path would 404 and mark a healthy container
          unhealthy. It does rely on\n`/` redirecting to the dashboard, which the
          stock kolla vhost does.\n\nPatches for 2024.2, 2025.1 and 2025.2 (byte-identical).
          This carries the fix\nuntil an equivalent change lands upstream in `openstack/kolla-ansible`.\n\n##
          Verification\n\nVerified end-to-end on a 3-controller testbed (OpenStack
          2024.2) with the patched\nkolla-ansible image injected via `testbed-operator.py
          deploy --local-image`:\n\n- Clean deploy: all three horizon containers `healthy`;
          the `-L` probe returns\n  exit 0 (no false negative).\n- Reproduced the
          real failure mode on one controller \u2014 removed the offline\n  manifest
          (`.../static/dashboard/manifest.json`; Horizon sets\n  `COMPRESS_OUTPUT_DIR=dashboard`)
          and restarted, so `extend_start.sh` skipped\n  `compress` (settings unchanged)
          and the worker came up with no manifest \u2192 the\n  login page returns
          HTTP 500.\n- On the broken backend the healthcheck command (what Docker
          runs) returns\n  **exit 0 without `-L`** (misses it) and **exit 1 with `-L`**
          (catches it).\n- A non-zero healthcheck marks the container `unhealthy`:
          confirmed in an\n  equivalent run where the affected backend went `unhealthy`
          while the other two\n  stayed `healthy`, and recovered once the manifest
          was restored.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/container-image-kolla-ansible/pull/911
        commit_id: 67159f9790a7162263ceab2c9e282f9ec6009e68
        patchset: 67159f9790a7162263ceab2c9e282f9ec6009e68
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/container-image-kolla-ansible
          name: osism/container-image-kolla-ansible
          short_name: container-image-kolla-ansible
        src_dir: src/github.com/osism/container-image-kolla-ansible
        topic: null
      change: '911'
      change_message: "horizon: healthcheck follows login redirect\n\n## What\n\nMake
        the Horizon container healthcheck follow the redirect from `/` to the\nlogin
        page (add `-L`), so a broken django-compressor offline manifest is\ndetected
        instead of being masked.\n\n## Why\n\nThe stock healthcheck curls `/`, which
        Horizon answers with a 302 redirect to\nthe login page. `healthcheck_curl`
        is `curl --fail` **without** `-L`, so the 302\ncounts as success and the login
        page is never rendered. A broken offline\nmanifest only fails when the login
        page renders (HTTP 500,\n`OfflineGenerationError`), so the container stays
        `healthy` and HAProxy keeps\nrouting to a backend that serves 500s on roughly
        every 2nd/3rd request.\nSee osism/issues#1363 (split from #1360).\n\n## How\n\nAdd
        `-L` to `horizon_healthcheck_test` so curl follows the redirect and fetches\nthe
        login page, which renders the offline-compressed block. A backend with a\nmissing/stale
        manifest is now reported `unhealthy`. The login page renders\nwithout a Keystone
        round-trip, so it stays a lightweight liveness probe.\n\nFollowing the redirect
        (rather than hardcoding `/auth/login/`) keeps the check\ncorrect under a custom
        `WEBROOT`: kolla-ansible has no WEBROOT variable, so a\nhardcoded path would
        404 and mark a healthy container unhealthy. It does rely on\n`/` redirecting
        to the dashboard, which the stock kolla vhost does.\n\nPatches for 2024.2,
        2025.1 and 2025.2 (byte-identical). This carries the fix\nuntil an equivalent
        change lands upstream in `openstack/kolla-ansible`.\n\n## Verification\n\nVerified
        end-to-end on a 3-controller testbed (OpenStack 2024.2) with the patched\nkolla-ansible
        image injected via `testbed-operator.py deploy --local-image`:\n\n- Clean
        deploy: all three horizon containers `healthy`; the `-L` probe returns\n  exit
        0 (no false negative).\n- Reproduced the real failure mode on one controller
        \u2014 removed the offline\n  manifest (`.../static/dashboard/manifest.json`;
        Horizon sets\n  `COMPRESS_OUTPUT_DIR=dashboard`) and restarted, so `extend_start.sh`
        skipped\n  `compress` (settings unchanged) and the worker came up with no
        manifest \u2192 the\n  login page returns HTTP 500.\n- On the broken backend
        the healthcheck command (what Docker runs) returns\n  **exit 0 without `-L`**
        (misses it) and **exit 1 with `-L`** (catches it).\n- A non-zero healthcheck
        marks the container `unhealthy`: confirmed in an\n  equivalent run where the
        affected backend went `unhealthy` while the other two\n  stayed `healthy`,
        and recovered once the manifest was restored.\n\n\U0001F916 Generated with
        [Claude Code](https://claude.com/claude-code)"
      change_url: https://github.com/osism/container-image-kolla-ansible/pull/911
      child_jobs: []
      commit_id: 67159f9790a7162263ceab2c9e282f9ec6009e68
      event_id: b75e5e10-5f0b-11f1-944d-489a5587f5f3
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/63030777ef1c4bd8998c1710727d6023/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/63030777ef1c4bd8998c1710727d6023/work/logs
        result_data_file: /var/lib/zuul/builds/63030777ef1c4bd8998c1710727d6023/work/results.json
        src_root: /var/lib/zuul/builds/63030777ef1c4bd8998c1710727d6023/work/src
        work_root: /var/lib/zuul/builds/63030777ef1c4bd8998c1710727d6023/work
      include_vars: []
      items:
      - branch: main
        change: '911'
        change_message: "horizon: healthcheck follows login redirect\n\n## What\n\nMake
          the Horizon container healthcheck follow the redirect from `/` to the\nlogin
          page (add `-L`), so a broken django-compressor offline manifest is\ndetected
          instead of being masked.\n\n## Why\n\nThe stock healthcheck curls `/`, which
          Horizon answers with a 302 redirect to\nthe login page. `healthcheck_curl`
          is `curl --fail` **without** `-L`, so the 302\ncounts as success and the
          login page is never rendered. A broken offline\nmanifest only fails when
          the login page renders (HTTP 500,\n`OfflineGenerationError`), so the container
          stays `healthy` and HAProxy keeps\nrouting to a backend that serves 500s
          on roughly every 2nd/3rd request.\nSee osism/issues#1363 (split from #1360).\n\n##
          How\n\nAdd `-L` to `horizon_healthcheck_test` so curl follows the redirect
          and fetches\nthe login page, which renders the offline-compressed block.
          A backend with a\nmissing/stale manifest is now reported `unhealthy`. The
          login page renders\nwithout a Keystone round-trip, so it stays a lightweight
          liveness probe.\n\nFollowing the redirect (rather than hardcoding `/auth/login/`)
          keeps the check\ncorrect under a custom `WEBROOT`: kolla-ansible has no
          WEBROOT variable, so a\nhardcoded path would 404 and mark a healthy container
          unhealthy. It does rely on\n`/` redirecting to the dashboard, which the
          stock kolla vhost does.\n\nPatches for 2024.2, 2025.1 and 2025.2 (byte-identical).
          This carries the fix\nuntil an equivalent change lands upstream in `openstack/kolla-ansible`.\n\n##
          Verification\n\nVerified end-to-end on a 3-controller testbed (OpenStack
          2024.2) with the patched\nkolla-ansible image injected via `testbed-operator.py
          deploy --local-image`:\n\n- Clean deploy: all three horizon containers `healthy`;
          the `-L` probe returns\n  exit 0 (no false negative).\n- Reproduced the
          real failure mode on one controller \u2014 removed the offline\n  manifest
          (`.../static/dashboard/manifest.json`; Horizon sets\n  `COMPRESS_OUTPUT_DIR=dashboard`)
          and restarted, so `extend_start.sh` skipped\n  `compress` (settings unchanged)
          and the worker came up with no manifest \u2192 the\n  login page returns
          HTTP 500.\n- On the broken backend the healthcheck command (what Docker
          runs) returns\n  **exit 0 without `-L`** (misses it) and **exit 1 with `-L`**
          (catches it).\n- A non-zero healthcheck marks the container `unhealthy`:
          confirmed in an\n  equivalent run where the affected backend went `unhealthy`
          while the other two\n  stayed `healthy`, and recovered once the manifest
          was restored.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/container-image-kolla-ansible/pull/911
        commit_id: 67159f9790a7162263ceab2c9e282f9ec6009e68
        patchset: 67159f9790a7162263ceab2c9e282f9ec6009e68
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/container-image-kolla-ansible
          name: osism/container-image-kolla-ansible
          short_name: container-image-kolla-ansible
          src_dir: src/github.com/osism/container-image-kolla-ansible
        topic: null
      job: yamllint
      jobtags: []
      max_attempts: 3
      message: aG9yaXpvbjogaGVhbHRoY2hlY2sgZm9sbG93cyBsb2dpbiByZWRpcmVjdAoKIyMgV2hhdAoKTWFrZSB0aGUgSG9yaXpvbiBjb250YWluZXIgaGVhbHRoY2hlY2sgZm9sbG93IHRoZSByZWRpcmVjdCBmcm9tIGAvYCB0byB0aGUKbG9naW4gcGFnZSAoYWRkIGAtTGApLCBzbyBhIGJyb2tlbiBkamFuZ28tY29tcHJlc3NvciBvZmZsaW5lIG1hbmlmZXN0IGlzCmRldGVjdGVkIGluc3RlYWQgb2YgYmVpbmcgbWFza2VkLgoKIyMgV2h5CgpUaGUgc3RvY2sgaGVhbHRoY2hlY2sgY3VybHMgYC9gLCB3aGljaCBIb3Jpem9uIGFuc3dlcnMgd2l0aCBhIDMwMiByZWRpcmVjdCB0bwp0aGUgbG9naW4gcGFnZS4gYGhlYWx0aGNoZWNrX2N1cmxgIGlzIGBjdXJsIC0tZmFpbGAgKip3aXRob3V0KiogYC1MYCwgc28gdGhlIDMwMgpjb3VudHMgYXMgc3VjY2VzcyBhbmQgdGhlIGxvZ2luIHBhZ2UgaXMgbmV2ZXIgcmVuZGVyZWQuIEEgYnJva2VuIG9mZmxpbmUKbWFuaWZlc3Qgb25seSBmYWlscyB3aGVuIHRoZSBsb2dpbiBwYWdlIHJlbmRlcnMgKEhUVFAgNTAwLApgT2ZmbGluZUdlbmVyYXRpb25FcnJvcmApLCBzbyB0aGUgY29udGFpbmVyIHN0YXlzIGBoZWFsdGh5YCBhbmQgSEFQcm94eSBrZWVwcwpyb3V0aW5nIHRvIGEgYmFja2VuZCB0aGF0IHNlcnZlcyA1MDBzIG9uIHJvdWdobHkgZXZlcnkgMm5kLzNyZCByZXF1ZXN0LgpTZWUgb3Npc20vaXNzdWVzIzEzNjMgKHNwbGl0IGZyb20gIzEzNjApLgoKIyMgSG93CgpBZGQgYC1MYCB0byBgaG9yaXpvbl9oZWFsdGhjaGVja190ZXN0YCBzbyBjdXJsIGZvbGxvd3MgdGhlIHJlZGlyZWN0IGFuZCBmZXRjaGVzCnRoZSBsb2dpbiBwYWdlLCB3aGljaCByZW5kZXJzIHRoZSBvZmZsaW5lLWNvbXByZXNzZWQgYmxvY2suIEEgYmFja2VuZCB3aXRoIGEKbWlzc2luZy9zdGFsZSBtYW5pZmVzdCBpcyBub3cgcmVwb3J0ZWQgYHVuaGVhbHRoeWAuIFRoZSBsb2dpbiBwYWdlIHJlbmRlcnMKd2l0aG91dCBhIEtleXN0b25lIHJvdW5kLXRyaXAsIHNvIGl0IHN0YXlzIGEgbGlnaHR3ZWlnaHQgbGl2ZW5lc3MgcHJvYmUuCgpGb2xsb3dpbmcgdGhlIHJlZGlyZWN0IChyYXRoZXIgdGhhbiBoYXJkY29kaW5nIGAvYXV0aC9sb2dpbi9gKSBrZWVwcyB0aGUgY2hlY2sKY29ycmVjdCB1bmRlciBhIGN1c3RvbSBgV0VCUk9PVGA6IGtvbGxhLWFuc2libGUgaGFzIG5vIFdFQlJPT1QgdmFyaWFibGUsIHNvIGEKaGFyZGNvZGVkIHBhdGggd291bGQgNDA0IGFuZCBtYXJrIGEgaGVhbHRoeSBjb250YWluZXIgdW5oZWFsdGh5LiBJdCBkb2VzIHJlbHkgb24KYC9gIHJlZGlyZWN0aW5nIHRvIHRoZSBkYXNoYm9hcmQsIHdoaWNoIHRoZSBzdG9jayBrb2xsYSB2aG9zdCBkb2VzLgoKUGF0Y2hlcyBmb3IgMjAyNC4yLCAyMDI1LjEgYW5kIDIwMjUuMiAoYnl0ZS1pZGVudGljYWwpLiBUaGlzIGNhcnJpZXMgdGhlIGZpeAp1bnRpbCBhbiBlcXVpdmFsZW50IGNoYW5nZSBsYW5kcyB1cHN0cmVhbSBpbiBgb3BlbnN0YWNrL2tvbGxhLWFuc2libGVgLgoKIyMgVmVyaWZpY2F0aW9uCgpWZXJpZmllZCBlbmQtdG8tZW5kIG9uIGEgMy1jb250cm9sbGVyIHRlc3RiZWQgKE9wZW5TdGFjayAyMDI0LjIpIHdpdGggdGhlIHBhdGNoZWQKa29sbGEtYW5zaWJsZSBpbWFnZSBpbmplY3RlZCB2aWEgYHRlc3RiZWQtb3BlcmF0b3IucHkgZGVwbG95IC0tbG9jYWwtaW1hZ2VgOgoKLSBDbGVhbiBkZXBsb3k6IGFsbCB0aHJlZSBob3Jpem9uIGNvbnRhaW5lcnMgYGhlYWx0aHlgOyB0aGUgYC1MYCBwcm9iZSByZXR1cm5zCiAgZXhpdCAwIChubyBmYWxzZSBuZWdhdGl2ZSkuCi0gUmVwcm9kdWNlZCB0aGUgcmVhbCBmYWlsdXJlIG1vZGUgb24gb25lIGNvbnRyb2xsZXIg4oCUIHJlbW92ZWQgdGhlIG9mZmxpbmUKICBtYW5pZmVzdCAoYC4uLi9zdGF0aWMvZGFzaGJvYXJkL21hbmlmZXN0Lmpzb25gOyBIb3Jpem9uIHNldHMKICBgQ09NUFJFU1NfT1VUUFVUX0RJUj1kYXNoYm9hcmRgKSBhbmQgcmVzdGFydGVkLCBzbyBgZXh0ZW5kX3N0YXJ0LnNoYCBza2lwcGVkCiAgYGNvbXByZXNzYCAoc2V0dGluZ3MgdW5jaGFuZ2VkKSBhbmQgdGhlIHdvcmtlciBjYW1lIHVwIHdpdGggbm8gbWFuaWZlc3Qg4oaSIHRoZQogIGxvZ2luIHBhZ2UgcmV0dXJucyBIVFRQIDUwMC4KLSBPbiB0aGUgYnJva2VuIGJhY2tlbmQgdGhlIGhlYWx0aGNoZWNrIGNvbW1hbmQgKHdoYXQgRG9ja2VyIHJ1bnMpIHJldHVybnMKICAqKmV4aXQgMCB3aXRob3V0IGAtTGAqKiAobWlzc2VzIGl0KSBhbmQgKipleGl0IDEgd2l0aCBgLUxgKiogKGNhdGNoZXMgaXQpLgotIEEgbm9uLXplcm8gaGVhbHRoY2hlY2sgbWFya3MgdGhlIGNvbnRhaW5lciBgdW5oZWFsdGh5YDogY29uZmlybWVkIGluIGFuCiAgZXF1aXZhbGVudCBydW4gd2hlcmUgdGhlIGFmZmVjdGVkIGJhY2tlbmQgd2VudCBgdW5oZWFsdGh5YCB3aGlsZSB0aGUgb3RoZXIgdHdvCiAgc3RheWVkIGBoZWFsdGh5YCwgYW5kIHJlY292ZXJlZCBvbmNlIHRoZSBtYW5pZmVzdCB3YXMgcmVzdG9yZWQuCgrwn6SWIEdlbmVyYXRlZCB3aXRoIFtDbGF1ZGUgQ29kZV0oaHR0cHM6Ly9jbGF1ZGUuY29tL2NsYXVkZS1jb2RlKQ==
      patchset: 67159f9790a7162263ceab2c9e282f9ec6009e68
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 019f0261a526db7d8989ff1abefc2299a8c0ffbc
          trusted/project_1/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 038dd8b856c62af4433c8477c5cb3d0480847059
          trusted/project_2/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 0c74c57cedff2b36bb37ca68a5338d1c49991496
          untrusted/project_0/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 0c74c57cedff2b36bb37ca68a5338d1c49991496
          untrusted/project_1/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 019f0261a526db7d8989ff1abefc2299a8c0ffbc
          untrusted/project_2/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 038dd8b856c62af4433c8477c5cb3d0480847059
        playbooks:
        - path: untrusted/project_0/github.com/osism/zuul-jobs/playbooks/yamllint/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: null
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/osism/container-image-kolla-ansible
        name: osism/container-image-kolla-ansible
        short_name: container-image-kolla-ansible
        src_dir: src/github.com/osism/container-image-kolla-ansible
      projects:
        github.com/osism/container-image-kolla-ansible:
          canonical_hostname: github.com
          canonical_name: github.com/osism/container-image-kolla-ansible
          checkout: main
          checkout_description: zuul branch
          commit: 51d6b61055c7678e65327179a16e5f36eb6c1e58
          name: osism/container-image-kolla-ansible
          required: false
          short_name: container-image-kolla-ansible
          src_dir: src/github.com/osism/container-image-kolla-ansible
      ref: refs/pull/911/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
