all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe1a:d01e
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 4f266143-7b7d-4173-81b6-02773c96a4fb
        host_id: 4ba4344415ca7057d9956ea5de826bbc0b830981e82c0e0f191fa07b
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe1a:d01e
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.10
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.120
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe1a:d01e
        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/metalbox/.zuul.yaml@main#231>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: c31705132636405b85abe1d98da52eb8
      build_refs:
      - branch: main
        change: '372'
        change_message: "mirror: fix correctness defects in create-mirror.sh\n\nPart
          of:\n\n- osism/metalbox#375\n\n---\n\nSixteen defect fixes in `zuul/files/create-mirror.sh`,
          one concern per commit.\nNo behaviour policy changes \u2014 the run still
          builds and publishes whatever it\nmanaged to download. Making it refuse
          to do that is #373, on top of this.\n\nFound while investigating the 2026-08-01
          `metalbox-mirror-debian-packages-publish`\nfailure (`rc=25` on the mirror
          script, 47m39s, 60 days clean before it). The\nimmediate cause was one transient
          upstream fault, but almost every defect below\nis visible by reading the
          script and predates the incident.\n\n### Silently wrong output\n\n| Commit
          | Effect |\n|---|---|\n| match package names literally, not as regex | package
          names were interpolated into an awk regex (`$1 ~ \"^Package: \" pkg \"$\"`),
          so `c++` parsed as a quantifier. **`libstdc++6` has never been in the published
          mirror** \u2014 it appeared every run as `Failed packages: libstdc++6`,
          which reads like an upstream problem |\n| publish cached indexes atomically
          | `cache_packages_file()` downloaded straight into the path it tests with
          `-f`, so concurrent lookup workers read a truncated index and reported good
          packages as not found. Measured 1\u20135 packages lost per cold-cache round
          |\n| strip multiarch qualifiers from dependencies | `perl:any`, `python3:any`
          never resolved |\n\n`libstdc++6` turned out to be harmless in practice:
          `apt` itself declares\n`Depends: libstdc++6 (>= 13.1)`, so every noble host
          already has it before the\nmirror is consulted. The latent case is a mirrored
          package needing a newer\nversion than the base image ships.\n\n### The 2026-08-01
          failure path\n\n| Commit | Effect |\n|---|---|\n| drop partial files on
          download error | the empty-file branch of `parallel_download_single()` did
          `rm -f`; the download-error branch did not. `wget -O` truncates before transferring,
          so each failure left a short non-empty file that every later check (`[[
          -f && -s ]]`) accepted |\n| retry in rounds, not by failure count | `${#failed_urls[@]}
          -le $MAX_RETRY_COUNT` \u2014 more failures meant *less* retry. 48 failures
          exceeded the cap of 20, so retry was skipped entirely |\n| verify downloads
          against index checksums | SHA256/Size harvested from the indexes |\n| key
          expected checksums by URL, not basename | hardening; no collisions exist
          in the configured repos today |\n\n### The run reported success regardless\n\n|
          Commit | Effect |\n|---|---|\n| keep dpkg-scanpackages diagnostics | `2>/dev/null`
          discarded the only message naming the offending file. `rc=25` carries no
          information on its own \u2014 every `dpkg-scanpackages` error path exits
          25 |\n| populate the failed-download list | `FAILED_URLS` was declared and
          read by two reports but never assigned. Both reports were dead code |\n|
          report direct-URL download failures | silent exit 1/2 mid-run |\n| report
          unreachable package indexes | a dead mirror looked like missing packages
          |\n| end the log with the run's outcome | the `EXIT` trap printed `SUCCESS:
          Cleanup completed` as the last line even on failure |\n\n### Bash defects\n\n|
          Commit | Effect |\n|---|---|\n| remove the ineffective metadata cache |
          `export -A` cannot export an associative array; the cache never hit |\n|
          stop leaking IFS in dependency resolution | `IFS=$'\\n' arr=(...)` is a
          persistent assignment, not a prefix |\n| track package sets in associative
          arrays | seven O(n\xB2) regex scans over flattened arrays |\n| index dependencies
          once instead of per package | 99 GB of gunzip collapsed to one pass; 11\u201312
          min \u2192 ~1 min |\n\n### Verification\n\n- every commit parses under `bash
          -n` individually\n- shellcheck 80 \u2192 53 findings, no new kinds (it had
          independently flagged the\n  array-flattening, regex-quoting and subshell-locality
          classes)\n- full old-vs-new run against `archive.ubuntu.com`: old 981 debs
          / 981 indexed,\n  new 982 / 982, zero invalid either side, `libstdc++6`
          present only in the new one\n\nNot yet exercised in CI \u2014 the check
          job runs on changes to this file, so this PR\nis its first real run.\n\n"
        change_url: https://github.com/osism/metalbox/pull/372
        commit_id: 1aa157ca4a88b1b7a2b65e78daeac705448d8225
        patchset: 1aa157ca4a88b1b7a2b65e78daeac705448d8225
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/metalbox
          name: osism/metalbox
          short_name: metalbox
        src_dir: src/github.com/osism/metalbox
        topic: null
      buildset: 6ca6eca0477d465cbc003efb3424f96e
      buildset_refs:
      - branch: main
        change: '372'
        change_message: "mirror: fix correctness defects in create-mirror.sh\n\nPart
          of:\n\n- osism/metalbox#375\n\n---\n\nSixteen defect fixes in `zuul/files/create-mirror.sh`,
          one concern per commit.\nNo behaviour policy changes \u2014 the run still
          builds and publishes whatever it\nmanaged to download. Making it refuse
          to do that is #373, on top of this.\n\nFound while investigating the 2026-08-01
          `metalbox-mirror-debian-packages-publish`\nfailure (`rc=25` on the mirror
          script, 47m39s, 60 days clean before it). The\nimmediate cause was one transient
          upstream fault, but almost every defect below\nis visible by reading the
          script and predates the incident.\n\n### Silently wrong output\n\n| Commit
          | Effect |\n|---|---|\n| match package names literally, not as regex | package
          names were interpolated into an awk regex (`$1 ~ \"^Package: \" pkg \"$\"`),
          so `c++` parsed as a quantifier. **`libstdc++6` has never been in the published
          mirror** \u2014 it appeared every run as `Failed packages: libstdc++6`,
          which reads like an upstream problem |\n| publish cached indexes atomically
          | `cache_packages_file()` downloaded straight into the path it tests with
          `-f`, so concurrent lookup workers read a truncated index and reported good
          packages as not found. Measured 1\u20135 packages lost per cold-cache round
          |\n| strip multiarch qualifiers from dependencies | `perl:any`, `python3:any`
          never resolved |\n\n`libstdc++6` turned out to be harmless in practice:
          `apt` itself declares\n`Depends: libstdc++6 (>= 13.1)`, so every noble host
          already has it before the\nmirror is consulted. The latent case is a mirrored
          package needing a newer\nversion than the base image ships.\n\n### The 2026-08-01
          failure path\n\n| Commit | Effect |\n|---|---|\n| drop partial files on
          download error | the empty-file branch of `parallel_download_single()` did
          `rm -f`; the download-error branch did not. `wget -O` truncates before transferring,
          so each failure left a short non-empty file that every later check (`[[
          -f && -s ]]`) accepted |\n| retry in rounds, not by failure count | `${#failed_urls[@]}
          -le $MAX_RETRY_COUNT` \u2014 more failures meant *less* retry. 48 failures
          exceeded the cap of 20, so retry was skipped entirely |\n| verify downloads
          against index checksums | SHA256/Size harvested from the indexes |\n| key
          expected checksums by URL, not basename | hardening; no collisions exist
          in the configured repos today |\n\n### The run reported success regardless\n\n|
          Commit | Effect |\n|---|---|\n| keep dpkg-scanpackages diagnostics | `2>/dev/null`
          discarded the only message naming the offending file. `rc=25` carries no
          information on its own \u2014 every `dpkg-scanpackages` error path exits
          25 |\n| populate the failed-download list | `FAILED_URLS` was declared and
          read by two reports but never assigned. Both reports were dead code |\n|
          report direct-URL download failures | silent exit 1/2 mid-run |\n| report
          unreachable package indexes | a dead mirror looked like missing packages
          |\n| end the log with the run's outcome | the `EXIT` trap printed `SUCCESS:
          Cleanup completed` as the last line even on failure |\n\n### Bash defects\n\n|
          Commit | Effect |\n|---|---|\n| remove the ineffective metadata cache |
          `export -A` cannot export an associative array; the cache never hit |\n|
          stop leaking IFS in dependency resolution | `IFS=$'\\n' arr=(...)` is a
          persistent assignment, not a prefix |\n| track package sets in associative
          arrays | seven O(n\xB2) regex scans over flattened arrays |\n| index dependencies
          once instead of per package | 99 GB of gunzip collapsed to one pass; 11\u201312
          min \u2192 ~1 min |\n\n### Verification\n\n- every commit parses under `bash
          -n` individually\n- shellcheck 80 \u2192 53 findings, no new kinds (it had
          independently flagged the\n  array-flattening, regex-quoting and subshell-locality
          classes)\n- full old-vs-new run against `archive.ubuntu.com`: old 981 debs
          / 981 indexed,\n  new 982 / 982, zero invalid either side, `libstdc++6`
          present only in the new one\n\nNot yet exercised in CI \u2014 the check
          job runs on changes to this file, so this PR\nis its first real run.\n\n"
        change_url: https://github.com/osism/metalbox/pull/372
        commit_id: 1aa157ca4a88b1b7a2b65e78daeac705448d8225
        patchset: 1aa157ca4a88b1b7a2b65e78daeac705448d8225
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/metalbox
          name: osism/metalbox
          short_name: metalbox
        src_dir: src/github.com/osism/metalbox
        topic: null
      change: '372'
      change_message: "mirror: fix correctness defects in create-mirror.sh\n\nPart
        of:\n\n- osism/metalbox#375\n\n---\n\nSixteen defect fixes in `zuul/files/create-mirror.sh`,
        one concern per commit.\nNo behaviour policy changes \u2014 the run still
        builds and publishes whatever it\nmanaged to download. Making it refuse to
        do that is #373, on top of this.\n\nFound while investigating the 2026-08-01
        `metalbox-mirror-debian-packages-publish`\nfailure (`rc=25` on the mirror
        script, 47m39s, 60 days clean before it). The\nimmediate cause was one transient
        upstream fault, but almost every defect below\nis visible by reading the script
        and predates the incident.\n\n### Silently wrong output\n\n| Commit | Effect
        |\n|---|---|\n| match package names literally, not as regex | package names
        were interpolated into an awk regex (`$1 ~ \"^Package: \" pkg \"$\"`), so
        `c++` parsed as a quantifier. **`libstdc++6` has never been in the published
        mirror** \u2014 it appeared every run as `Failed packages: libstdc++6`, which
        reads like an upstream problem |\n| publish cached indexes atomically | `cache_packages_file()`
        downloaded straight into the path it tests with `-f`, so concurrent lookup
        workers read a truncated index and reported good packages as not found. Measured
        1\u20135 packages lost per cold-cache round |\n| strip multiarch qualifiers
        from dependencies | `perl:any`, `python3:any` never resolved |\n\n`libstdc++6`
        turned out to be harmless in practice: `apt` itself declares\n`Depends: libstdc++6
        (>= 13.1)`, so every noble host already has it before the\nmirror is consulted.
        The latent case is a mirrored package needing a newer\nversion than the base
        image ships.\n\n### The 2026-08-01 failure path\n\n| Commit | Effect |\n|---|---|\n|
        drop partial files on download error | the empty-file branch of `parallel_download_single()`
        did `rm -f`; the download-error branch did not. `wget -O` truncates before
        transferring, so each failure left a short non-empty file that every later
        check (`[[ -f && -s ]]`) accepted |\n| retry in rounds, not by failure count
        | `${#failed_urls[@]} -le $MAX_RETRY_COUNT` \u2014 more failures meant *less*
        retry. 48 failures exceeded the cap of 20, so retry was skipped entirely |\n|
        verify downloads against index checksums | SHA256/Size harvested from the
        indexes |\n| key expected checksums by URL, not basename | hardening; no collisions
        exist in the configured repos today |\n\n### The run reported success regardless\n\n|
        Commit | Effect |\n|---|---|\n| keep dpkg-scanpackages diagnostics | `2>/dev/null`
        discarded the only message naming the offending file. `rc=25` carries no information
        on its own \u2014 every `dpkg-scanpackages` error path exits 25 |\n| populate
        the failed-download list | `FAILED_URLS` was declared and read by two reports
        but never assigned. Both reports were dead code |\n| report direct-URL download
        failures | silent exit 1/2 mid-run |\n| report unreachable package indexes
        | a dead mirror looked like missing packages |\n| end the log with the run's
        outcome | the `EXIT` trap printed `SUCCESS: Cleanup completed` as the last
        line even on failure |\n\n### Bash defects\n\n| Commit | Effect |\n|---|---|\n|
        remove the ineffective metadata cache | `export -A` cannot export an associative
        array; the cache never hit |\n| stop leaking IFS in dependency resolution
        | `IFS=$'\\n' arr=(...)` is a persistent assignment, not a prefix |\n| track
        package sets in associative arrays | seven O(n\xB2) regex scans over flattened
        arrays |\n| index dependencies once instead of per package | 99 GB of gunzip
        collapsed to one pass; 11\u201312 min \u2192 ~1 min |\n\n### Verification\n\n-
        every commit parses under `bash -n` individually\n- shellcheck 80 \u2192 53
        findings, no new kinds (it had independently flagged the\n  array-flattening,
        regex-quoting and subshell-locality classes)\n- full old-vs-new run against
        `archive.ubuntu.com`: old 981 debs / 981 indexed,\n  new 982 / 982, zero invalid
        either side, `libstdc++6` present only in the new one\n\nNot yet exercised
        in CI \u2014 the check job runs on changes to this file, so this PR\nis its
        first real run.\n\n"
      change_url: https://github.com/osism/metalbox/pull/372
      child_jobs: []
      commit_id: 1aa157ca4a88b1b7a2b65e78daeac705448d8225
      event_id: 4c6a8d70-9162-11f1-814b-9fc61a7d49fc
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/c31705132636405b85abe1d98da52eb8/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/c31705132636405b85abe1d98da52eb8/work/logs
        result_data_file: /var/lib/zuul/builds/c31705132636405b85abe1d98da52eb8/work/results.json
        src_root: /var/lib/zuul/builds/c31705132636405b85abe1d98da52eb8/work/src
        work_root: /var/lib/zuul/builds/c31705132636405b85abe1d98da52eb8/work
      include_vars: []
      items:
      - branch: main
        change: '372'
        change_message: "mirror: fix correctness defects in create-mirror.sh\n\nPart
          of:\n\n- osism/metalbox#375\n\n---\n\nSixteen defect fixes in `zuul/files/create-mirror.sh`,
          one concern per commit.\nNo behaviour policy changes \u2014 the run still
          builds and publishes whatever it\nmanaged to download. Making it refuse
          to do that is #373, on top of this.\n\nFound while investigating the 2026-08-01
          `metalbox-mirror-debian-packages-publish`\nfailure (`rc=25` on the mirror
          script, 47m39s, 60 days clean before it). The\nimmediate cause was one transient
          upstream fault, but almost every defect below\nis visible by reading the
          script and predates the incident.\n\n### Silently wrong output\n\n| Commit
          | Effect |\n|---|---|\n| match package names literally, not as regex | package
          names were interpolated into an awk regex (`$1 ~ \"^Package: \" pkg \"$\"`),
          so `c++` parsed as a quantifier. **`libstdc++6` has never been in the published
          mirror** \u2014 it appeared every run as `Failed packages: libstdc++6`,
          which reads like an upstream problem |\n| publish cached indexes atomically
          | `cache_packages_file()` downloaded straight into the path it tests with
          `-f`, so concurrent lookup workers read a truncated index and reported good
          packages as not found. Measured 1\u20135 packages lost per cold-cache round
          |\n| strip multiarch qualifiers from dependencies | `perl:any`, `python3:any`
          never resolved |\n\n`libstdc++6` turned out to be harmless in practice:
          `apt` itself declares\n`Depends: libstdc++6 (>= 13.1)`, so every noble host
          already has it before the\nmirror is consulted. The latent case is a mirrored
          package needing a newer\nversion than the base image ships.\n\n### The 2026-08-01
          failure path\n\n| Commit | Effect |\n|---|---|\n| drop partial files on
          download error | the empty-file branch of `parallel_download_single()` did
          `rm -f`; the download-error branch did not. `wget -O` truncates before transferring,
          so each failure left a short non-empty file that every later check (`[[
          -f && -s ]]`) accepted |\n| retry in rounds, not by failure count | `${#failed_urls[@]}
          -le $MAX_RETRY_COUNT` \u2014 more failures meant *less* retry. 48 failures
          exceeded the cap of 20, so retry was skipped entirely |\n| verify downloads
          against index checksums | SHA256/Size harvested from the indexes |\n| key
          expected checksums by URL, not basename | hardening; no collisions exist
          in the configured repos today |\n\n### The run reported success regardless\n\n|
          Commit | Effect |\n|---|---|\n| keep dpkg-scanpackages diagnostics | `2>/dev/null`
          discarded the only message naming the offending file. `rc=25` carries no
          information on its own \u2014 every `dpkg-scanpackages` error path exits
          25 |\n| populate the failed-download list | `FAILED_URLS` was declared and
          read by two reports but never assigned. Both reports were dead code |\n|
          report direct-URL download failures | silent exit 1/2 mid-run |\n| report
          unreachable package indexes | a dead mirror looked like missing packages
          |\n| end the log with the run's outcome | the `EXIT` trap printed `SUCCESS:
          Cleanup completed` as the last line even on failure |\n\n### Bash defects\n\n|
          Commit | Effect |\n|---|---|\n| remove the ineffective metadata cache |
          `export -A` cannot export an associative array; the cache never hit |\n|
          stop leaking IFS in dependency resolution | `IFS=$'\\n' arr=(...)` is a
          persistent assignment, not a prefix |\n| track package sets in associative
          arrays | seven O(n\xB2) regex scans over flattened arrays |\n| index dependencies
          once instead of per package | 99 GB of gunzip collapsed to one pass; 11\u201312
          min \u2192 ~1 min |\n\n### Verification\n\n- every commit parses under `bash
          -n` individually\n- shellcheck 80 \u2192 53 findings, no new kinds (it had
          independently flagged the\n  array-flattening, regex-quoting and subshell-locality
          classes)\n- full old-vs-new run against `archive.ubuntu.com`: old 981 debs
          / 981 indexed,\n  new 982 / 982, zero invalid either side, `libstdc++6`
          present only in the new one\n\nNot yet exercised in CI \u2014 the check
          job runs on changes to this file, so this PR\nis its first real run.\n\n"
        change_url: https://github.com/osism/metalbox/pull/372
        commit_id: 1aa157ca4a88b1b7a2b65e78daeac705448d8225
        patchset: 1aa157ca4a88b1b7a2b65e78daeac705448d8225
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/metalbox
          name: osism/metalbox
          short_name: metalbox
          src_dir: src/github.com/osism/metalbox
        topic: null
      job: yamllint
      jobtags: []
      max_attempts: 3
      message: bWlycm9yOiBmaXggY29ycmVjdG5lc3MgZGVmZWN0cyBpbiBjcmVhdGUtbWlycm9yLnNoCgpQYXJ0IG9mOgoKLSBvc2lzbS9tZXRhbGJveCMzNzUKCi0tLQoKU2l4dGVlbiBkZWZlY3QgZml4ZXMgaW4gYHp1dWwvZmlsZXMvY3JlYXRlLW1pcnJvci5zaGAsIG9uZSBjb25jZXJuIHBlciBjb21taXQuCk5vIGJlaGF2aW91ciBwb2xpY3kgY2hhbmdlcyDigJQgdGhlIHJ1biBzdGlsbCBidWlsZHMgYW5kIHB1Ymxpc2hlcyB3aGF0ZXZlciBpdAptYW5hZ2VkIHRvIGRvd25sb2FkLiBNYWtpbmcgaXQgcmVmdXNlIHRvIGRvIHRoYXQgaXMgIzM3Mywgb24gdG9wIG9mIHRoaXMuCgpGb3VuZCB3aGlsZSBpbnZlc3RpZ2F0aW5nIHRoZSAyMDI2LTA4LTAxIGBtZXRhbGJveC1taXJyb3ItZGViaWFuLXBhY2thZ2VzLXB1Ymxpc2hgCmZhaWx1cmUgKGByYz0yNWAgb24gdGhlIG1pcnJvciBzY3JpcHQsIDQ3bTM5cywgNjAgZGF5cyBjbGVhbiBiZWZvcmUgaXQpLiBUaGUKaW1tZWRpYXRlIGNhdXNlIHdhcyBvbmUgdHJhbnNpZW50IHVwc3RyZWFtIGZhdWx0LCBidXQgYWxtb3N0IGV2ZXJ5IGRlZmVjdCBiZWxvdwppcyB2aXNpYmxlIGJ5IHJlYWRpbmcgdGhlIHNjcmlwdCBhbmQgcHJlZGF0ZXMgdGhlIGluY2lkZW50LgoKIyMjIFNpbGVudGx5IHdyb25nIG91dHB1dAoKfCBDb21taXQgfCBFZmZlY3QgfAp8LS0tfC0tLXwKfCBtYXRjaCBwYWNrYWdlIG5hbWVzIGxpdGVyYWxseSwgbm90IGFzIHJlZ2V4IHwgcGFja2FnZSBuYW1lcyB3ZXJlIGludGVycG9sYXRlZCBpbnRvIGFuIGF3ayByZWdleCAoYCQxIH4gIl5QYWNrYWdlOiAiIHBrZyAiJCJgKSwgc28gYGMrK2AgcGFyc2VkIGFzIGEgcXVhbnRpZmllci4gKipgbGlic3RkYysrNmAgaGFzIG5ldmVyIGJlZW4gaW4gdGhlIHB1Ymxpc2hlZCBtaXJyb3IqKiDigJQgaXQgYXBwZWFyZWQgZXZlcnkgcnVuIGFzIGBGYWlsZWQgcGFja2FnZXM6IGxpYnN0ZGMrKzZgLCB3aGljaCByZWFkcyBsaWtlIGFuIHVwc3RyZWFtIHByb2JsZW0gfAp8IHB1Ymxpc2ggY2FjaGVkIGluZGV4ZXMgYXRvbWljYWxseSB8IGBjYWNoZV9wYWNrYWdlc19maWxlKClgIGRvd25sb2FkZWQgc3RyYWlnaHQgaW50byB0aGUgcGF0aCBpdCB0ZXN0cyB3aXRoIGAtZmAsIHNvIGNvbmN1cnJlbnQgbG9va3VwIHdvcmtlcnMgcmVhZCBhIHRydW5jYXRlZCBpbmRleCBhbmQgcmVwb3J0ZWQgZ29vZCBwYWNrYWdlcyBhcyBub3QgZm91bmQuIE1lYXN1cmVkIDHigJM1IHBhY2thZ2VzIGxvc3QgcGVyIGNvbGQtY2FjaGUgcm91bmQgfAp8IHN0cmlwIG11bHRpYXJjaCBxdWFsaWZpZXJzIGZyb20gZGVwZW5kZW5jaWVzIHwgYHBlcmw6YW55YCwgYHB5dGhvbjM6YW55YCBuZXZlciByZXNvbHZlZCB8CgpgbGlic3RkYysrNmAgdHVybmVkIG91dCB0byBiZSBoYXJtbGVzcyBpbiBwcmFjdGljZTogYGFwdGAgaXRzZWxmIGRlY2xhcmVzCmBEZXBlbmRzOiBsaWJzdGRjKys2ICg+PSAxMy4xKWAsIHNvIGV2ZXJ5IG5vYmxlIGhvc3QgYWxyZWFkeSBoYXMgaXQgYmVmb3JlIHRoZQptaXJyb3IgaXMgY29uc3VsdGVkLiBUaGUgbGF0ZW50IGNhc2UgaXMgYSBtaXJyb3JlZCBwYWNrYWdlIG5lZWRpbmcgYSBuZXdlcgp2ZXJzaW9uIHRoYW4gdGhlIGJhc2UgaW1hZ2Ugc2hpcHMuCgojIyMgVGhlIDIwMjYtMDgtMDEgZmFpbHVyZSBwYXRoCgp8IENvbW1pdCB8IEVmZmVjdCB8CnwtLS18LS0tfAp8IGRyb3AgcGFydGlhbCBmaWxlcyBvbiBkb3dubG9hZCBlcnJvciB8IHRoZSBlbXB0eS1maWxlIGJyYW5jaCBvZiBgcGFyYWxsZWxfZG93bmxvYWRfc2luZ2xlKClgIGRpZCBgcm0gLWZgOyB0aGUgZG93bmxvYWQtZXJyb3IgYnJhbmNoIGRpZCBub3QuIGB3Z2V0IC1PYCB0cnVuY2F0ZXMgYmVmb3JlIHRyYW5zZmVycmluZywgc28gZWFjaCBmYWlsdXJlIGxlZnQgYSBzaG9ydCBub24tZW1wdHkgZmlsZSB0aGF0IGV2ZXJ5IGxhdGVyIGNoZWNrIChgW1sgLWYgJiYgLXMgXV1gKSBhY2NlcHRlZCB8CnwgcmV0cnkgaW4gcm91bmRzLCBub3QgYnkgZmFpbHVyZSBjb3VudCB8IGAkeyNmYWlsZWRfdXJsc1tAXX0gLWxlICRNQVhfUkVUUllfQ09VTlRgIOKAlCBtb3JlIGZhaWx1cmVzIG1lYW50ICpsZXNzKiByZXRyeS4gNDggZmFpbHVyZXMgZXhjZWVkZWQgdGhlIGNhcCBvZiAyMCwgc28gcmV0cnkgd2FzIHNraXBwZWQgZW50aXJlbHkgfAp8IHZlcmlmeSBkb3dubG9hZHMgYWdhaW5zdCBpbmRleCBjaGVja3N1bXMgfCBTSEEyNTYvU2l6ZSBoYXJ2ZXN0ZWQgZnJvbSB0aGUgaW5kZXhlcyB8Cnwga2V5IGV4cGVjdGVkIGNoZWNrc3VtcyBieSBVUkwsIG5vdCBiYXNlbmFtZSB8IGhhcmRlbmluZzsgbm8gY29sbGlzaW9ucyBleGlzdCBpbiB0aGUgY29uZmlndXJlZCByZXBvcyB0b2RheSB8CgojIyMgVGhlIHJ1biByZXBvcnRlZCBzdWNjZXNzIHJlZ2FyZGxlc3MKCnwgQ29tbWl0IHwgRWZmZWN0IHwKfC0tLXwtLS18Cnwga2VlcCBkcGtnLXNjYW5wYWNrYWdlcyBkaWFnbm9zdGljcyB8IGAyPi9kZXYvbnVsbGAgZGlzY2FyZGVkIHRoZSBvbmx5IG1lc3NhZ2UgbmFtaW5nIHRoZSBvZmZlbmRpbmcgZmlsZS4gYHJjPTI1YCBjYXJyaWVzIG5vIGluZm9ybWF0aW9uIG9uIGl0cyBvd24g4oCUIGV2ZXJ5IGBkcGtnLXNjYW5wYWNrYWdlc2AgZXJyb3IgcGF0aCBleGl0cyAyNSB8CnwgcG9wdWxhdGUgdGhlIGZhaWxlZC1kb3dubG9hZCBsaXN0IHwgYEZBSUxFRF9VUkxTYCB3YXMgZGVjbGFyZWQgYW5kIHJlYWQgYnkgdHdvIHJlcG9ydHMgYnV0IG5ldmVyIGFzc2lnbmVkLiBCb3RoIHJlcG9ydHMgd2VyZSBkZWFkIGNvZGUgfAp8IHJlcG9ydCBkaXJlY3QtVVJMIGRvd25sb2FkIGZhaWx1cmVzIHwgc2lsZW50IGV4aXQgMS8yIG1pZC1ydW4gfAp8IHJlcG9ydCB1bnJlYWNoYWJsZSBwYWNrYWdlIGluZGV4ZXMgfCBhIGRlYWQgbWlycm9yIGxvb2tlZCBsaWtlIG1pc3NpbmcgcGFja2FnZXMgfAp8IGVuZCB0aGUgbG9nIHdpdGggdGhlIHJ1bidzIG91dGNvbWUgfCB0aGUgYEVYSVRgIHRyYXAgcHJpbnRlZCBgU1VDQ0VTUzogQ2xlYW51cCBjb21wbGV0ZWRgIGFzIHRoZSBsYXN0IGxpbmUgZXZlbiBvbiBmYWlsdXJlIHwKCiMjIyBCYXNoIGRlZmVjdHMKCnwgQ29tbWl0IHwgRWZmZWN0IHwKfC0tLXwtLS18CnwgcmVtb3ZlIHRoZSBpbmVmZmVjdGl2ZSBtZXRhZGF0YSBjYWNoZSB8IGBleHBvcnQgLUFgIGNhbm5vdCBleHBvcnQgYW4gYXNzb2NpYXRpdmUgYXJyYXk7IHRoZSBjYWNoZSBuZXZlciBoaXQgfAp8IHN0b3AgbGVha2luZyBJRlMgaW4gZGVwZW5kZW5jeSByZXNvbHV0aW9uIHwgYElGUz0kJ1xuJyBhcnI9KC4uLilgIGlzIGEgcGVyc2lzdGVudCBhc3NpZ25tZW50LCBub3QgYSBwcmVmaXggfAp8IHRyYWNrIHBhY2thZ2Ugc2V0cyBpbiBhc3NvY2lhdGl2ZSBhcnJheXMgfCBzZXZlbiBPKG7CsikgcmVnZXggc2NhbnMgb3ZlciBmbGF0dGVuZWQgYXJyYXlzIHwKfCBpbmRleCBkZXBlbmRlbmNpZXMgb25jZSBpbnN0ZWFkIG9mIHBlciBwYWNrYWdlIHwgOTkgR0Igb2YgZ3VuemlwIGNvbGxhcHNlZCB0byBvbmUgcGFzczsgMTHigJMxMiBtaW4g4oaSIH4xIG1pbiB8CgojIyMgVmVyaWZpY2F0aW9uCgotIGV2ZXJ5IGNvbW1pdCBwYXJzZXMgdW5kZXIgYGJhc2ggLW5gIGluZGl2aWR1YWxseQotIHNoZWxsY2hlY2sgODAg4oaSIDUzIGZpbmRpbmdzLCBubyBuZXcga2luZHMgKGl0IGhhZCBpbmRlcGVuZGVudGx5IGZsYWdnZWQgdGhlCiAgYXJyYXktZmxhdHRlbmluZywgcmVnZXgtcXVvdGluZyBhbmQgc3Vic2hlbGwtbG9jYWxpdHkgY2xhc3NlcykKLSBmdWxsIG9sZC12cy1uZXcgcnVuIGFnYWluc3QgYGFyY2hpdmUudWJ1bnR1LmNvbWA6IG9sZCA5ODEgZGVicyAvIDk4MSBpbmRleGVkLAogIG5ldyA5ODIgLyA5ODIsIHplcm8gaW52YWxpZCBlaXRoZXIgc2lkZSwgYGxpYnN0ZGMrKzZgIHByZXNlbnQgb25seSBpbiB0aGUgbmV3IG9uZQoKTm90IHlldCBleGVyY2lzZWQgaW4gQ0kg4oCUIHRoZSBjaGVjayBqb2IgcnVucyBvbiBjaGFuZ2VzIHRvIHRoaXMgZmlsZSwgc28gdGhpcyBQUgppcyBpdHMgZmlyc3QgcmVhbCBydW4uCgo=
      patchset: 1aa157ca4a88b1b7a2b65e78daeac705448d8225
      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: dcb06ea8a3ad422cc9d98b376216617b2daa6a02
          untrusted/project_0/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: dcb06ea8a3ad422cc9d98b376216617b2daa6a02
          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/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: 1800
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/osism/metalbox
        name: osism/metalbox
        short_name: metalbox
        src_dir: src/github.com/osism/metalbox
      projects:
        github.com/osism/metalbox:
          canonical_hostname: github.com
          canonical_name: github.com/osism/metalbox
          checkout: main
          checkout_description: zuul branch
          commit: aa42ceeaf2379c8af667c2d7d4340e45dcd60245
          name: osism/metalbox
          required: false
          short_name: metalbox
          src_dir: src/github.com/osism/metalbox
      ref: refs/pull/372/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
