all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe0d:137a
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 17d03b85-d1a8-469f-adaf-edc272ddd8f6
        host_id: ec4f54fa666de9bc553bc59c41683f12345b665d0b1af00d715e7318
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe0d:137a
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.0.99
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.24
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe0d:137a
        region: null
        slot: null
  vars:
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-config/zuul.d/jobs.yaml@main#2>'
      - '<Job flake8 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#32>'
      - '<Job flake8 explicit: None implied: None source: osism/testbed/.zuul.yaml@main#325>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 2810994aa75940e8bcf309606085d3e3
      build_refs:
      - branch: main
        change: '2915'
        change_message: "zuul: capture glance-api log in post-run\n\n## Problem\n\nThe
          nightly testbed lanes intermittently fail when the Octavia Amphora image
          import gets stuck in Glance's `queued` state (tracked as `octavia-stuck-queued`).
          The image-import step (`osism manage image octavia`) only reports that the
          image is *stuck*; the actual reason \u2014 web-download, qcow2\u2192raw
          conversion, or Ceph write \u2014 is logged by **glance-api** itself.\n\nkolla-ansible
          configures glance-api with `log_file = /var/log/kolla/glance/glance-api.log`,
          so the import error goes to that **on-host file, not the container's stdout**.
          As a result `docker logs glance_api` does not contain it, and nothing in
          the published job output reveals the failing stage \u2014 so the failure
          can't be diagnosed from CI logs today.\n\n## Change\n\nAdds a best-effort
          post-run play (`playbooks/collect-glance-logs.yml`) that captures the tail
          of `glance-api.log` from every testbed host into the **job output**, where
          `zuul-analyzer` (and a future signature) can read it.\n\n- The Zuul orchestrator
          can only reach the **manager** directly (the nodes are on a private network),
          so the play hops through the manager and fans out to every host returned
          by `osism get hosts` \u2014 the same shape as the existing `tboperator`
          container-log collector.\n- Runs **before** the cleanup play tears the environment
          down.\n- **Never fails the job:** a missing manager address, an unreachable
          host, or an unreadable log are all tolerated (`sudo -n` so it can't hang).
          The final debug surfaces both stdout *and* stderr (with an empty-result
          fallback) so a failed SSH still shows why.\n- Wired into `abstract-testbed-deploy`'s
          post-run, so every deploy / update / upgrade lane inherits it.\n\n## Validation\n\n-
          `yamllint` clean; `ansible-lint` passes at the `production` profile.\n-
          `bash -n` on both the local wrapper and the remote (manager-side) heredoc
          body; host-extraction `awk` checked against a sample `osism get hosts` table.\n-
          Not yet exercised against a live failing build \u2014 that's the point of
          the draft; once it captures a real log, a follow-up `zuul-analyzer` signature
          can classify the failing import stage.\n\n## Notes\n\nDraft because it pairs
          with the diagnostic effort on `octavia-stuck-queued`; the capture is broad
          (all hosts, all affected lanes) but bounded (a log tail) and purely additive
          to the post-run phase.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/testbed/pull/2915
        commit_id: c53af5f7c1a8e1e6a46d5e82181eaab85d63f2be
        patchset: c53af5f7c1a8e1e6a46d5e82181eaab85d63f2be
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/testbed
          name: osism/testbed
          short_name: testbed
        src_dir: src/github.com/osism/testbed
        topic: null
      buildset: 7aaf6ca8e7784791bc11b9595b1fdc3e
      buildset_refs:
      - branch: main
        change: '2915'
        change_message: "zuul: capture glance-api log in post-run\n\n## Problem\n\nThe
          nightly testbed lanes intermittently fail when the Octavia Amphora image
          import gets stuck in Glance's `queued` state (tracked as `octavia-stuck-queued`).
          The image-import step (`osism manage image octavia`) only reports that the
          image is *stuck*; the actual reason \u2014 web-download, qcow2\u2192raw
          conversion, or Ceph write \u2014 is logged by **glance-api** itself.\n\nkolla-ansible
          configures glance-api with `log_file = /var/log/kolla/glance/glance-api.log`,
          so the import error goes to that **on-host file, not the container's stdout**.
          As a result `docker logs glance_api` does not contain it, and nothing in
          the published job output reveals the failing stage \u2014 so the failure
          can't be diagnosed from CI logs today.\n\n## Change\n\nAdds a best-effort
          post-run play (`playbooks/collect-glance-logs.yml`) that captures the tail
          of `glance-api.log` from every testbed host into the **job output**, where
          `zuul-analyzer` (and a future signature) can read it.\n\n- The Zuul orchestrator
          can only reach the **manager** directly (the nodes are on a private network),
          so the play hops through the manager and fans out to every host returned
          by `osism get hosts` \u2014 the same shape as the existing `tboperator`
          container-log collector.\n- Runs **before** the cleanup play tears the environment
          down.\n- **Never fails the job:** a missing manager address, an unreachable
          host, or an unreadable log are all tolerated (`sudo -n` so it can't hang).
          The final debug surfaces both stdout *and* stderr (with an empty-result
          fallback) so a failed SSH still shows why.\n- Wired into `abstract-testbed-deploy`'s
          post-run, so every deploy / update / upgrade lane inherits it.\n\n## Validation\n\n-
          `yamllint` clean; `ansible-lint` passes at the `production` profile.\n-
          `bash -n` on both the local wrapper and the remote (manager-side) heredoc
          body; host-extraction `awk` checked against a sample `osism get hosts` table.\n-
          Not yet exercised against a live failing build \u2014 that's the point of
          the draft; once it captures a real log, a follow-up `zuul-analyzer` signature
          can classify the failing import stage.\n\n## Notes\n\nDraft because it pairs
          with the diagnostic effort on `octavia-stuck-queued`; the capture is broad
          (all hosts, all affected lanes) but bounded (a log tail) and purely additive
          to the post-run phase.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/testbed/pull/2915
        commit_id: c53af5f7c1a8e1e6a46d5e82181eaab85d63f2be
        patchset: c53af5f7c1a8e1e6a46d5e82181eaab85d63f2be
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/testbed
          name: osism/testbed
          short_name: testbed
        src_dir: src/github.com/osism/testbed
        topic: null
      change: '2915'
      change_message: "zuul: capture glance-api log in post-run\n\n## Problem\n\nThe
        nightly testbed lanes intermittently fail when the Octavia Amphora image import
        gets stuck in Glance's `queued` state (tracked as `octavia-stuck-queued`).
        The image-import step (`osism manage image octavia`) only reports that the
        image is *stuck*; the actual reason \u2014 web-download, qcow2\u2192raw conversion,
        or Ceph write \u2014 is logged by **glance-api** itself.\n\nkolla-ansible
        configures glance-api with `log_file = /var/log/kolla/glance/glance-api.log`,
        so the import error goes to that **on-host file, not the container's stdout**.
        As a result `docker logs glance_api` does not contain it, and nothing in the
        published job output reveals the failing stage \u2014 so the failure can't
        be diagnosed from CI logs today.\n\n## Change\n\nAdds a best-effort post-run
        play (`playbooks/collect-glance-logs.yml`) that captures the tail of `glance-api.log`
        from every testbed host into the **job output**, where `zuul-analyzer` (and
        a future signature) can read it.\n\n- The Zuul orchestrator can only reach
        the **manager** directly (the nodes are on a private network), so the play
        hops through the manager and fans out to every host returned by `osism get
        hosts` \u2014 the same shape as the existing `tboperator` container-log collector.\n-
        Runs **before** the cleanup play tears the environment down.\n- **Never fails
        the job:** a missing manager address, an unreachable host, or an unreadable
        log are all tolerated (`sudo -n` so it can't hang). The final debug surfaces
        both stdout *and* stderr (with an empty-result fallback) so a failed SSH still
        shows why.\n- Wired into `abstract-testbed-deploy`'s post-run, so every deploy
        / update / upgrade lane inherits it.\n\n## Validation\n\n- `yamllint` clean;
        `ansible-lint` passes at the `production` profile.\n- `bash -n` on both the
        local wrapper and the remote (manager-side) heredoc body; host-extraction
        `awk` checked against a sample `osism get hosts` table.\n- Not yet exercised
        against a live failing build \u2014 that's the point of the draft; once it
        captures a real log, a follow-up `zuul-analyzer` signature can classify the
        failing import stage.\n\n## Notes\n\nDraft because it pairs with the diagnostic
        effort on `octavia-stuck-queued`; the capture is broad (all hosts, all affected
        lanes) but bounded (a log tail) and purely additive to the post-run phase.\n\n\U0001F916
        Generated with [Claude Code](https://claude.com/claude-code)\n"
      change_url: https://github.com/osism/testbed/pull/2915
      child_jobs: []
      commit_id: c53af5f7c1a8e1e6a46d5e82181eaab85d63f2be
      event_id: ff15aa50-72d0-11f1-89e5-87ca72c7a311
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/2810994aa75940e8bcf309606085d3e3/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/2810994aa75940e8bcf309606085d3e3/work/logs
        result_data_file: /var/lib/zuul/builds/2810994aa75940e8bcf309606085d3e3/work/results.json
        src_root: /var/lib/zuul/builds/2810994aa75940e8bcf309606085d3e3/work/src
        work_root: /var/lib/zuul/builds/2810994aa75940e8bcf309606085d3e3/work
      include_vars: []
      items:
      - branch: main
        change: '2915'
        change_message: "zuul: capture glance-api log in post-run\n\n## Problem\n\nThe
          nightly testbed lanes intermittently fail when the Octavia Amphora image
          import gets stuck in Glance's `queued` state (tracked as `octavia-stuck-queued`).
          The image-import step (`osism manage image octavia`) only reports that the
          image is *stuck*; the actual reason \u2014 web-download, qcow2\u2192raw
          conversion, or Ceph write \u2014 is logged by **glance-api** itself.\n\nkolla-ansible
          configures glance-api with `log_file = /var/log/kolla/glance/glance-api.log`,
          so the import error goes to that **on-host file, not the container's stdout**.
          As a result `docker logs glance_api` does not contain it, and nothing in
          the published job output reveals the failing stage \u2014 so the failure
          can't be diagnosed from CI logs today.\n\n## Change\n\nAdds a best-effort
          post-run play (`playbooks/collect-glance-logs.yml`) that captures the tail
          of `glance-api.log` from every testbed host into the **job output**, where
          `zuul-analyzer` (and a future signature) can read it.\n\n- The Zuul orchestrator
          can only reach the **manager** directly (the nodes are on a private network),
          so the play hops through the manager and fans out to every host returned
          by `osism get hosts` \u2014 the same shape as the existing `tboperator`
          container-log collector.\n- Runs **before** the cleanup play tears the environment
          down.\n- **Never fails the job:** a missing manager address, an unreachable
          host, or an unreadable log are all tolerated (`sudo -n` so it can't hang).
          The final debug surfaces both stdout *and* stderr (with an empty-result
          fallback) so a failed SSH still shows why.\n- Wired into `abstract-testbed-deploy`'s
          post-run, so every deploy / update / upgrade lane inherits it.\n\n## Validation\n\n-
          `yamllint` clean; `ansible-lint` passes at the `production` profile.\n-
          `bash -n` on both the local wrapper and the remote (manager-side) heredoc
          body; host-extraction `awk` checked against a sample `osism get hosts` table.\n-
          Not yet exercised against a live failing build \u2014 that's the point of
          the draft; once it captures a real log, a follow-up `zuul-analyzer` signature
          can classify the failing import stage.\n\n## Notes\n\nDraft because it pairs
          with the diagnostic effort on `octavia-stuck-queued`; the capture is broad
          (all hosts, all affected lanes) but bounded (a log tail) and purely additive
          to the post-run phase.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)\n"
        change_url: https://github.com/osism/testbed/pull/2915
        commit_id: c53af5f7c1a8e1e6a46d5e82181eaab85d63f2be
        patchset: c53af5f7c1a8e1e6a46d5e82181eaab85d63f2be
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/testbed
          name: osism/testbed
          short_name: testbed
          src_dir: src/github.com/osism/testbed
        topic: null
      job: flake8
      jobtags: []
      max_attempts: 3
      message: enV1bDogY2FwdHVyZSBnbGFuY2UtYXBpIGxvZyBpbiBwb3N0LXJ1bgoKIyMgUHJvYmxlbQoKVGhlIG5pZ2h0bHkgdGVzdGJlZCBsYW5lcyBpbnRlcm1pdHRlbnRseSBmYWlsIHdoZW4gdGhlIE9jdGF2aWEgQW1waG9yYSBpbWFnZSBpbXBvcnQgZ2V0cyBzdHVjayBpbiBHbGFuY2UncyBgcXVldWVkYCBzdGF0ZSAodHJhY2tlZCBhcyBgb2N0YXZpYS1zdHVjay1xdWV1ZWRgKS4gVGhlIGltYWdlLWltcG9ydCBzdGVwIChgb3Npc20gbWFuYWdlIGltYWdlIG9jdGF2aWFgKSBvbmx5IHJlcG9ydHMgdGhhdCB0aGUgaW1hZ2UgaXMgKnN0dWNrKjsgdGhlIGFjdHVhbCByZWFzb24g4oCUIHdlYi1kb3dubG9hZCwgcWNvdzLihpJyYXcgY29udmVyc2lvbiwgb3IgQ2VwaCB3cml0ZSDigJQgaXMgbG9nZ2VkIGJ5ICoqZ2xhbmNlLWFwaSoqIGl0c2VsZi4KCmtvbGxhLWFuc2libGUgY29uZmlndXJlcyBnbGFuY2UtYXBpIHdpdGggYGxvZ19maWxlID0gL3Zhci9sb2cva29sbGEvZ2xhbmNlL2dsYW5jZS1hcGkubG9nYCwgc28gdGhlIGltcG9ydCBlcnJvciBnb2VzIHRvIHRoYXQgKipvbi1ob3N0IGZpbGUsIG5vdCB0aGUgY29udGFpbmVyJ3Mgc3Rkb3V0KiouIEFzIGEgcmVzdWx0IGBkb2NrZXIgbG9ncyBnbGFuY2VfYXBpYCBkb2VzIG5vdCBjb250YWluIGl0LCBhbmQgbm90aGluZyBpbiB0aGUgcHVibGlzaGVkIGpvYiBvdXRwdXQgcmV2ZWFscyB0aGUgZmFpbGluZyBzdGFnZSDigJQgc28gdGhlIGZhaWx1cmUgY2FuJ3QgYmUgZGlhZ25vc2VkIGZyb20gQ0kgbG9ncyB0b2RheS4KCiMjIENoYW5nZQoKQWRkcyBhIGJlc3QtZWZmb3J0IHBvc3QtcnVuIHBsYXkgKGBwbGF5Ym9va3MvY29sbGVjdC1nbGFuY2UtbG9ncy55bWxgKSB0aGF0IGNhcHR1cmVzIHRoZSB0YWlsIG9mIGBnbGFuY2UtYXBpLmxvZ2AgZnJvbSBldmVyeSB0ZXN0YmVkIGhvc3QgaW50byB0aGUgKipqb2Igb3V0cHV0KiosIHdoZXJlIGB6dXVsLWFuYWx5emVyYCAoYW5kIGEgZnV0dXJlIHNpZ25hdHVyZSkgY2FuIHJlYWQgaXQuCgotIFRoZSBadXVsIG9yY2hlc3RyYXRvciBjYW4gb25seSByZWFjaCB0aGUgKiptYW5hZ2VyKiogZGlyZWN0bHkgKHRoZSBub2RlcyBhcmUgb24gYSBwcml2YXRlIG5ldHdvcmspLCBzbyB0aGUgcGxheSBob3BzIHRocm91Z2ggdGhlIG1hbmFnZXIgYW5kIGZhbnMgb3V0IHRvIGV2ZXJ5IGhvc3QgcmV0dXJuZWQgYnkgYG9zaXNtIGdldCBob3N0c2Ag4oCUIHRoZSBzYW1lIHNoYXBlIGFzIHRoZSBleGlzdGluZyBgdGJvcGVyYXRvcmAgY29udGFpbmVyLWxvZyBjb2xsZWN0b3IuCi0gUnVucyAqKmJlZm9yZSoqIHRoZSBjbGVhbnVwIHBsYXkgdGVhcnMgdGhlIGVudmlyb25tZW50IGRvd24uCi0gKipOZXZlciBmYWlscyB0aGUgam9iOioqIGEgbWlzc2luZyBtYW5hZ2VyIGFkZHJlc3MsIGFuIHVucmVhY2hhYmxlIGhvc3QsIG9yIGFuIHVucmVhZGFibGUgbG9nIGFyZSBhbGwgdG9sZXJhdGVkIChgc3VkbyAtbmAgc28gaXQgY2FuJ3QgaGFuZykuIFRoZSBmaW5hbCBkZWJ1ZyBzdXJmYWNlcyBib3RoIHN0ZG91dCAqYW5kKiBzdGRlcnIgKHdpdGggYW4gZW1wdHktcmVzdWx0IGZhbGxiYWNrKSBzbyBhIGZhaWxlZCBTU0ggc3RpbGwgc2hvd3Mgd2h5LgotIFdpcmVkIGludG8gYGFic3RyYWN0LXRlc3RiZWQtZGVwbG95YCdzIHBvc3QtcnVuLCBzbyBldmVyeSBkZXBsb3kgLyB1cGRhdGUgLyB1cGdyYWRlIGxhbmUgaW5oZXJpdHMgaXQuCgojIyBWYWxpZGF0aW9uCgotIGB5YW1sbGludGAgY2xlYW47IGBhbnNpYmxlLWxpbnRgIHBhc3NlcyBhdCB0aGUgYHByb2R1Y3Rpb25gIHByb2ZpbGUuCi0gYGJhc2ggLW5gIG9uIGJvdGggdGhlIGxvY2FsIHdyYXBwZXIgYW5kIHRoZSByZW1vdGUgKG1hbmFnZXItc2lkZSkgaGVyZWRvYyBib2R5OyBob3N0LWV4dHJhY3Rpb24gYGF3a2AgY2hlY2tlZCBhZ2FpbnN0IGEgc2FtcGxlIGBvc2lzbSBnZXQgaG9zdHNgIHRhYmxlLgotIE5vdCB5ZXQgZXhlcmNpc2VkIGFnYWluc3QgYSBsaXZlIGZhaWxpbmcgYnVpbGQg4oCUIHRoYXQncyB0aGUgcG9pbnQgb2YgdGhlIGRyYWZ0OyBvbmNlIGl0IGNhcHR1cmVzIGEgcmVhbCBsb2csIGEgZm9sbG93LXVwIGB6dXVsLWFuYWx5emVyYCBzaWduYXR1cmUgY2FuIGNsYXNzaWZ5IHRoZSBmYWlsaW5nIGltcG9ydCBzdGFnZS4KCiMjIE5vdGVzCgpEcmFmdCBiZWNhdXNlIGl0IHBhaXJzIHdpdGggdGhlIGRpYWdub3N0aWMgZWZmb3J0IG9uIGBvY3RhdmlhLXN0dWNrLXF1ZXVlZGA7IHRoZSBjYXB0dXJlIGlzIGJyb2FkIChhbGwgaG9zdHMsIGFsbCBhZmZlY3RlZCBsYW5lcykgYnV0IGJvdW5kZWQgKGEgbG9nIHRhaWwpIGFuZCBwdXJlbHkgYWRkaXRpdmUgdG8gdGhlIHBvc3QtcnVuIHBoYXNlLgoK8J+kliBHZW5lcmF0ZWQgd2l0aCBbQ2xhdWRlIENvZGVdKGh0dHBzOi8vY2xhdWRlLmNvbS9jbGF1ZGUtY29kZSkK
      patchset: c53af5f7c1a8e1e6a46d5e82181eaab85d63f2be
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 71b711c422c10c242a8f785dc6d41ed9d12e9cd3
          trusted/project_1/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 242732586e2cba04d04867d3e302888c766bc231
          trusted/project_2/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 1d71e58c93442038e695a5d883d57a603182c7ae
          untrusted/project_0/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 1d71e58c93442038e695a5d883d57a603182c7ae
          untrusted/project_1/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 71b711c422c10c242a8f785dc6d41ed9d12e9cd3
          untrusted/project_2/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 242732586e2cba04d04867d3e302888c766bc231
        playbooks:
        - path: untrusted/project_0/github.com/osism/zuul-jobs/playbooks/flake8/run.yaml
          roles:
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_0/zuul-config
            link_target: untrusted/project_1/github.com/osism/zuul-config
            role_path: ansible/playbook_0/role_0/zuul-config/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/playbook_0/role_1/openinfra-zuul-jobs
            link_target: untrusted/project_2/github.com/osism/openinfra-zuul-jobs
            role_path: ansible/playbook_0/role_1/openinfra-zuul-jobs/roles
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/playbook_0/role_2/zuul-jobs
            link_target: untrusted/project_0/github.com/osism/zuul-jobs
            role_path: ansible/playbook_0/role_2/zuul-jobs/roles
      post_review: false
      post_timeout: 1800
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/osism/testbed
        name: osism/testbed
        short_name: testbed
        src_dir: src/github.com/osism/testbed
      projects:
        github.com/osism/testbed:
          canonical_hostname: github.com
          canonical_name: github.com/osism/testbed
          checkout: main
          checkout_description: zuul branch
          commit: b8c8f5a5263a09218e3f4a6e9174fc7d5c5ba4a1
          name: osism/testbed
          required: false
          short_name: testbed
          src_dir: src/github.com/osism/testbed
      ref: refs/pull/2915/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
