all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe5a:291d
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 152d49f8-f67b-4982-80bf-5f7da0eec39f
        host_id: 4ba4344415ca7057d9956ea5de826bbc0b830981e82c0e0f191fa07b
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe5a:291d
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.10
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.92
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe5a:291d
        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 python-black explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#54>'
      - '<Job python-black explicit: None implied: None source: osism/ansible-collection-services/.zuul.yaml@main#498>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 3e52a384a9894c5da06b8873342ef701
      build_refs:
      - branch: main
        change: '2090'
        change_message: "molecule: capture container logs on failure\n\n## What\n\nOn
          a failed `molecule converge` (delegated scenario), collect per-container\ndiagnostics
          into the published Zuul log directory so a container that never\nbecomes
          healthy can be diagnosed from the build logs instead of requiring a\nlocal
          reproduction.\n\n`molecule/delegated/converge.yml` now wraps the role run
          in a `block`/`rescue`.\nOn any converge failure the rescue runs\n`molecule/delegated/tasks/collect-container-logs.yml`
          (best-effort,\n`failed_when: false`), then re-raises so the build still
          reports FAILURE. Because\n`destroy` is off by default, the containers are
          still running at that point, so\ntheir logs are intact. Output is written
          to `~/zuul-output/logs/container-logs/`,\nwhich the base job's `fetch-output`
          post-run publishes:\n\n- `_overview.txt` \u2014 `docker ps --all` (name
          / state / status)\n- `<container>.txt` \u2014 `docker logs` (stdout+stderr)\n-
          `<container>.inspect.json` \u2014 `docker inspect .State` (health / restart
          / exit)\n\nIt lives in the shared `converge.yml`, so it covers every docker-based
          role in\nthe scenario, not just netbox.\n\n## Why\n\nThe `ansible-collection-services-molecule-netbox`
          job is a chronic flake\n(~70% failure rate): the `netbox-netbox-worker-1`
          container never becomes\nhealthy and the role's health gate times out. No
          per-container logs were\npublished for the job, so the cause could never
          be confirmed. Investigation\nshows the failure is a discrete per-node hang
          (bimodal timing: healthy runs\nfinish by ~29/60 retries, failures run the
          full budget), is not reproducible\nin isolation (50/50 local cold-starts
          passed, even CPU-constrained), and is\nnot CPU-bound \u2014 pointing at
          the CI environment. Capturing the worker's actual\nstate/logs on the next
          real failure is the prerequisite to telling apart a\ncrash-loop, a hang,
          a `pgrep` healthcheck mismatch, or OOM.\n\n## Safety\n\nMolecule runs use
          dummy credentials, and `docker logs` captures container\nstdout/stderr rather
          than the environment, so no real secrets are published.\n\nDraft: opened
          to run CI and gather the first instrumented failures.\n\n\U0001F916 Generated
          with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/ansible-collection-services/pull/2090
        commit_id: 09f102d01441a539adf44aa0e06d1c5d13a3b399
        patchset: 09f102d01441a539adf44aa0e06d1c5d13a3b399
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/ansible-collection-services
          name: osism/ansible-collection-services
          short_name: ansible-collection-services
        src_dir: src/github.com/osism/ansible-collection-services
        topic: null
      buildset: 2fa5fd8dca6f4f27bc1f03216f3079ce
      buildset_refs:
      - branch: main
        change: '2090'
        change_message: "molecule: capture container logs on failure\n\n## What\n\nOn
          a failed `molecule converge` (delegated scenario), collect per-container\ndiagnostics
          into the published Zuul log directory so a container that never\nbecomes
          healthy can be diagnosed from the build logs instead of requiring a\nlocal
          reproduction.\n\n`molecule/delegated/converge.yml` now wraps the role run
          in a `block`/`rescue`.\nOn any converge failure the rescue runs\n`molecule/delegated/tasks/collect-container-logs.yml`
          (best-effort,\n`failed_when: false`), then re-raises so the build still
          reports FAILURE. Because\n`destroy` is off by default, the containers are
          still running at that point, so\ntheir logs are intact. Output is written
          to `~/zuul-output/logs/container-logs/`,\nwhich the base job's `fetch-output`
          post-run publishes:\n\n- `_overview.txt` \u2014 `docker ps --all` (name
          / state / status)\n- `<container>.txt` \u2014 `docker logs` (stdout+stderr)\n-
          `<container>.inspect.json` \u2014 `docker inspect .State` (health / restart
          / exit)\n\nIt lives in the shared `converge.yml`, so it covers every docker-based
          role in\nthe scenario, not just netbox.\n\n## Why\n\nThe `ansible-collection-services-molecule-netbox`
          job is a chronic flake\n(~70% failure rate): the `netbox-netbox-worker-1`
          container never becomes\nhealthy and the role's health gate times out. No
          per-container logs were\npublished for the job, so the cause could never
          be confirmed. Investigation\nshows the failure is a discrete per-node hang
          (bimodal timing: healthy runs\nfinish by ~29/60 retries, failures run the
          full budget), is not reproducible\nin isolation (50/50 local cold-starts
          passed, even CPU-constrained), and is\nnot CPU-bound \u2014 pointing at
          the CI environment. Capturing the worker's actual\nstate/logs on the next
          real failure is the prerequisite to telling apart a\ncrash-loop, a hang,
          a `pgrep` healthcheck mismatch, or OOM.\n\n## Safety\n\nMolecule runs use
          dummy credentials, and `docker logs` captures container\nstdout/stderr rather
          than the environment, so no real secrets are published.\n\nDraft: opened
          to run CI and gather the first instrumented failures.\n\n\U0001F916 Generated
          with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/ansible-collection-services/pull/2090
        commit_id: 09f102d01441a539adf44aa0e06d1c5d13a3b399
        patchset: 09f102d01441a539adf44aa0e06d1c5d13a3b399
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/ansible-collection-services
          name: osism/ansible-collection-services
          short_name: ansible-collection-services
        src_dir: src/github.com/osism/ansible-collection-services
        topic: null
      change: '2090'
      change_message: "molecule: capture container logs on failure\n\n## What\n\nOn
        a failed `molecule converge` (delegated scenario), collect per-container\ndiagnostics
        into the published Zuul log directory so a container that never\nbecomes healthy
        can be diagnosed from the build logs instead of requiring a\nlocal reproduction.\n\n`molecule/delegated/converge.yml`
        now wraps the role run in a `block`/`rescue`.\nOn any converge failure the
        rescue runs\n`molecule/delegated/tasks/collect-container-logs.yml` (best-effort,\n`failed_when:
        false`), then re-raises so the build still reports FAILURE. Because\n`destroy`
        is off by default, the containers are still running at that point, so\ntheir
        logs are intact. Output is written to `~/zuul-output/logs/container-logs/`,\nwhich
        the base job's `fetch-output` post-run publishes:\n\n- `_overview.txt` \u2014
        `docker ps --all` (name / state / status)\n- `<container>.txt` \u2014 `docker
        logs` (stdout+stderr)\n- `<container>.inspect.json` \u2014 `docker inspect
        .State` (health / restart / exit)\n\nIt lives in the shared `converge.yml`,
        so it covers every docker-based role in\nthe scenario, not just netbox.\n\n##
        Why\n\nThe `ansible-collection-services-molecule-netbox` job is a chronic
        flake\n(~70% failure rate): the `netbox-netbox-worker-1` container never becomes\nhealthy
        and the role's health gate times out. No per-container logs were\npublished
        for the job, so the cause could never be confirmed. Investigation\nshows the
        failure is a discrete per-node hang (bimodal timing: healthy runs\nfinish
        by ~29/60 retries, failures run the full budget), is not reproducible\nin
        isolation (50/50 local cold-starts passed, even CPU-constrained), and is\nnot
        CPU-bound \u2014 pointing at the CI environment. Capturing the worker's actual\nstate/logs
        on the next real failure is the prerequisite to telling apart a\ncrash-loop,
        a hang, a `pgrep` healthcheck mismatch, or OOM.\n\n## Safety\n\nMolecule runs
        use dummy credentials, and `docker logs` captures container\nstdout/stderr
        rather than the environment, so no real secrets are published.\n\nDraft: opened
        to run CI and gather the first instrumented failures.\n\n\U0001F916 Generated
        with [Claude Code](https://claude.com/claude-code)"
      change_url: https://github.com/osism/ansible-collection-services/pull/2090
      child_jobs: []
      commit_id: 09f102d01441a539adf44aa0e06d1c5d13a3b399
      event_id: 540f1200-5ddf-11f1-9f73-20f62584f5eb
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/3e52a384a9894c5da06b8873342ef701/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/3e52a384a9894c5da06b8873342ef701/work/logs
        result_data_file: /var/lib/zuul/builds/3e52a384a9894c5da06b8873342ef701/work/results.json
        src_root: /var/lib/zuul/builds/3e52a384a9894c5da06b8873342ef701/work/src
        work_root: /var/lib/zuul/builds/3e52a384a9894c5da06b8873342ef701/work
      include_vars: []
      items:
      - branch: main
        change: '2090'
        change_message: "molecule: capture container logs on failure\n\n## What\n\nOn
          a failed `molecule converge` (delegated scenario), collect per-container\ndiagnostics
          into the published Zuul log directory so a container that never\nbecomes
          healthy can be diagnosed from the build logs instead of requiring a\nlocal
          reproduction.\n\n`molecule/delegated/converge.yml` now wraps the role run
          in a `block`/`rescue`.\nOn any converge failure the rescue runs\n`molecule/delegated/tasks/collect-container-logs.yml`
          (best-effort,\n`failed_when: false`), then re-raises so the build still
          reports FAILURE. Because\n`destroy` is off by default, the containers are
          still running at that point, so\ntheir logs are intact. Output is written
          to `~/zuul-output/logs/container-logs/`,\nwhich the base job's `fetch-output`
          post-run publishes:\n\n- `_overview.txt` \u2014 `docker ps --all` (name
          / state / status)\n- `<container>.txt` \u2014 `docker logs` (stdout+stderr)\n-
          `<container>.inspect.json` \u2014 `docker inspect .State` (health / restart
          / exit)\n\nIt lives in the shared `converge.yml`, so it covers every docker-based
          role in\nthe scenario, not just netbox.\n\n## Why\n\nThe `ansible-collection-services-molecule-netbox`
          job is a chronic flake\n(~70% failure rate): the `netbox-netbox-worker-1`
          container never becomes\nhealthy and the role's health gate times out. No
          per-container logs were\npublished for the job, so the cause could never
          be confirmed. Investigation\nshows the failure is a discrete per-node hang
          (bimodal timing: healthy runs\nfinish by ~29/60 retries, failures run the
          full budget), is not reproducible\nin isolation (50/50 local cold-starts
          passed, even CPU-constrained), and is\nnot CPU-bound \u2014 pointing at
          the CI environment. Capturing the worker's actual\nstate/logs on the next
          real failure is the prerequisite to telling apart a\ncrash-loop, a hang,
          a `pgrep` healthcheck mismatch, or OOM.\n\n## Safety\n\nMolecule runs use
          dummy credentials, and `docker logs` captures container\nstdout/stderr rather
          than the environment, so no real secrets are published.\n\nDraft: opened
          to run CI and gather the first instrumented failures.\n\n\U0001F916 Generated
          with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/ansible-collection-services/pull/2090
        commit_id: 09f102d01441a539adf44aa0e06d1c5d13a3b399
        patchset: 09f102d01441a539adf44aa0e06d1c5d13a3b399
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/ansible-collection-services
          name: osism/ansible-collection-services
          short_name: ansible-collection-services
          src_dir: src/github.com/osism/ansible-collection-services
        topic: null
      job: python-black
      jobtags: []
      max_attempts: 3
      message: bW9sZWN1bGU6IGNhcHR1cmUgY29udGFpbmVyIGxvZ3Mgb24gZmFpbHVyZQoKIyMgV2hhdAoKT24gYSBmYWlsZWQgYG1vbGVjdWxlIGNvbnZlcmdlYCAoZGVsZWdhdGVkIHNjZW5hcmlvKSwgY29sbGVjdCBwZXItY29udGFpbmVyCmRpYWdub3N0aWNzIGludG8gdGhlIHB1Ymxpc2hlZCBadXVsIGxvZyBkaXJlY3Rvcnkgc28gYSBjb250YWluZXIgdGhhdCBuZXZlcgpiZWNvbWVzIGhlYWx0aHkgY2FuIGJlIGRpYWdub3NlZCBmcm9tIHRoZSBidWlsZCBsb2dzIGluc3RlYWQgb2YgcmVxdWlyaW5nIGEKbG9jYWwgcmVwcm9kdWN0aW9uLgoKYG1vbGVjdWxlL2RlbGVnYXRlZC9jb252ZXJnZS55bWxgIG5vdyB3cmFwcyB0aGUgcm9sZSBydW4gaW4gYSBgYmxvY2tgL2ByZXNjdWVgLgpPbiBhbnkgY29udmVyZ2UgZmFpbHVyZSB0aGUgcmVzY3VlIHJ1bnMKYG1vbGVjdWxlL2RlbGVnYXRlZC90YXNrcy9jb2xsZWN0LWNvbnRhaW5lci1sb2dzLnltbGAgKGJlc3QtZWZmb3J0LApgZmFpbGVkX3doZW46IGZhbHNlYCksIHRoZW4gcmUtcmFpc2VzIHNvIHRoZSBidWlsZCBzdGlsbCByZXBvcnRzIEZBSUxVUkUuIEJlY2F1c2UKYGRlc3Ryb3lgIGlzIG9mZiBieSBkZWZhdWx0LCB0aGUgY29udGFpbmVycyBhcmUgc3RpbGwgcnVubmluZyBhdCB0aGF0IHBvaW50LCBzbwp0aGVpciBsb2dzIGFyZSBpbnRhY3QuIE91dHB1dCBpcyB3cml0dGVuIHRvIGB+L3p1dWwtb3V0cHV0L2xvZ3MvY29udGFpbmVyLWxvZ3MvYCwKd2hpY2ggdGhlIGJhc2Ugam9iJ3MgYGZldGNoLW91dHB1dGAgcG9zdC1ydW4gcHVibGlzaGVzOgoKLSBgX292ZXJ2aWV3LnR4dGAg4oCUIGBkb2NrZXIgcHMgLS1hbGxgIChuYW1lIC8gc3RhdGUgLyBzdGF0dXMpCi0gYDxjb250YWluZXI+LnR4dGAg4oCUIGBkb2NrZXIgbG9nc2AgKHN0ZG91dCtzdGRlcnIpCi0gYDxjb250YWluZXI+Lmluc3BlY3QuanNvbmAg4oCUIGBkb2NrZXIgaW5zcGVjdCAuU3RhdGVgIChoZWFsdGggLyByZXN0YXJ0IC8gZXhpdCkKCkl0IGxpdmVzIGluIHRoZSBzaGFyZWQgYGNvbnZlcmdlLnltbGAsIHNvIGl0IGNvdmVycyBldmVyeSBkb2NrZXItYmFzZWQgcm9sZSBpbgp0aGUgc2NlbmFyaW8sIG5vdCBqdXN0IG5ldGJveC4KCiMjIFdoeQoKVGhlIGBhbnNpYmxlLWNvbGxlY3Rpb24tc2VydmljZXMtbW9sZWN1bGUtbmV0Ym94YCBqb2IgaXMgYSBjaHJvbmljIGZsYWtlCih+NzAlIGZhaWx1cmUgcmF0ZSk6IHRoZSBgbmV0Ym94LW5ldGJveC13b3JrZXItMWAgY29udGFpbmVyIG5ldmVyIGJlY29tZXMKaGVhbHRoeSBhbmQgdGhlIHJvbGUncyBoZWFsdGggZ2F0ZSB0aW1lcyBvdXQuIE5vIHBlci1jb250YWluZXIgbG9ncyB3ZXJlCnB1Ymxpc2hlZCBmb3IgdGhlIGpvYiwgc28gdGhlIGNhdXNlIGNvdWxkIG5ldmVyIGJlIGNvbmZpcm1lZC4gSW52ZXN0aWdhdGlvbgpzaG93cyB0aGUgZmFpbHVyZSBpcyBhIGRpc2NyZXRlIHBlci1ub2RlIGhhbmcgKGJpbW9kYWwgdGltaW5nOiBoZWFsdGh5IHJ1bnMKZmluaXNoIGJ5IH4yOS82MCByZXRyaWVzLCBmYWlsdXJlcyBydW4gdGhlIGZ1bGwgYnVkZ2V0KSwgaXMgbm90IHJlcHJvZHVjaWJsZQppbiBpc29sYXRpb24gKDUwLzUwIGxvY2FsIGNvbGQtc3RhcnRzIHBhc3NlZCwgZXZlbiBDUFUtY29uc3RyYWluZWQpLCBhbmQgaXMKbm90IENQVS1ib3VuZCDigJQgcG9pbnRpbmcgYXQgdGhlIENJIGVudmlyb25tZW50LiBDYXB0dXJpbmcgdGhlIHdvcmtlcidzIGFjdHVhbApzdGF0ZS9sb2dzIG9uIHRoZSBuZXh0IHJlYWwgZmFpbHVyZSBpcyB0aGUgcHJlcmVxdWlzaXRlIHRvIHRlbGxpbmcgYXBhcnQgYQpjcmFzaC1sb29wLCBhIGhhbmcsIGEgYHBncmVwYCBoZWFsdGhjaGVjayBtaXNtYXRjaCwgb3IgT09NLgoKIyMgU2FmZXR5CgpNb2xlY3VsZSBydW5zIHVzZSBkdW1teSBjcmVkZW50aWFscywgYW5kIGBkb2NrZXIgbG9nc2AgY2FwdHVyZXMgY29udGFpbmVyCnN0ZG91dC9zdGRlcnIgcmF0aGVyIHRoYW4gdGhlIGVudmlyb25tZW50LCBzbyBubyByZWFsIHNlY3JldHMgYXJlIHB1Ymxpc2hlZC4KCkRyYWZ0OiBvcGVuZWQgdG8gcnVuIENJIGFuZCBnYXRoZXIgdGhlIGZpcnN0IGluc3RydW1lbnRlZCBmYWlsdXJlcy4KCvCfpJYgR2VuZXJhdGVkIHdpdGggW0NsYXVkZSBDb2RlXShodHRwczovL2NsYXVkZS5jb20vY2xhdWRlLWNvZGUp
      patchset: 09f102d01441a539adf44aa0e06d1c5d13a3b399
      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/python-black/run.yml
          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/ansible-collection-services
        name: osism/ansible-collection-services
        short_name: ansible-collection-services
        src_dir: src/github.com/osism/ansible-collection-services
      projects:
        github.com/osism/ansible-collection-services:
          canonical_hostname: github.com
          canonical_name: github.com/osism/ansible-collection-services
          checkout: main
          checkout_description: zuul branch
          commit: 8732b4d623ac0844e4d74bfe2f5a0d0cc52e26ff
          name: osism/ansible-collection-services
          required: false
          short_name: ansible-collection-services
          src_dir: src/github.com/osism/ansible-collection-services
      ref: refs/pull/2090/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
