all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fefa:a72a
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 027c94bd-1fa4-4ab5-9bab-b448dad08f1c
        host_id: ec4f54fa666de9bc553bc59c41683f12345b665d0b1af00d715e7318
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fefa:a72a
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.0.101
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.42
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fefa:a72a
        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 mypy explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#42>'
      - '<Job mypy explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: e5a7708fe2994cb0ab250ebb711ba4b9
      build_refs:
      - branch: main
        change: '2440'
        change_message: "reconciler: drain stdout to avoid deadlock\n\n## Problem\n\n`run_on_change()`
          starts `/run.sh` with `stdout=subprocess.PIPE` but never reads the pipe
          and calls `p.wait()` with no timeout. `run()` has the same undrained pipe
          on the `publish=False` path. Because the pipe is never consumed, a `/run.sh`
          that writes more than the OS pipe buffer (~64 KB) blocks on write while
          the parent blocks forever on `wait()` \u2014 deadlocking the reconciler
          worker (`run_on_change` unbounded; `run(publish=False)` bounded only by
          its `wait(timeout=60)`, so it errors rather than hangs).\n\n## Fix\n\n-
          **`run()`** \u2014 always drain stdout by moving the read loop back outside
          the `publish` guard; forwarding via `push_task_output`/`finish_task_output`
          stays gated on `publish`. This matches the always-drain pattern used by
          `run_ansible_in_environment` and `run_command`.\n- **`run_on_change()`**
          \u2014 drain stdout into the log (the task publishes nowhere) and add `wait(timeout=60)`
          as a reap backstop, matching `run()`.\n\n`stdout=subprocess.PIPE` is retained
          on both paths \u2014 the pipe is required in order to drain it.\n\n## Tests\n\nThe
          two affected unit tests now feed real byte streams through the production
          `TextIOWrapper` drain loop and assert the pipe is consumed, rather than
          pinning the previous undrained call shape.\n\n- Target module: 47 passed\n-
          Full suite: 1572 passed\n- `black --check` and `flake8`: clean\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2440
        commit_id: f7d04d5e4aaadb319875da2458bc149da10f1ddf
        patchset: f7d04d5e4aaadb319875da2458bc149da10f1ddf
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          name: osism/python-osism
          short_name: python-osism
        src_dir: src/github.com/osism/python-osism
        topic: null
      buildset: 4c0483007a914d2294154532851b2788
      buildset_refs:
      - branch: main
        change: '2440'
        change_message: "reconciler: drain stdout to avoid deadlock\n\n## Problem\n\n`run_on_change()`
          starts `/run.sh` with `stdout=subprocess.PIPE` but never reads the pipe
          and calls `p.wait()` with no timeout. `run()` has the same undrained pipe
          on the `publish=False` path. Because the pipe is never consumed, a `/run.sh`
          that writes more than the OS pipe buffer (~64 KB) blocks on write while
          the parent blocks forever on `wait()` \u2014 deadlocking the reconciler
          worker (`run_on_change` unbounded; `run(publish=False)` bounded only by
          its `wait(timeout=60)`, so it errors rather than hangs).\n\n## Fix\n\n-
          **`run()`** \u2014 always drain stdout by moving the read loop back outside
          the `publish` guard; forwarding via `push_task_output`/`finish_task_output`
          stays gated on `publish`. This matches the always-drain pattern used by
          `run_ansible_in_environment` and `run_command`.\n- **`run_on_change()`**
          \u2014 drain stdout into the log (the task publishes nowhere) and add `wait(timeout=60)`
          as a reap backstop, matching `run()`.\n\n`stdout=subprocess.PIPE` is retained
          on both paths \u2014 the pipe is required in order to drain it.\n\n## Tests\n\nThe
          two affected unit tests now feed real byte streams through the production
          `TextIOWrapper` drain loop and assert the pipe is consumed, rather than
          pinning the previous undrained call shape.\n\n- Target module: 47 passed\n-
          Full suite: 1572 passed\n- `black --check` and `flake8`: clean\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2440
        commit_id: f7d04d5e4aaadb319875da2458bc149da10f1ddf
        patchset: f7d04d5e4aaadb319875da2458bc149da10f1ddf
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          name: osism/python-osism
          short_name: python-osism
        src_dir: src/github.com/osism/python-osism
        topic: null
      change: '2440'
      change_message: "reconciler: drain stdout to avoid deadlock\n\n## Problem\n\n`run_on_change()`
        starts `/run.sh` with `stdout=subprocess.PIPE` but never reads the pipe and
        calls `p.wait()` with no timeout. `run()` has the same undrained pipe on the
        `publish=False` path. Because the pipe is never consumed, a `/run.sh` that
        writes more than the OS pipe buffer (~64 KB) blocks on write while the parent
        blocks forever on `wait()` \u2014 deadlocking the reconciler worker (`run_on_change`
        unbounded; `run(publish=False)` bounded only by its `wait(timeout=60)`, so
        it errors rather than hangs).\n\n## Fix\n\n- **`run()`** \u2014 always drain
        stdout by moving the read loop back outside the `publish` guard; forwarding
        via `push_task_output`/`finish_task_output` stays gated on `publish`. This
        matches the always-drain pattern used by `run_ansible_in_environment` and
        `run_command`.\n- **`run_on_change()`** \u2014 drain stdout into the log (the
        task publishes nowhere) and add `wait(timeout=60)` as a reap backstop, matching
        `run()`.\n\n`stdout=subprocess.PIPE` is retained on both paths \u2014 the
        pipe is required in order to drain it.\n\n## Tests\n\nThe two affected unit
        tests now feed real byte streams through the production `TextIOWrapper` drain
        loop and assert the pipe is consumed, rather than pinning the previous undrained
        call shape.\n\n- Target module: 47 passed\n- Full suite: 1572 passed\n- `black
        --check` and `flake8`: clean\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)"
      change_url: https://github.com/osism/python-osism/pull/2440
      child_jobs: []
      commit_id: f7d04d5e4aaadb319875da2458bc149da10f1ddf
      event_id: 0ef600f0-7925-11f1-84e3-b2c6f3452f0b
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/e5a7708fe2994cb0ab250ebb711ba4b9/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/e5a7708fe2994cb0ab250ebb711ba4b9/work/logs
        result_data_file: /var/lib/zuul/builds/e5a7708fe2994cb0ab250ebb711ba4b9/work/results.json
        src_root: /var/lib/zuul/builds/e5a7708fe2994cb0ab250ebb711ba4b9/work/src
        work_root: /var/lib/zuul/builds/e5a7708fe2994cb0ab250ebb711ba4b9/work
      include_vars: []
      items:
      - branch: main
        change: '2440'
        change_message: "reconciler: drain stdout to avoid deadlock\n\n## Problem\n\n`run_on_change()`
          starts `/run.sh` with `stdout=subprocess.PIPE` but never reads the pipe
          and calls `p.wait()` with no timeout. `run()` has the same undrained pipe
          on the `publish=False` path. Because the pipe is never consumed, a `/run.sh`
          that writes more than the OS pipe buffer (~64 KB) blocks on write while
          the parent blocks forever on `wait()` \u2014 deadlocking the reconciler
          worker (`run_on_change` unbounded; `run(publish=False)` bounded only by
          its `wait(timeout=60)`, so it errors rather than hangs).\n\n## Fix\n\n-
          **`run()`** \u2014 always drain stdout by moving the read loop back outside
          the `publish` guard; forwarding via `push_task_output`/`finish_task_output`
          stays gated on `publish`. This matches the always-drain pattern used by
          `run_ansible_in_environment` and `run_command`.\n- **`run_on_change()`**
          \u2014 drain stdout into the log (the task publishes nowhere) and add `wait(timeout=60)`
          as a reap backstop, matching `run()`.\n\n`stdout=subprocess.PIPE` is retained
          on both paths \u2014 the pipe is required in order to drain it.\n\n## Tests\n\nThe
          two affected unit tests now feed real byte streams through the production
          `TextIOWrapper` drain loop and assert the pipe is consumed, rather than
          pinning the previous undrained call shape.\n\n- Target module: 47 passed\n-
          Full suite: 1572 passed\n- `black --check` and `flake8`: clean\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2440
        commit_id: f7d04d5e4aaadb319875da2458bc149da10f1ddf
        patchset: f7d04d5e4aaadb319875da2458bc149da10f1ddf
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          name: osism/python-osism
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
        topic: null
      job: mypy
      jobtags: []
      max_attempts: 3
      message: cmVjb25jaWxlcjogZHJhaW4gc3Rkb3V0IHRvIGF2b2lkIGRlYWRsb2NrCgojIyBQcm9ibGVtCgpgcnVuX29uX2NoYW5nZSgpYCBzdGFydHMgYC9ydW4uc2hgIHdpdGggYHN0ZG91dD1zdWJwcm9jZXNzLlBJUEVgIGJ1dCBuZXZlciByZWFkcyB0aGUgcGlwZSBhbmQgY2FsbHMgYHAud2FpdCgpYCB3aXRoIG5vIHRpbWVvdXQuIGBydW4oKWAgaGFzIHRoZSBzYW1lIHVuZHJhaW5lZCBwaXBlIG9uIHRoZSBgcHVibGlzaD1GYWxzZWAgcGF0aC4gQmVjYXVzZSB0aGUgcGlwZSBpcyBuZXZlciBjb25zdW1lZCwgYSBgL3J1bi5zaGAgdGhhdCB3cml0ZXMgbW9yZSB0aGFuIHRoZSBPUyBwaXBlIGJ1ZmZlciAofjY0IEtCKSBibG9ja3Mgb24gd3JpdGUgd2hpbGUgdGhlIHBhcmVudCBibG9ja3MgZm9yZXZlciBvbiBgd2FpdCgpYCDigJQgZGVhZGxvY2tpbmcgdGhlIHJlY29uY2lsZXIgd29ya2VyIChgcnVuX29uX2NoYW5nZWAgdW5ib3VuZGVkOyBgcnVuKHB1Ymxpc2g9RmFsc2UpYCBib3VuZGVkIG9ubHkgYnkgaXRzIGB3YWl0KHRpbWVvdXQ9NjApYCwgc28gaXQgZXJyb3JzIHJhdGhlciB0aGFuIGhhbmdzKS4KCiMjIEZpeAoKLSAqKmBydW4oKWAqKiDigJQgYWx3YXlzIGRyYWluIHN0ZG91dCBieSBtb3ZpbmcgdGhlIHJlYWQgbG9vcCBiYWNrIG91dHNpZGUgdGhlIGBwdWJsaXNoYCBndWFyZDsgZm9yd2FyZGluZyB2aWEgYHB1c2hfdGFza19vdXRwdXRgL2BmaW5pc2hfdGFza19vdXRwdXRgIHN0YXlzIGdhdGVkIG9uIGBwdWJsaXNoYC4gVGhpcyBtYXRjaGVzIHRoZSBhbHdheXMtZHJhaW4gcGF0dGVybiB1c2VkIGJ5IGBydW5fYW5zaWJsZV9pbl9lbnZpcm9ubWVudGAgYW5kIGBydW5fY29tbWFuZGAuCi0gKipgcnVuX29uX2NoYW5nZSgpYCoqIOKAlCBkcmFpbiBzdGRvdXQgaW50byB0aGUgbG9nICh0aGUgdGFzayBwdWJsaXNoZXMgbm93aGVyZSkgYW5kIGFkZCBgd2FpdCh0aW1lb3V0PTYwKWAgYXMgYSByZWFwIGJhY2tzdG9wLCBtYXRjaGluZyBgcnVuKClgLgoKYHN0ZG91dD1zdWJwcm9jZXNzLlBJUEVgIGlzIHJldGFpbmVkIG9uIGJvdGggcGF0aHMg4oCUIHRoZSBwaXBlIGlzIHJlcXVpcmVkIGluIG9yZGVyIHRvIGRyYWluIGl0LgoKIyMgVGVzdHMKClRoZSB0d28gYWZmZWN0ZWQgdW5pdCB0ZXN0cyBub3cgZmVlZCByZWFsIGJ5dGUgc3RyZWFtcyB0aHJvdWdoIHRoZSBwcm9kdWN0aW9uIGBUZXh0SU9XcmFwcGVyYCBkcmFpbiBsb29wIGFuZCBhc3NlcnQgdGhlIHBpcGUgaXMgY29uc3VtZWQsIHJhdGhlciB0aGFuIHBpbm5pbmcgdGhlIHByZXZpb3VzIHVuZHJhaW5lZCBjYWxsIHNoYXBlLgoKLSBUYXJnZXQgbW9kdWxlOiA0NyBwYXNzZWQKLSBGdWxsIHN1aXRlOiAxNTcyIHBhc3NlZAotIGBibGFjayAtLWNoZWNrYCBhbmQgYGZsYWtlOGA6IGNsZWFuCgrwn6SWIEdlbmVyYXRlZCB3aXRoIFtDbGF1ZGUgQ29kZV0oaHR0cHM6Ly9jbGF1ZGUuY29tL2NsYXVkZS1jb2RlKQ==
      patchset: f7d04d5e4aaadb319875da2458bc149da10f1ddf
      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/mypy/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/python-osism
        name: osism/python-osism
        short_name: python-osism
        src_dir: src/github.com/osism/python-osism
      projects:
        github.com/osism/python-osism:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          checkout: main
          checkout_description: zuul branch
          commit: 826e36ae75be17ca48269c1a0ae4a73cc3bbb296
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2440/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
