all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fec5:35
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      docker_namespace: osism
      docker_registry: osism.harbor.regio.digital
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 06ee1f85-e7c1-43e6-880a-2fda1d6da2f8
        host_id: 5afd8fc909abddfe2ce3a956a91bbe56629648b7209fd0acfa541862
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fec5:35
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.150
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.59
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fec5:35
        region: null
        slot: null
  vars:
    docker_namespace: osism
    docker_registry: osism.harbor.regio.digital
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-config/zuul.d/jobs.yaml@main#2>'
      - '<Job container-image-python-osism-build explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/python-osism/.zuul.yaml@main#79>'
      - '<Job container-image-python-osism-build explicit: None implied: None source:
        osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 27bf8bfc384b40d482cc44bbf939a55a
      build_refs:
      - branch: main
        change: '2430'
        change_message: "Fix Redfish credential loading for 'redfish list'\n\n## Problem\n\n`osism
          redfish list <host> ...` connects to the BMC with **empty credentials**
          and fails against any BMC that requires authentication \u2014 silently,
          with no exception raised and nothing logged. The configured Redfish address
          is likewise dropped, falling back to the default `https://{hostname}`.\n\n`get_redfish_connection()`
          is the only path that re-derives BMC credentials from the NetBox device
          `secrets` custom field, via `_get_conductor_redfish_credentials()`. `_prepare_node_attributes()`
          returns a `(node_attributes, template_vars)` tuple, but that helper (and
          `_get_conductor_redfish_address()`) still bound the whole tuple to `node_attributes`
          and then tested `\"driver_info\" in node_attributes`. On a tuple that is
          a membership test against the two tuple elements \u2014 always `False` \u2014
          so both helpers short-circuited before `.get()` and returned `None`.\n\nThe
          tuple return was introduced when `ironic.py` was refactored; these two `utils.py`
          callers were never updated and had no test coverage.\n\n## Scope\n\nThe
          Ironic sync path is **unaffected** \u2014 it calls `_prepare_node_attributes()`
          directly (`ironic.py:823`), already unpacks the tuple, and pushes the same
          secrets-derived credentials into Ironic. So BMC access that goes through
          Ironic (deploy, clean, power) kept working; only the standalone `redfish
          list` command, which re-derives credentials on its own, was broken. This
          is why the defect went unnoticed.\n\n## Fix\n\n- Unpack the tuple at both
          call sites in `conductor/utils.py`.\n- Add regression tests for both helpers:
          redfish happy path, `None`-device guard, non-redfish driver, missing `driver_info`,
          and swallowed exceptions. The happy-path tests fail against the pre-fix
          code, pinning the behaviour.\n\n## Context\n\n- osism/python-osism#2342\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2430
        commit_id: 0d8f4a6fe07247d46294d5ecd3437ae8d198ed34
        patchset: 0d8f4a6fe07247d46294d5ecd3437ae8d198ed34
        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: 3cb4f2aeb1e6433c828a47ad8acf4c76
      buildset_refs:
      - branch: main
        change: '2430'
        change_message: "Fix Redfish credential loading for 'redfish list'\n\n## Problem\n\n`osism
          redfish list <host> ...` connects to the BMC with **empty credentials**
          and fails against any BMC that requires authentication \u2014 silently,
          with no exception raised and nothing logged. The configured Redfish address
          is likewise dropped, falling back to the default `https://{hostname}`.\n\n`get_redfish_connection()`
          is the only path that re-derives BMC credentials from the NetBox device
          `secrets` custom field, via `_get_conductor_redfish_credentials()`. `_prepare_node_attributes()`
          returns a `(node_attributes, template_vars)` tuple, but that helper (and
          `_get_conductor_redfish_address()`) still bound the whole tuple to `node_attributes`
          and then tested `\"driver_info\" in node_attributes`. On a tuple that is
          a membership test against the two tuple elements \u2014 always `False` \u2014
          so both helpers short-circuited before `.get()` and returned `None`.\n\nThe
          tuple return was introduced when `ironic.py` was refactored; these two `utils.py`
          callers were never updated and had no test coverage.\n\n## Scope\n\nThe
          Ironic sync path is **unaffected** \u2014 it calls `_prepare_node_attributes()`
          directly (`ironic.py:823`), already unpacks the tuple, and pushes the same
          secrets-derived credentials into Ironic. So BMC access that goes through
          Ironic (deploy, clean, power) kept working; only the standalone `redfish
          list` command, which re-derives credentials on its own, was broken. This
          is why the defect went unnoticed.\n\n## Fix\n\n- Unpack the tuple at both
          call sites in `conductor/utils.py`.\n- Add regression tests for both helpers:
          redfish happy path, `None`-device guard, non-redfish driver, missing `driver_info`,
          and swallowed exceptions. The happy-path tests fail against the pre-fix
          code, pinning the behaviour.\n\n## Context\n\n- osism/python-osism#2342\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2430
        commit_id: 0d8f4a6fe07247d46294d5ecd3437ae8d198ed34
        patchset: 0d8f4a6fe07247d46294d5ecd3437ae8d198ed34
        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: '2430'
      change_message: "Fix Redfish credential loading for 'redfish list'\n\n## Problem\n\n`osism
        redfish list <host> ...` connects to the BMC with **empty credentials** and
        fails against any BMC that requires authentication \u2014 silently, with no
        exception raised and nothing logged. The configured Redfish address is likewise
        dropped, falling back to the default `https://{hostname}`.\n\n`get_redfish_connection()`
        is the only path that re-derives BMC credentials from the NetBox device `secrets`
        custom field, via `_get_conductor_redfish_credentials()`. `_prepare_node_attributes()`
        returns a `(node_attributes, template_vars)` tuple, but that helper (and `_get_conductor_redfish_address()`)
        still bound the whole tuple to `node_attributes` and then tested `\"driver_info\"
        in node_attributes`. On a tuple that is a membership test against the two
        tuple elements \u2014 always `False` \u2014 so both helpers short-circuited
        before `.get()` and returned `None`.\n\nThe tuple return was introduced when
        `ironic.py` was refactored; these two `utils.py` callers were never updated
        and had no test coverage.\n\n## Scope\n\nThe Ironic sync path is **unaffected**
        \u2014 it calls `_prepare_node_attributes()` directly (`ironic.py:823`), already
        unpacks the tuple, and pushes the same secrets-derived credentials into Ironic.
        So BMC access that goes through Ironic (deploy, clean, power) kept working;
        only the standalone `redfish list` command, which re-derives credentials on
        its own, was broken. This is why the defect went unnoticed.\n\n## Fix\n\n-
        Unpack the tuple at both call sites in `conductor/utils.py`.\n- Add regression
        tests for both helpers: redfish happy path, `None`-device guard, non-redfish
        driver, missing `driver_info`, and swallowed exceptions. The happy-path tests
        fail against the pre-fix code, pinning the behaviour.\n\n## Context\n\n- osism/python-osism#2342\n\n\U0001F916
        Generated with [Claude Code](https://claude.com/claude-code)"
      change_url: https://github.com/osism/python-osism/pull/2430
      child_jobs: []
      commit_id: 0d8f4a6fe07247d46294d5ecd3437ae8d198ed34
      event_id: d8e8ca90-7642-11f1-8920-6baed882cb28
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/27bf8bfc384b40d482cc44bbf939a55a/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/27bf8bfc384b40d482cc44bbf939a55a/work/logs
        result_data_file: /var/lib/zuul/builds/27bf8bfc384b40d482cc44bbf939a55a/work/results.json
        src_root: /var/lib/zuul/builds/27bf8bfc384b40d482cc44bbf939a55a/work/src
        work_root: /var/lib/zuul/builds/27bf8bfc384b40d482cc44bbf939a55a/work
      include_vars: []
      items:
      - branch: main
        change: '2430'
        change_message: "Fix Redfish credential loading for 'redfish list'\n\n## Problem\n\n`osism
          redfish list <host> ...` connects to the BMC with **empty credentials**
          and fails against any BMC that requires authentication \u2014 silently,
          with no exception raised and nothing logged. The configured Redfish address
          is likewise dropped, falling back to the default `https://{hostname}`.\n\n`get_redfish_connection()`
          is the only path that re-derives BMC credentials from the NetBox device
          `secrets` custom field, via `_get_conductor_redfish_credentials()`. `_prepare_node_attributes()`
          returns a `(node_attributes, template_vars)` tuple, but that helper (and
          `_get_conductor_redfish_address()`) still bound the whole tuple to `node_attributes`
          and then tested `\"driver_info\" in node_attributes`. On a tuple that is
          a membership test against the two tuple elements \u2014 always `False` \u2014
          so both helpers short-circuited before `.get()` and returned `None`.\n\nThe
          tuple return was introduced when `ironic.py` was refactored; these two `utils.py`
          callers were never updated and had no test coverage.\n\n## Scope\n\nThe
          Ironic sync path is **unaffected** \u2014 it calls `_prepare_node_attributes()`
          directly (`ironic.py:823`), already unpacks the tuple, and pushes the same
          secrets-derived credentials into Ironic. So BMC access that goes through
          Ironic (deploy, clean, power) kept working; only the standalone `redfish
          list` command, which re-derives credentials on its own, was broken. This
          is why the defect went unnoticed.\n\n## Fix\n\n- Unpack the tuple at both
          call sites in `conductor/utils.py`.\n- Add regression tests for both helpers:
          redfish happy path, `None`-device guard, non-redfish driver, missing `driver_info`,
          and swallowed exceptions. The happy-path tests fail against the pre-fix
          code, pinning the behaviour.\n\n## Context\n\n- osism/python-osism#2342\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2430
        commit_id: 0d8f4a6fe07247d46294d5ecd3437ae8d198ed34
        patchset: 0d8f4a6fe07247d46294d5ecd3437ae8d198ed34
        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: container-image-python-osism-build
      jobtags: []
      max_attempts: 3
      message: Rml4IFJlZGZpc2ggY3JlZGVudGlhbCBsb2FkaW5nIGZvciAncmVkZmlzaCBsaXN0JwoKIyMgUHJvYmxlbQoKYG9zaXNtIHJlZGZpc2ggbGlzdCA8aG9zdD4gLi4uYCBjb25uZWN0cyB0byB0aGUgQk1DIHdpdGggKiplbXB0eSBjcmVkZW50aWFscyoqIGFuZCBmYWlscyBhZ2FpbnN0IGFueSBCTUMgdGhhdCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbiDigJQgc2lsZW50bHksIHdpdGggbm8gZXhjZXB0aW9uIHJhaXNlZCBhbmQgbm90aGluZyBsb2dnZWQuIFRoZSBjb25maWd1cmVkIFJlZGZpc2ggYWRkcmVzcyBpcyBsaWtld2lzZSBkcm9wcGVkLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGRlZmF1bHQgYGh0dHBzOi8ve2hvc3RuYW1lfWAuCgpgZ2V0X3JlZGZpc2hfY29ubmVjdGlvbigpYCBpcyB0aGUgb25seSBwYXRoIHRoYXQgcmUtZGVyaXZlcyBCTUMgY3JlZGVudGlhbHMgZnJvbSB0aGUgTmV0Qm94IGRldmljZSBgc2VjcmV0c2AgY3VzdG9tIGZpZWxkLCB2aWEgYF9nZXRfY29uZHVjdG9yX3JlZGZpc2hfY3JlZGVudGlhbHMoKWAuIGBfcHJlcGFyZV9ub2RlX2F0dHJpYnV0ZXMoKWAgcmV0dXJucyBhIGAobm9kZV9hdHRyaWJ1dGVzLCB0ZW1wbGF0ZV92YXJzKWAgdHVwbGUsIGJ1dCB0aGF0IGhlbHBlciAoYW5kIGBfZ2V0X2NvbmR1Y3Rvcl9yZWRmaXNoX2FkZHJlc3MoKWApIHN0aWxsIGJvdW5kIHRoZSB3aG9sZSB0dXBsZSB0byBgbm9kZV9hdHRyaWJ1dGVzYCBhbmQgdGhlbiB0ZXN0ZWQgYCJkcml2ZXJfaW5mbyIgaW4gbm9kZV9hdHRyaWJ1dGVzYC4gT24gYSB0dXBsZSB0aGF0IGlzIGEgbWVtYmVyc2hpcCB0ZXN0IGFnYWluc3QgdGhlIHR3byB0dXBsZSBlbGVtZW50cyDigJQgYWx3YXlzIGBGYWxzZWAg4oCUIHNvIGJvdGggaGVscGVycyBzaG9ydC1jaXJjdWl0ZWQgYmVmb3JlIGAuZ2V0KClgIGFuZCByZXR1cm5lZCBgTm9uZWAuCgpUaGUgdHVwbGUgcmV0dXJuIHdhcyBpbnRyb2R1Y2VkIHdoZW4gYGlyb25pYy5weWAgd2FzIHJlZmFjdG9yZWQ7IHRoZXNlIHR3byBgdXRpbHMucHlgIGNhbGxlcnMgd2VyZSBuZXZlciB1cGRhdGVkIGFuZCBoYWQgbm8gdGVzdCBjb3ZlcmFnZS4KCiMjIFNjb3BlCgpUaGUgSXJvbmljIHN5bmMgcGF0aCBpcyAqKnVuYWZmZWN0ZWQqKiDigJQgaXQgY2FsbHMgYF9wcmVwYXJlX25vZGVfYXR0cmlidXRlcygpYCBkaXJlY3RseSAoYGlyb25pYy5weTo4MjNgKSwgYWxyZWFkeSB1bnBhY2tzIHRoZSB0dXBsZSwgYW5kIHB1c2hlcyB0aGUgc2FtZSBzZWNyZXRzLWRlcml2ZWQgY3JlZGVudGlhbHMgaW50byBJcm9uaWMuIFNvIEJNQyBhY2Nlc3MgdGhhdCBnb2VzIHRocm91Z2ggSXJvbmljIChkZXBsb3ksIGNsZWFuLCBwb3dlcikga2VwdCB3b3JraW5nOyBvbmx5IHRoZSBzdGFuZGFsb25lIGByZWRmaXNoIGxpc3RgIGNvbW1hbmQsIHdoaWNoIHJlLWRlcml2ZXMgY3JlZGVudGlhbHMgb24gaXRzIG93biwgd2FzIGJyb2tlbi4gVGhpcyBpcyB3aHkgdGhlIGRlZmVjdCB3ZW50IHVubm90aWNlZC4KCiMjIEZpeAoKLSBVbnBhY2sgdGhlIHR1cGxlIGF0IGJvdGggY2FsbCBzaXRlcyBpbiBgY29uZHVjdG9yL3V0aWxzLnB5YC4KLSBBZGQgcmVncmVzc2lvbiB0ZXN0cyBmb3IgYm90aCBoZWxwZXJzOiByZWRmaXNoIGhhcHB5IHBhdGgsIGBOb25lYC1kZXZpY2UgZ3VhcmQsIG5vbi1yZWRmaXNoIGRyaXZlciwgbWlzc2luZyBgZHJpdmVyX2luZm9gLCBhbmQgc3dhbGxvd2VkIGV4Y2VwdGlvbnMuIFRoZSBoYXBweS1wYXRoIHRlc3RzIGZhaWwgYWdhaW5zdCB0aGUgcHJlLWZpeCBjb2RlLCBwaW5uaW5nIHRoZSBiZWhhdmlvdXIuCgojIyBDb250ZXh0CgotIG9zaXNtL3B5dGhvbi1vc2lzbSMyMzQyCgrwn6SWIEdlbmVyYXRlZCB3aXRoIFtDbGF1ZGUgQ29kZV0oaHR0cHM6Ly9jbGF1ZGUuY29tL2NsYXVkZS1jb2RlKQ==
      patchset: 0d8f4a6fe07247d46294d5ecd3437ae8d198ed34
      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/python-osism:
            canonical_name: github.com/osism/python-osism
            checkout: main
            commit: 735942f28cfd11b467c0cf5338d69ee6f9690656
          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
          untrusted/project_3/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 1d71e58c93442038e695a5d883d57a603182c7ae
        playbooks:
        - path: untrusted/project_0/github.com/osism/python-osism/playbooks/build.yml
          roles:
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_1/zuul-config
            link_target: untrusted/project_1/github.com/osism/zuul-config
            role_path: ansible/playbook_0/role_1/zuul-config/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/playbook_0/role_2/openinfra-zuul-jobs
            link_target: untrusted/project_2/github.com/osism/openinfra-zuul-jobs
            role_path: ansible/playbook_0/role_2/openinfra-zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_3/zuul-jobs
            link_target: untrusted/project_3/github.com/osism/zuul-jobs
            role_path: ansible/playbook_0/role_3/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: 735942f28cfd11b467c0cf5338d69ee6f9690656
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2430/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
