all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fefa:515b
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: db45404d-eaf6-471d-9396-01224d3842b1
        host_id: 4ba4344415ca7057d9956ea5de826bbc0b830981e82c0e0f191fa07b
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fefa:515b
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.131
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.77
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fefa:515b
        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 hadolint explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#37>'
      - '<Job hadolint explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: ab102f6e146a4f75b0063481043f6952
      build_refs:
      - branch: main
        change: '2419'
        change_message: "utils: Make RedisSemaphore.acquire atomic\n\n## Problem\n\n`RedisSemaphore.acquire()`
          checked capacity and took a slot in two\nseparate Redis round-trips:\n\n```python\nif
          self.redis.zcard(self.key) < self.maxsize:   # CHECK\n    self.redis.zadd(self.key,
          {identifier: now}) # USE\n```\n\nThis is a time-of-check-to-time-of-use
          race: two clients can both run\n`ZCARD`, both observe a free slot, and both
          `ZADD`, leaving the sorted set\nwith more than `maxsize` members. The semaphore
          that bounds concurrent\nNetBox connections (`create_netbox_semaphore`, `maxsize
          =\nNETBOX_MAX_CONNECTIONS`, default 5) therefore over-admits under contention\n\u2014
          exactly when the cap matters most. A local 50-client harness peaked at\n**22
          holders against maxsize 5**.\n\nA second, opposite defect lived in the same
          method: the cleanup boundary\n`now - 60` was computed once before the retry
          loop, so it never advanced\nwhile a caller waited. Holders that expired
          *during* the wait were never\nreclaimed, causing spurious timeouts when
          capacity had actually freed.\n\n## Fix\n\nReplace the check-and-acquire
          with a single server-side Lua `EVAL` that\nperforms expired-holder cleanup,
          the capacity check, and the slot\nreservation in one atomic step, so no
          other client can interleave between\nthe check and the reservation. Because
          `now` is recomputed each iteration\nand passed into the script, the reclaim
          boundary advances with wall-clock\ntime \u2014 fixing the second defect
          in the same change. The 60-second window\nis named `HOLDER_EXPIRY`.\n\n##
          Testing\n\nThe race needs genuinely concurrent clients against a real Redis
          and is\nnot reproducible with a mock. It was validated locally with a threaded\nreal-Redis
          harness (over-admit on the old code, never on the fixed code).\nThe committed
          regression tests run the production Lua script against\nin-memory `fakeredis`
          (added as a dev dependency, with `lupa` for Lua\nsupport) and pin the two
          invariants: the holder set never exceeds\n`maxsize`, and the reclaim boundary
          advances across retries so a slot\nfreed mid-wait is granted.\n\n## Notes\n\n-
          Surfaced while reviewing the test-only PR below; this is a pre-existing\n
          \ production defect in code that PR does not touch, so it is fixed\n  separately:\n
          \ - osism/python-osism#2349\n- That PR adds tests pinning the previous behavior
          (including the frozen\n  cleanup boundary); whichever lands second will
          need those assertions\n  reconciled against this change.\n\n\U0001F916 Generated
          with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2419
        commit_id: 03c4cff89b0486c5febf807c1aecc2fa7a1c79b9
        patchset: 03c4cff89b0486c5febf807c1aecc2fa7a1c79b9
        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: d0a24267d0884b26873e7dff4e13a737
      buildset_refs:
      - branch: main
        change: '2419'
        change_message: "utils: Make RedisSemaphore.acquire atomic\n\n## Problem\n\n`RedisSemaphore.acquire()`
          checked capacity and took a slot in two\nseparate Redis round-trips:\n\n```python\nif
          self.redis.zcard(self.key) < self.maxsize:   # CHECK\n    self.redis.zadd(self.key,
          {identifier: now}) # USE\n```\n\nThis is a time-of-check-to-time-of-use
          race: two clients can both run\n`ZCARD`, both observe a free slot, and both
          `ZADD`, leaving the sorted set\nwith more than `maxsize` members. The semaphore
          that bounds concurrent\nNetBox connections (`create_netbox_semaphore`, `maxsize
          =\nNETBOX_MAX_CONNECTIONS`, default 5) therefore over-admits under contention\n\u2014
          exactly when the cap matters most. A local 50-client harness peaked at\n**22
          holders against maxsize 5**.\n\nA second, opposite defect lived in the same
          method: the cleanup boundary\n`now - 60` was computed once before the retry
          loop, so it never advanced\nwhile a caller waited. Holders that expired
          *during* the wait were never\nreclaimed, causing spurious timeouts when
          capacity had actually freed.\n\n## Fix\n\nReplace the check-and-acquire
          with a single server-side Lua `EVAL` that\nperforms expired-holder cleanup,
          the capacity check, and the slot\nreservation in one atomic step, so no
          other client can interleave between\nthe check and the reservation. Because
          `now` is recomputed each iteration\nand passed into the script, the reclaim
          boundary advances with wall-clock\ntime \u2014 fixing the second defect
          in the same change. The 60-second window\nis named `HOLDER_EXPIRY`.\n\n##
          Testing\n\nThe race needs genuinely concurrent clients against a real Redis
          and is\nnot reproducible with a mock. It was validated locally with a threaded\nreal-Redis
          harness (over-admit on the old code, never on the fixed code).\nThe committed
          regression tests run the production Lua script against\nin-memory `fakeredis`
          (added as a dev dependency, with `lupa` for Lua\nsupport) and pin the two
          invariants: the holder set never exceeds\n`maxsize`, and the reclaim boundary
          advances across retries so a slot\nfreed mid-wait is granted.\n\n## Notes\n\n-
          Surfaced while reviewing the test-only PR below; this is a pre-existing\n
          \ production defect in code that PR does not touch, so it is fixed\n  separately:\n
          \ - osism/python-osism#2349\n- That PR adds tests pinning the previous behavior
          (including the frozen\n  cleanup boundary); whichever lands second will
          need those assertions\n  reconciled against this change.\n\n\U0001F916 Generated
          with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2419
        commit_id: 03c4cff89b0486c5febf807c1aecc2fa7a1c79b9
        patchset: 03c4cff89b0486c5febf807c1aecc2fa7a1c79b9
        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: '2419'
      change_message: "utils: Make RedisSemaphore.acquire atomic\n\n## Problem\n\n`RedisSemaphore.acquire()`
        checked capacity and took a slot in two\nseparate Redis round-trips:\n\n```python\nif
        self.redis.zcard(self.key) < self.maxsize:   # CHECK\n    self.redis.zadd(self.key,
        {identifier: now}) # USE\n```\n\nThis is a time-of-check-to-time-of-use race:
        two clients can both run\n`ZCARD`, both observe a free slot, and both `ZADD`,
        leaving the sorted set\nwith more than `maxsize` members. The semaphore that
        bounds concurrent\nNetBox connections (`create_netbox_semaphore`, `maxsize
        =\nNETBOX_MAX_CONNECTIONS`, default 5) therefore over-admits under contention\n\u2014
        exactly when the cap matters most. A local 50-client harness peaked at\n**22
        holders against maxsize 5**.\n\nA second, opposite defect lived in the same
        method: the cleanup boundary\n`now - 60` was computed once before the retry
        loop, so it never advanced\nwhile a caller waited. Holders that expired *during*
        the wait were never\nreclaimed, causing spurious timeouts when capacity had
        actually freed.\n\n## Fix\n\nReplace the check-and-acquire with a single server-side
        Lua `EVAL` that\nperforms expired-holder cleanup, the capacity check, and
        the slot\nreservation in one atomic step, so no other client can interleave
        between\nthe check and the reservation. Because `now` is recomputed each iteration\nand
        passed into the script, the reclaim boundary advances with wall-clock\ntime
        \u2014 fixing the second defect in the same change. The 60-second window\nis
        named `HOLDER_EXPIRY`.\n\n## Testing\n\nThe race needs genuinely concurrent
        clients against a real Redis and is\nnot reproducible with a mock. It was
        validated locally with a threaded\nreal-Redis harness (over-admit on the old
        code, never on the fixed code).\nThe committed regression tests run the production
        Lua script against\nin-memory `fakeredis` (added as a dev dependency, with
        `lupa` for Lua\nsupport) and pin the two invariants: the holder set never
        exceeds\n`maxsize`, and the reclaim boundary advances across retries so a
        slot\nfreed mid-wait is granted.\n\n## Notes\n\n- Surfaced while reviewing
        the test-only PR below; this is a pre-existing\n  production defect in code
        that PR does not touch, so it is fixed\n  separately:\n  - osism/python-osism#2349\n-
        That PR adds tests pinning the previous behavior (including the frozen\n  cleanup
        boundary); whichever lands second will need those assertions\n  reconciled
        against this change.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)"
      change_url: https://github.com/osism/python-osism/pull/2419
      child_jobs: []
      commit_id: 03c4cff89b0486c5febf807c1aecc2fa7a1c79b9
      event_id: e669ff00-73e4-11f1-9c07-c1e6dad47c0a
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/ab102f6e146a4f75b0063481043f6952/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/ab102f6e146a4f75b0063481043f6952/work/logs
        result_data_file: /var/lib/zuul/builds/ab102f6e146a4f75b0063481043f6952/work/results.json
        src_root: /var/lib/zuul/builds/ab102f6e146a4f75b0063481043f6952/work/src
        work_root: /var/lib/zuul/builds/ab102f6e146a4f75b0063481043f6952/work
      include_vars: []
      items:
      - branch: main
        change: '2419'
        change_message: "utils: Make RedisSemaphore.acquire atomic\n\n## Problem\n\n`RedisSemaphore.acquire()`
          checked capacity and took a slot in two\nseparate Redis round-trips:\n\n```python\nif
          self.redis.zcard(self.key) < self.maxsize:   # CHECK\n    self.redis.zadd(self.key,
          {identifier: now}) # USE\n```\n\nThis is a time-of-check-to-time-of-use
          race: two clients can both run\n`ZCARD`, both observe a free slot, and both
          `ZADD`, leaving the sorted set\nwith more than `maxsize` members. The semaphore
          that bounds concurrent\nNetBox connections (`create_netbox_semaphore`, `maxsize
          =\nNETBOX_MAX_CONNECTIONS`, default 5) therefore over-admits under contention\n\u2014
          exactly when the cap matters most. A local 50-client harness peaked at\n**22
          holders against maxsize 5**.\n\nA second, opposite defect lived in the same
          method: the cleanup boundary\n`now - 60` was computed once before the retry
          loop, so it never advanced\nwhile a caller waited. Holders that expired
          *during* the wait were never\nreclaimed, causing spurious timeouts when
          capacity had actually freed.\n\n## Fix\n\nReplace the check-and-acquire
          with a single server-side Lua `EVAL` that\nperforms expired-holder cleanup,
          the capacity check, and the slot\nreservation in one atomic step, so no
          other client can interleave between\nthe check and the reservation. Because
          `now` is recomputed each iteration\nand passed into the script, the reclaim
          boundary advances with wall-clock\ntime \u2014 fixing the second defect
          in the same change. The 60-second window\nis named `HOLDER_EXPIRY`.\n\n##
          Testing\n\nThe race needs genuinely concurrent clients against a real Redis
          and is\nnot reproducible with a mock. It was validated locally with a threaded\nreal-Redis
          harness (over-admit on the old code, never on the fixed code).\nThe committed
          regression tests run the production Lua script against\nin-memory `fakeredis`
          (added as a dev dependency, with `lupa` for Lua\nsupport) and pin the two
          invariants: the holder set never exceeds\n`maxsize`, and the reclaim boundary
          advances across retries so a slot\nfreed mid-wait is granted.\n\n## Notes\n\n-
          Surfaced while reviewing the test-only PR below; this is a pre-existing\n
          \ production defect in code that PR does not touch, so it is fixed\n  separately:\n
          \ - osism/python-osism#2349\n- That PR adds tests pinning the previous behavior
          (including the frozen\n  cleanup boundary); whichever lands second will
          need those assertions\n  reconciled against this change.\n\n\U0001F916 Generated
          with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2419
        commit_id: 03c4cff89b0486c5febf807c1aecc2fa7a1c79b9
        patchset: 03c4cff89b0486c5febf807c1aecc2fa7a1c79b9
        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: hadolint
      jobtags: []
      max_attempts: 3
      message: dXRpbHM6IE1ha2UgUmVkaXNTZW1hcGhvcmUuYWNxdWlyZSBhdG9taWMKCiMjIFByb2JsZW0KCmBSZWRpc1NlbWFwaG9yZS5hY3F1aXJlKClgIGNoZWNrZWQgY2FwYWNpdHkgYW5kIHRvb2sgYSBzbG90IGluIHR3bwpzZXBhcmF0ZSBSZWRpcyByb3VuZC10cmlwczoKCmBgYHB5dGhvbgppZiBzZWxmLnJlZGlzLnpjYXJkKHNlbGYua2V5KSA8IHNlbGYubWF4c2l6ZTogICAjIENIRUNLCiAgICBzZWxmLnJlZGlzLnphZGQoc2VsZi5rZXksIHtpZGVudGlmaWVyOiBub3d9KSAjIFVTRQpgYGAKClRoaXMgaXMgYSB0aW1lLW9mLWNoZWNrLXRvLXRpbWUtb2YtdXNlIHJhY2U6IHR3byBjbGllbnRzIGNhbiBib3RoIHJ1bgpgWkNBUkRgLCBib3RoIG9ic2VydmUgYSBmcmVlIHNsb3QsIGFuZCBib3RoIGBaQUREYCwgbGVhdmluZyB0aGUgc29ydGVkIHNldAp3aXRoIG1vcmUgdGhhbiBgbWF4c2l6ZWAgbWVtYmVycy4gVGhlIHNlbWFwaG9yZSB0aGF0IGJvdW5kcyBjb25jdXJyZW50Ck5ldEJveCBjb25uZWN0aW9ucyAoYGNyZWF0ZV9uZXRib3hfc2VtYXBob3JlYCwgYG1heHNpemUgPQpORVRCT1hfTUFYX0NPTk5FQ1RJT05TYCwgZGVmYXVsdCA1KSB0aGVyZWZvcmUgb3Zlci1hZG1pdHMgdW5kZXIgY29udGVudGlvbgrigJQgZXhhY3RseSB3aGVuIHRoZSBjYXAgbWF0dGVycyBtb3N0LiBBIGxvY2FsIDUwLWNsaWVudCBoYXJuZXNzIHBlYWtlZCBhdAoqKjIyIGhvbGRlcnMgYWdhaW5zdCBtYXhzaXplIDUqKi4KCkEgc2Vjb25kLCBvcHBvc2l0ZSBkZWZlY3QgbGl2ZWQgaW4gdGhlIHNhbWUgbWV0aG9kOiB0aGUgY2xlYW51cCBib3VuZGFyeQpgbm93IC0gNjBgIHdhcyBjb21wdXRlZCBvbmNlIGJlZm9yZSB0aGUgcmV0cnkgbG9vcCwgc28gaXQgbmV2ZXIgYWR2YW5jZWQKd2hpbGUgYSBjYWxsZXIgd2FpdGVkLiBIb2xkZXJzIHRoYXQgZXhwaXJlZCAqZHVyaW5nKiB0aGUgd2FpdCB3ZXJlIG5ldmVyCnJlY2xhaW1lZCwgY2F1c2luZyBzcHVyaW91cyB0aW1lb3V0cyB3aGVuIGNhcGFjaXR5IGhhZCBhY3R1YWxseSBmcmVlZC4KCiMjIEZpeAoKUmVwbGFjZSB0aGUgY2hlY2stYW5kLWFjcXVpcmUgd2l0aCBhIHNpbmdsZSBzZXJ2ZXItc2lkZSBMdWEgYEVWQUxgIHRoYXQKcGVyZm9ybXMgZXhwaXJlZC1ob2xkZXIgY2xlYW51cCwgdGhlIGNhcGFjaXR5IGNoZWNrLCBhbmQgdGhlIHNsb3QKcmVzZXJ2YXRpb24gaW4gb25lIGF0b21pYyBzdGVwLCBzbyBubyBvdGhlciBjbGllbnQgY2FuIGludGVybGVhdmUgYmV0d2Vlbgp0aGUgY2hlY2sgYW5kIHRoZSByZXNlcnZhdGlvbi4gQmVjYXVzZSBgbm93YCBpcyByZWNvbXB1dGVkIGVhY2ggaXRlcmF0aW9uCmFuZCBwYXNzZWQgaW50byB0aGUgc2NyaXB0LCB0aGUgcmVjbGFpbSBib3VuZGFyeSBhZHZhbmNlcyB3aXRoIHdhbGwtY2xvY2sKdGltZSDigJQgZml4aW5nIHRoZSBzZWNvbmQgZGVmZWN0IGluIHRoZSBzYW1lIGNoYW5nZS4gVGhlIDYwLXNlY29uZCB3aW5kb3cKaXMgbmFtZWQgYEhPTERFUl9FWFBJUllgLgoKIyMgVGVzdGluZwoKVGhlIHJhY2UgbmVlZHMgZ2VudWluZWx5IGNvbmN1cnJlbnQgY2xpZW50cyBhZ2FpbnN0IGEgcmVhbCBSZWRpcyBhbmQgaXMKbm90IHJlcHJvZHVjaWJsZSB3aXRoIGEgbW9jay4gSXQgd2FzIHZhbGlkYXRlZCBsb2NhbGx5IHdpdGggYSB0aHJlYWRlZApyZWFsLVJlZGlzIGhhcm5lc3MgKG92ZXItYWRtaXQgb24gdGhlIG9sZCBjb2RlLCBuZXZlciBvbiB0aGUgZml4ZWQgY29kZSkuClRoZSBjb21taXR0ZWQgcmVncmVzc2lvbiB0ZXN0cyBydW4gdGhlIHByb2R1Y3Rpb24gTHVhIHNjcmlwdCBhZ2FpbnN0CmluLW1lbW9yeSBgZmFrZXJlZGlzYCAoYWRkZWQgYXMgYSBkZXYgZGVwZW5kZW5jeSwgd2l0aCBgbHVwYWAgZm9yIEx1YQpzdXBwb3J0KSBhbmQgcGluIHRoZSB0d28gaW52YXJpYW50czogdGhlIGhvbGRlciBzZXQgbmV2ZXIgZXhjZWVkcwpgbWF4c2l6ZWAsIGFuZCB0aGUgcmVjbGFpbSBib3VuZGFyeSBhZHZhbmNlcyBhY3Jvc3MgcmV0cmllcyBzbyBhIHNsb3QKZnJlZWQgbWlkLXdhaXQgaXMgZ3JhbnRlZC4KCiMjIE5vdGVzCgotIFN1cmZhY2VkIHdoaWxlIHJldmlld2luZyB0aGUgdGVzdC1vbmx5IFBSIGJlbG93OyB0aGlzIGlzIGEgcHJlLWV4aXN0aW5nCiAgcHJvZHVjdGlvbiBkZWZlY3QgaW4gY29kZSB0aGF0IFBSIGRvZXMgbm90IHRvdWNoLCBzbyBpdCBpcyBmaXhlZAogIHNlcGFyYXRlbHk6CiAgLSBvc2lzbS9weXRob24tb3Npc20jMjM0OQotIFRoYXQgUFIgYWRkcyB0ZXN0cyBwaW5uaW5nIHRoZSBwcmV2aW91cyBiZWhhdmlvciAoaW5jbHVkaW5nIHRoZSBmcm96ZW4KICBjbGVhbnVwIGJvdW5kYXJ5KTsgd2hpY2hldmVyIGxhbmRzIHNlY29uZCB3aWxsIG5lZWQgdGhvc2UgYXNzZXJ0aW9ucwogIHJlY29uY2lsZWQgYWdhaW5zdCB0aGlzIGNoYW5nZS4KCvCfpJYgR2VuZXJhdGVkIHdpdGggW0NsYXVkZSBDb2RlXShodHRwczovL2NsYXVkZS5jb20vY2xhdWRlLWNvZGUp
      patchset: 03c4cff89b0486c5febf807c1aecc2fa7a1c79b9
      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/hadolint/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: 1540fd76baecf2c12e73010fa4fd5b2aa26e0d24
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2419/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
