all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe98:2c8a
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 81b6482c-05d1-4762-a31f-4770a7b55484
        host_id: 82101243836454d7401d5893feae9e2c5df7cc291646d8a99b33b53b
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe98:2c8a
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.207
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.72
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe98:2c8a
        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-osism-unit-tests explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/python-osism/.zuul.yaml@main#133>'
      - '<Job python-osism-unit-tests explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: b5604bd99dc048b08251f245285e495e
      build_refs:
      - branch: main
        change: '2548'
        change_message: 'Add integration tests for the Redis semaphore


          `RedisSemaphore` caps concurrent NetBox API requests: `osism/tasks/netbox.py:31`
          builds one per NetBox URL through `utils.create_netbox_semaphore(nb.base_url)`.
          Its holders live in a sorted set and are admitted by a server-side Lua script,
          so what the class does is Redis behaviour: the expiry reclaim, the capacity
          limit, and the atomicity that stops two clients from taking the same free
          slot. Until now the only coverage came from `fakeredis` and mocks, and `fakeredis`
          reimplements exactly that surface in Python.


          One commit, one new file, no production code and no dependency changes.


          `Add integration tests for the Redis semaphore` adds `tests/integration/test_semaphore.py`
          with ten tests against the live Redis of the `python-osism-integration-tests`
          job:


          - `test_acquire_up_to_maxsize`, `test_acquire_beyond_maxsize_returns_false`,
          `test_release_frees_slot` and `test_release_without_acquire_is_noop` cover
          the capacity limit and both release paths.

          - `test_expired_holder_reclaimed` seeds a holder aged past `HOLDER_EXPIRY`
          directly through the Redis client, so the `ZREMRANGEBYSCORE` reclaim runs
          without waiting out 60 seconds.

          - `test_context_manager_roundtrip` and `test_context_manager_timeout_raises`
          cover both `with sem:` paths, including the exact `TimeoutError` message.

          - `test_create_netbox_semaphore_key_and_maxsize` and `test_create_netbox_semaphore_default_maxsize`
          pin the key the helper derives from a NetBox URL (`semaphore:netbox_semaphore_<md5-prefix>`),
          its `maxsize`, and an acquire/release round trip against the live server.

          - `test_concurrent_acquire_never_exceeds_maxsize` is the many-client race
          the unit suite defers to a real server (`tests/unit/utils/test_init_semaphore.py:8`):
          twelve barrier-synchronised threads contend for three slots and exactly
          three get in.


          Each test uses a uuid key and deletes it afterwards, so runs stay independent
          of one another.


          ## Verification


          Against a throwaway `redis:7-alpine` container, `pytest tests/integration/test_semaphore.py`
          reports 10 passed, repeated three times without flakiness. With Redis stopped
          it reports 10 skipped rather than failing, per the skip logic in `tests/integration/conftest.py`.


          The race test was checked for teeth: replaying the same twelve threads with
          a deliberately non-atomic acquire (`ZCARD` then `ZADD` in two round trips)
          admitted 6 to 7 holders where `maxsize` is 3, so the test fails loudly on
          the bug the Lua script prevents.


          Closes #2401

          '
        change_url: https://github.com/osism/python-osism/pull/2548
        commit_id: a744fbb435ef3c2b229d7ba5ad4b824f1577f6db
        patchset: a744fbb435ef3c2b229d7ba5ad4b824f1577f6db
        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: 9d11eb1cb6b84ede82e6cfe43e98d27a
      buildset_refs:
      - branch: main
        change: '2548'
        change_message: 'Add integration tests for the Redis semaphore


          `RedisSemaphore` caps concurrent NetBox API requests: `osism/tasks/netbox.py:31`
          builds one per NetBox URL through `utils.create_netbox_semaphore(nb.base_url)`.
          Its holders live in a sorted set and are admitted by a server-side Lua script,
          so what the class does is Redis behaviour: the expiry reclaim, the capacity
          limit, and the atomicity that stops two clients from taking the same free
          slot. Until now the only coverage came from `fakeredis` and mocks, and `fakeredis`
          reimplements exactly that surface in Python.


          One commit, one new file, no production code and no dependency changes.


          `Add integration tests for the Redis semaphore` adds `tests/integration/test_semaphore.py`
          with ten tests against the live Redis of the `python-osism-integration-tests`
          job:


          - `test_acquire_up_to_maxsize`, `test_acquire_beyond_maxsize_returns_false`,
          `test_release_frees_slot` and `test_release_without_acquire_is_noop` cover
          the capacity limit and both release paths.

          - `test_expired_holder_reclaimed` seeds a holder aged past `HOLDER_EXPIRY`
          directly through the Redis client, so the `ZREMRANGEBYSCORE` reclaim runs
          without waiting out 60 seconds.

          - `test_context_manager_roundtrip` and `test_context_manager_timeout_raises`
          cover both `with sem:` paths, including the exact `TimeoutError` message.

          - `test_create_netbox_semaphore_key_and_maxsize` and `test_create_netbox_semaphore_default_maxsize`
          pin the key the helper derives from a NetBox URL (`semaphore:netbox_semaphore_<md5-prefix>`),
          its `maxsize`, and an acquire/release round trip against the live server.

          - `test_concurrent_acquire_never_exceeds_maxsize` is the many-client race
          the unit suite defers to a real server (`tests/unit/utils/test_init_semaphore.py:8`):
          twelve barrier-synchronised threads contend for three slots and exactly
          three get in.


          Each test uses a uuid key and deletes it afterwards, so runs stay independent
          of one another.


          ## Verification


          Against a throwaway `redis:7-alpine` container, `pytest tests/integration/test_semaphore.py`
          reports 10 passed, repeated three times without flakiness. With Redis stopped
          it reports 10 skipped rather than failing, per the skip logic in `tests/integration/conftest.py`.


          The race test was checked for teeth: replaying the same twelve threads with
          a deliberately non-atomic acquire (`ZCARD` then `ZADD` in two round trips)
          admitted 6 to 7 holders where `maxsize` is 3, so the test fails loudly on
          the bug the Lua script prevents.


          Closes #2401

          '
        change_url: https://github.com/osism/python-osism/pull/2548
        commit_id: a744fbb435ef3c2b229d7ba5ad4b824f1577f6db
        patchset: a744fbb435ef3c2b229d7ba5ad4b824f1577f6db
        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: '2548'
      change_message: 'Add integration tests for the Redis semaphore


        `RedisSemaphore` caps concurrent NetBox API requests: `osism/tasks/netbox.py:31`
        builds one per NetBox URL through `utils.create_netbox_semaphore(nb.base_url)`.
        Its holders live in a sorted set and are admitted by a server-side Lua script,
        so what the class does is Redis behaviour: the expiry reclaim, the capacity
        limit, and the atomicity that stops two clients from taking the same free
        slot. Until now the only coverage came from `fakeredis` and mocks, and `fakeredis`
        reimplements exactly that surface in Python.


        One commit, one new file, no production code and no dependency changes.


        `Add integration tests for the Redis semaphore` adds `tests/integration/test_semaphore.py`
        with ten tests against the live Redis of the `python-osism-integration-tests`
        job:


        - `test_acquire_up_to_maxsize`, `test_acquire_beyond_maxsize_returns_false`,
        `test_release_frees_slot` and `test_release_without_acquire_is_noop` cover
        the capacity limit and both release paths.

        - `test_expired_holder_reclaimed` seeds a holder aged past `HOLDER_EXPIRY`
        directly through the Redis client, so the `ZREMRANGEBYSCORE` reclaim runs
        without waiting out 60 seconds.

        - `test_context_manager_roundtrip` and `test_context_manager_timeout_raises`
        cover both `with sem:` paths, including the exact `TimeoutError` message.

        - `test_create_netbox_semaphore_key_and_maxsize` and `test_create_netbox_semaphore_default_maxsize`
        pin the key the helper derives from a NetBox URL (`semaphore:netbox_semaphore_<md5-prefix>`),
        its `maxsize`, and an acquire/release round trip against the live server.

        - `test_concurrent_acquire_never_exceeds_maxsize` is the many-client race
        the unit suite defers to a real server (`tests/unit/utils/test_init_semaphore.py:8`):
        twelve barrier-synchronised threads contend for three slots and exactly three
        get in.


        Each test uses a uuid key and deletes it afterwards, so runs stay independent
        of one another.


        ## Verification


        Against a throwaway `redis:7-alpine` container, `pytest tests/integration/test_semaphore.py`
        reports 10 passed, repeated three times without flakiness. With Redis stopped
        it reports 10 skipped rather than failing, per the skip logic in `tests/integration/conftest.py`.


        The race test was checked for teeth: replaying the same twelve threads with
        a deliberately non-atomic acquire (`ZCARD` then `ZADD` in two round trips)
        admitted 6 to 7 holders where `maxsize` is 3, so the test fails loudly on
        the bug the Lua script prevents.


        Closes #2401

        '
      change_url: https://github.com/osism/python-osism/pull/2548
      child_jobs: []
      commit_id: a744fbb435ef3c2b229d7ba5ad4b824f1577f6db
      event_id: 56dc3b00-9090-11f1-91f2-c037afc0fa88
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/b5604bd99dc048b08251f245285e495e/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/b5604bd99dc048b08251f245285e495e/work/logs
        result_data_file: /var/lib/zuul/builds/b5604bd99dc048b08251f245285e495e/work/results.json
        src_root: /var/lib/zuul/builds/b5604bd99dc048b08251f245285e495e/work/src
        work_root: /var/lib/zuul/builds/b5604bd99dc048b08251f245285e495e/work
      include_vars: []
      items:
      - branch: main
        change: '2548'
        change_message: 'Add integration tests for the Redis semaphore


          `RedisSemaphore` caps concurrent NetBox API requests: `osism/tasks/netbox.py:31`
          builds one per NetBox URL through `utils.create_netbox_semaphore(nb.base_url)`.
          Its holders live in a sorted set and are admitted by a server-side Lua script,
          so what the class does is Redis behaviour: the expiry reclaim, the capacity
          limit, and the atomicity that stops two clients from taking the same free
          slot. Until now the only coverage came from `fakeredis` and mocks, and `fakeredis`
          reimplements exactly that surface in Python.


          One commit, one new file, no production code and no dependency changes.


          `Add integration tests for the Redis semaphore` adds `tests/integration/test_semaphore.py`
          with ten tests against the live Redis of the `python-osism-integration-tests`
          job:


          - `test_acquire_up_to_maxsize`, `test_acquire_beyond_maxsize_returns_false`,
          `test_release_frees_slot` and `test_release_without_acquire_is_noop` cover
          the capacity limit and both release paths.

          - `test_expired_holder_reclaimed` seeds a holder aged past `HOLDER_EXPIRY`
          directly through the Redis client, so the `ZREMRANGEBYSCORE` reclaim runs
          without waiting out 60 seconds.

          - `test_context_manager_roundtrip` and `test_context_manager_timeout_raises`
          cover both `with sem:` paths, including the exact `TimeoutError` message.

          - `test_create_netbox_semaphore_key_and_maxsize` and `test_create_netbox_semaphore_default_maxsize`
          pin the key the helper derives from a NetBox URL (`semaphore:netbox_semaphore_<md5-prefix>`),
          its `maxsize`, and an acquire/release round trip against the live server.

          - `test_concurrent_acquire_never_exceeds_maxsize` is the many-client race
          the unit suite defers to a real server (`tests/unit/utils/test_init_semaphore.py:8`):
          twelve barrier-synchronised threads contend for three slots and exactly
          three get in.


          Each test uses a uuid key and deletes it afterwards, so runs stay independent
          of one another.


          ## Verification


          Against a throwaway `redis:7-alpine` container, `pytest tests/integration/test_semaphore.py`
          reports 10 passed, repeated three times without flakiness. With Redis stopped
          it reports 10 skipped rather than failing, per the skip logic in `tests/integration/conftest.py`.


          The race test was checked for teeth: replaying the same twelve threads with
          a deliberately non-atomic acquire (`ZCARD` then `ZADD` in two round trips)
          admitted 6 to 7 holders where `maxsize` is 3, so the test fails loudly on
          the bug the Lua script prevents.


          Closes #2401

          '
        change_url: https://github.com/osism/python-osism/pull/2548
        commit_id: a744fbb435ef3c2b229d7ba5ad4b824f1577f6db
        patchset: a744fbb435ef3c2b229d7ba5ad4b824f1577f6db
        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: python-osism-unit-tests
      jobtags: []
      max_attempts: 3
      message: QWRkIGludGVncmF0aW9uIHRlc3RzIGZvciB0aGUgUmVkaXMgc2VtYXBob3JlCgpgUmVkaXNTZW1hcGhvcmVgIGNhcHMgY29uY3VycmVudCBOZXRCb3ggQVBJIHJlcXVlc3RzOiBgb3Npc20vdGFza3MvbmV0Ym94LnB5OjMxYCBidWlsZHMgb25lIHBlciBOZXRCb3ggVVJMIHRocm91Z2ggYHV0aWxzLmNyZWF0ZV9uZXRib3hfc2VtYXBob3JlKG5iLmJhc2VfdXJsKWAuIEl0cyBob2xkZXJzIGxpdmUgaW4gYSBzb3J0ZWQgc2V0IGFuZCBhcmUgYWRtaXR0ZWQgYnkgYSBzZXJ2ZXItc2lkZSBMdWEgc2NyaXB0LCBzbyB3aGF0IHRoZSBjbGFzcyBkb2VzIGlzIFJlZGlzIGJlaGF2aW91cjogdGhlIGV4cGlyeSByZWNsYWltLCB0aGUgY2FwYWNpdHkgbGltaXQsIGFuZCB0aGUgYXRvbWljaXR5IHRoYXQgc3RvcHMgdHdvIGNsaWVudHMgZnJvbSB0YWtpbmcgdGhlIHNhbWUgZnJlZSBzbG90LiBVbnRpbCBub3cgdGhlIG9ubHkgY292ZXJhZ2UgY2FtZSBmcm9tIGBmYWtlcmVkaXNgIGFuZCBtb2NrcywgYW5kIGBmYWtlcmVkaXNgIHJlaW1wbGVtZW50cyBleGFjdGx5IHRoYXQgc3VyZmFjZSBpbiBQeXRob24uCgpPbmUgY29tbWl0LCBvbmUgbmV3IGZpbGUsIG5vIHByb2R1Y3Rpb24gY29kZSBhbmQgbm8gZGVwZW5kZW5jeSBjaGFuZ2VzLgoKYEFkZCBpbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgdGhlIFJlZGlzIHNlbWFwaG9yZWAgYWRkcyBgdGVzdHMvaW50ZWdyYXRpb24vdGVzdF9zZW1hcGhvcmUucHlgIHdpdGggdGVuIHRlc3RzIGFnYWluc3QgdGhlIGxpdmUgUmVkaXMgb2YgdGhlIGBweXRob24tb3Npc20taW50ZWdyYXRpb24tdGVzdHNgIGpvYjoKCi0gYHRlc3RfYWNxdWlyZV91cF90b19tYXhzaXplYCwgYHRlc3RfYWNxdWlyZV9iZXlvbmRfbWF4c2l6ZV9yZXR1cm5zX2ZhbHNlYCwgYHRlc3RfcmVsZWFzZV9mcmVlc19zbG90YCBhbmQgYHRlc3RfcmVsZWFzZV93aXRob3V0X2FjcXVpcmVfaXNfbm9vcGAgY292ZXIgdGhlIGNhcGFjaXR5IGxpbWl0IGFuZCBib3RoIHJlbGVhc2UgcGF0aHMuCi0gYHRlc3RfZXhwaXJlZF9ob2xkZXJfcmVjbGFpbWVkYCBzZWVkcyBhIGhvbGRlciBhZ2VkIHBhc3QgYEhPTERFUl9FWFBJUllgIGRpcmVjdGx5IHRocm91Z2ggdGhlIFJlZGlzIGNsaWVudCwgc28gdGhlIGBaUkVNUkFOR0VCWVNDT1JFYCByZWNsYWltIHJ1bnMgd2l0aG91dCB3YWl0aW5nIG91dCA2MCBzZWNvbmRzLgotIGB0ZXN0X2NvbnRleHRfbWFuYWdlcl9yb3VuZHRyaXBgIGFuZCBgdGVzdF9jb250ZXh0X21hbmFnZXJfdGltZW91dF9yYWlzZXNgIGNvdmVyIGJvdGggYHdpdGggc2VtOmAgcGF0aHMsIGluY2x1ZGluZyB0aGUgZXhhY3QgYFRpbWVvdXRFcnJvcmAgbWVzc2FnZS4KLSBgdGVzdF9jcmVhdGVfbmV0Ym94X3NlbWFwaG9yZV9rZXlfYW5kX21heHNpemVgIGFuZCBgdGVzdF9jcmVhdGVfbmV0Ym94X3NlbWFwaG9yZV9kZWZhdWx0X21heHNpemVgIHBpbiB0aGUga2V5IHRoZSBoZWxwZXIgZGVyaXZlcyBmcm9tIGEgTmV0Qm94IFVSTCAoYHNlbWFwaG9yZTpuZXRib3hfc2VtYXBob3JlXzxtZDUtcHJlZml4PmApLCBpdHMgYG1heHNpemVgLCBhbmQgYW4gYWNxdWlyZS9yZWxlYXNlIHJvdW5kIHRyaXAgYWdhaW5zdCB0aGUgbGl2ZSBzZXJ2ZXIuCi0gYHRlc3RfY29uY3VycmVudF9hY3F1aXJlX25ldmVyX2V4Y2VlZHNfbWF4c2l6ZWAgaXMgdGhlIG1hbnktY2xpZW50IHJhY2UgdGhlIHVuaXQgc3VpdGUgZGVmZXJzIHRvIGEgcmVhbCBzZXJ2ZXIgKGB0ZXN0cy91bml0L3V0aWxzL3Rlc3RfaW5pdF9zZW1hcGhvcmUucHk6OGApOiB0d2VsdmUgYmFycmllci1zeW5jaHJvbmlzZWQgdGhyZWFkcyBjb250ZW5kIGZvciB0aHJlZSBzbG90cyBhbmQgZXhhY3RseSB0aHJlZSBnZXQgaW4uCgpFYWNoIHRlc3QgdXNlcyBhIHV1aWQga2V5IGFuZCBkZWxldGVzIGl0IGFmdGVyd2FyZHMsIHNvIHJ1bnMgc3RheSBpbmRlcGVuZGVudCBvZiBvbmUgYW5vdGhlci4KCiMjIFZlcmlmaWNhdGlvbgoKQWdhaW5zdCBhIHRocm93YXdheSBgcmVkaXM6Ny1hbHBpbmVgIGNvbnRhaW5lciwgYHB5dGVzdCB0ZXN0cy9pbnRlZ3JhdGlvbi90ZXN0X3NlbWFwaG9yZS5weWAgcmVwb3J0cyAxMCBwYXNzZWQsIHJlcGVhdGVkIHRocmVlIHRpbWVzIHdpdGhvdXQgZmxha2luZXNzLiBXaXRoIFJlZGlzIHN0b3BwZWQgaXQgcmVwb3J0cyAxMCBza2lwcGVkIHJhdGhlciB0aGFuIGZhaWxpbmcsIHBlciB0aGUgc2tpcCBsb2dpYyBpbiBgdGVzdHMvaW50ZWdyYXRpb24vY29uZnRlc3QucHlgLgoKVGhlIHJhY2UgdGVzdCB3YXMgY2hlY2tlZCBmb3IgdGVldGg6IHJlcGxheWluZyB0aGUgc2FtZSB0d2VsdmUgdGhyZWFkcyB3aXRoIGEgZGVsaWJlcmF0ZWx5IG5vbi1hdG9taWMgYWNxdWlyZSAoYFpDQVJEYCB0aGVuIGBaQUREYCBpbiB0d28gcm91bmQgdHJpcHMpIGFkbWl0dGVkIDYgdG8gNyBob2xkZXJzIHdoZXJlIGBtYXhzaXplYCBpcyAzLCBzbyB0aGUgdGVzdCBmYWlscyBsb3VkbHkgb24gdGhlIGJ1ZyB0aGUgTHVhIHNjcmlwdCBwcmV2ZW50cy4KCkNsb3NlcyAjMjQwMQo=
      patchset: a744fbb435ef3c2b229d7ba5ad4b824f1577f6db
      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/python-osism:
            canonical_name: github.com/osism/python-osism
            checkout: main
            commit: a7285c1d36eb0be89ca7b418d6731801a2a0d1e0
          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: dcb06ea8a3ad422cc9d98b376216617b2daa6a02
        playbooks:
        - path: untrusted/project_0/github.com/osism/python-osism/playbooks/test-unit.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: a7285c1d36eb0be89ca7b418d6731801a2a0d1e0
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2548/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
