all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe68:6c42
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 11791720-31ac-46cb-a20a-678c0d9041ac
        host_id: 82101243836454d7401d5893feae9e2c5df7cc291646d8a99b33b53b
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe68:6c42
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.0.109
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.147
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe68:6c42
        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 mypy explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#42>'
      - '<Job mypy explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 9e54e4ec6c084cb9a51385ec0c41bc80
      build_refs:
      - branch: main
        change: '2560'
        change_message: "Refuse breakouts that claim other ports\n\nA detected breakout
          names its children after the master's lane offsets \u2014\n`Ethernet<base
          + n*lanes_per_child>` \u2014 which assumes every slot below the next\nmaster
          is free. That holds for every port of every bundled HWSKU except one.\n\nOn
          **Accton-AS7726-32X** the last 100G port has four lanes, but the next two\nport
          names are already taken by independent 10G SFP+ ports:\n\n```\nEthernet124
          \    125,126,127,128       hundredGigE32     32    100000\nEthernet125     129
          \                  tenGigE33         33     10000\nEthernet126     128                   tenGigE34
          \        34     10000\n```\n\nA 4x breakout of `Ethernet124` generates children
          `Ethernet124/125/126/127`, so\nit claims `Ethernet125` and `Ethernet126`
          as sub-ports of a cage they are not\npart of.\n\n## What that does to the
          generated config\n\n| port | before | after a 4x25G breakout of Ethernet124
          |\n|------|--------|----------------------------------------|\n| `Ethernet125`
          | `lanes=129 speed=10000 alias=Eth1/33` | `lanes=126 speed=25000 alias=Eth1/33/1`
          |\n| `Ethernet126` | `lanes=128 speed=10000 alias=Eth1/34` | `lanes=127
          speed=25000 alias=Eth1/34/1` |\n\nAll three fields are wrong, and both ports
          are re-presented as breakout\nsub-ports. Two things make this reach a real
          switch rather than staying\ntheoretical:\n\n- a `breakout_ports` entry is
          **authoritative** for a port's lanes and speed \u2014\n  the declared path
          stashes them directly, the inferred path recomputes them\n  from the *master's*
          lane list via `_calculate_breakout_port_lane()`;\n- the `PORT` table is
          built from **every entry in `port_config`**, not only the\n  interfaces
          present in NetBox, so no NetBox modelling of the SFP ports is\n  needed
          for them to be emitted and corrupted. Every generated config for that\n
          \ HWSKU already contains all 34 ports.\n\n`2x50G` collides the same way,
          on `Ethernet126` alone.\n\n## The fix\n\n`_breakout_child_collisions()`
          returns any child name that is a port of this\nHWSKU in its own right. Both
          affected paths now check it **before mutating\nanything**, so the group
          is dropped whole rather than half-applied and the\nmaster keeps its own
          configuration:\n\n- the `Eth<module>/<port>/<subport>` path, which computes
          child names from the\n  master offset and had no check at all;\n- the SONiC-name
          400G grouping path, likewise.\n\nThe SONiC-name **standard** grouping path
          needed no change. Its existing\ntopology gate already skips a group whose
          intermediate slots are ports in\n`port_config` \u2014 the same condition
          \u2014 so only a comment was added there,\nrecording that the gate is load-bearing
          for correctness and not only for the\nnative-port misdetection it was written
          to prevent.\n\nThe collision test is simply that a child name other than
          the master is itself a\nkey in `port_config`. Swept across every master
          of all nine bundled HWSKUs at\n1x/2x/4x/8x, it flags exactly the three real
          cases on that one HWSKU and nothing\nelse, so it needs no per-HWSKU exception
          list and no false positives to\nsuppress.\n\n## Why the existing tests could
          not have caught this\n\nEvery breakout test builds its `port_config` from
          a helper that returns a\n**single entry** (occasionally two). A one-port
          `port_config` cannot express a\nchild slot occupied by another port, so
          this class of bug was structurally\nunreachable by the suite \u2014 the
          fixtures encoded the same assumption as the code.\n\nThe new tests therefore
          load the `.ini` files shipped in this repo. The 400G case\nkeeps a synthetic
          `port_config`, because no bundled HWSKU has an 8-lane master\nwith an occupied
          child slot.\n\n## Note on the underlying port config\n\nWorth flagging for
          whoever owns those files, though it is deliberately **not**\nchanged here.
          Upstream `sonic-buildimage` ships 32 ports for this HWSKU \u2014\n`Ethernet125`/`Ethernet126`
          do not exist there \u2014 and its Broadcom config carries\nthem only as
          commented-out entries (`#portmap_130=128:10:m`,\n`#portmap_66=129:10:m`).
          Lane 128 is muxed between the last 100G port's fourth\nlane and a 10G port,
          so the vendor ships the 10G ports disabled to leave the\n100G port all four
          lanes. `Accton-AS7326-56X.ini` has the same lane-128 overlap.\n\nSo these
          files declare port pairs the hardware cannot run simultaneously, which\nis
          a data question separate from this change. Refusing to silently claim a
          port\nthat exists is correct either way, which is why the guard goes in
          regardless of\nhow that is settled.\n\n## Verification\n\n- Full unit suite
          green; `tests/unit/tasks/conductor/sonic` at 701 passed.\n- Each new guard
          verified to fail loudly: with the guards disabled, exactly the\n  two corresponding
          tests fail, while the topology-gate test and the\n  breakout-still-works
          control keep passing.\n- `flake8` and `black` clean.\n"
        change_url: https://github.com/osism/python-osism/pull/2560
        commit_id: 8018af52dedd22572fcb74438370cef2ea7fea52
        patchset: 8018af52dedd22572fcb74438370cef2ea7fea52
        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: 98e87db467904cb389945f85c51a01ac
      buildset_refs:
      - branch: main
        change: '2560'
        change_message: "Refuse breakouts that claim other ports\n\nA detected breakout
          names its children after the master's lane offsets \u2014\n`Ethernet<base
          + n*lanes_per_child>` \u2014 which assumes every slot below the next\nmaster
          is free. That holds for every port of every bundled HWSKU except one.\n\nOn
          **Accton-AS7726-32X** the last 100G port has four lanes, but the next two\nport
          names are already taken by independent 10G SFP+ ports:\n\n```\nEthernet124
          \    125,126,127,128       hundredGigE32     32    100000\nEthernet125     129
          \                  tenGigE33         33     10000\nEthernet126     128                   tenGigE34
          \        34     10000\n```\n\nA 4x breakout of `Ethernet124` generates children
          `Ethernet124/125/126/127`, so\nit claims `Ethernet125` and `Ethernet126`
          as sub-ports of a cage they are not\npart of.\n\n## What that does to the
          generated config\n\n| port | before | after a 4x25G breakout of Ethernet124
          |\n|------|--------|----------------------------------------|\n| `Ethernet125`
          | `lanes=129 speed=10000 alias=Eth1/33` | `lanes=126 speed=25000 alias=Eth1/33/1`
          |\n| `Ethernet126` | `lanes=128 speed=10000 alias=Eth1/34` | `lanes=127
          speed=25000 alias=Eth1/34/1` |\n\nAll three fields are wrong, and both ports
          are re-presented as breakout\nsub-ports. Two things make this reach a real
          switch rather than staying\ntheoretical:\n\n- a `breakout_ports` entry is
          **authoritative** for a port's lanes and speed \u2014\n  the declared path
          stashes them directly, the inferred path recomputes them\n  from the *master's*
          lane list via `_calculate_breakout_port_lane()`;\n- the `PORT` table is
          built from **every entry in `port_config`**, not only the\n  interfaces
          present in NetBox, so no NetBox modelling of the SFP ports is\n  needed
          for them to be emitted and corrupted. Every generated config for that\n
          \ HWSKU already contains all 34 ports.\n\n`2x50G` collides the same way,
          on `Ethernet126` alone.\n\n## The fix\n\n`_breakout_child_collisions()`
          returns any child name that is a port of this\nHWSKU in its own right. Both
          affected paths now check it **before mutating\nanything**, so the group
          is dropped whole rather than half-applied and the\nmaster keeps its own
          configuration:\n\n- the `Eth<module>/<port>/<subport>` path, which computes
          child names from the\n  master offset and had no check at all;\n- the SONiC-name
          400G grouping path, likewise.\n\nThe SONiC-name **standard** grouping path
          needed no change. Its existing\ntopology gate already skips a group whose
          intermediate slots are ports in\n`port_config` \u2014 the same condition
          \u2014 so only a comment was added there,\nrecording that the gate is load-bearing
          for correctness and not only for the\nnative-port misdetection it was written
          to prevent.\n\nThe collision test is simply that a child name other than
          the master is itself a\nkey in `port_config`. Swept across every master
          of all nine bundled HWSKUs at\n1x/2x/4x/8x, it flags exactly the three real
          cases on that one HWSKU and nothing\nelse, so it needs no per-HWSKU exception
          list and no false positives to\nsuppress.\n\n## Why the existing tests could
          not have caught this\n\nEvery breakout test builds its `port_config` from
          a helper that returns a\n**single entry** (occasionally two). A one-port
          `port_config` cannot express a\nchild slot occupied by another port, so
          this class of bug was structurally\nunreachable by the suite \u2014 the
          fixtures encoded the same assumption as the code.\n\nThe new tests therefore
          load the `.ini` files shipped in this repo. The 400G case\nkeeps a synthetic
          `port_config`, because no bundled HWSKU has an 8-lane master\nwith an occupied
          child slot.\n\n## Note on the underlying port config\n\nWorth flagging for
          whoever owns those files, though it is deliberately **not**\nchanged here.
          Upstream `sonic-buildimage` ships 32 ports for this HWSKU \u2014\n`Ethernet125`/`Ethernet126`
          do not exist there \u2014 and its Broadcom config carries\nthem only as
          commented-out entries (`#portmap_130=128:10:m`,\n`#portmap_66=129:10:m`).
          Lane 128 is muxed between the last 100G port's fourth\nlane and a 10G port,
          so the vendor ships the 10G ports disabled to leave the\n100G port all four
          lanes. `Accton-AS7326-56X.ini` has the same lane-128 overlap.\n\nSo these
          files declare port pairs the hardware cannot run simultaneously, which\nis
          a data question separate from this change. Refusing to silently claim a
          port\nthat exists is correct either way, which is why the guard goes in
          regardless of\nhow that is settled.\n\n## Verification\n\n- Full unit suite
          green; `tests/unit/tasks/conductor/sonic` at 701 passed.\n- Each new guard
          verified to fail loudly: with the guards disabled, exactly the\n  two corresponding
          tests fail, while the topology-gate test and the\n  breakout-still-works
          control keep passing.\n- `flake8` and `black` clean.\n"
        change_url: https://github.com/osism/python-osism/pull/2560
        commit_id: 8018af52dedd22572fcb74438370cef2ea7fea52
        patchset: 8018af52dedd22572fcb74438370cef2ea7fea52
        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: '2560'
      change_message: "Refuse breakouts that claim other ports\n\nA detected breakout
        names its children after the master's lane offsets \u2014\n`Ethernet<base
        + n*lanes_per_child>` \u2014 which assumes every slot below the next\nmaster
        is free. That holds for every port of every bundled HWSKU except one.\n\nOn
        **Accton-AS7726-32X** the last 100G port has four lanes, but the next two\nport
        names are already taken by independent 10G SFP+ ports:\n\n```\nEthernet124
        \    125,126,127,128       hundredGigE32     32    100000\nEthernet125     129
        \                  tenGigE33         33     10000\nEthernet126     128                   tenGigE34
        \        34     10000\n```\n\nA 4x breakout of `Ethernet124` generates children
        `Ethernet124/125/126/127`, so\nit claims `Ethernet125` and `Ethernet126` as
        sub-ports of a cage they are not\npart of.\n\n## What that does to the generated
        config\n\n| port | before | after a 4x25G breakout of Ethernet124 |\n|------|--------|----------------------------------------|\n|
        `Ethernet125` | `lanes=129 speed=10000 alias=Eth1/33` | `lanes=126 speed=25000
        alias=Eth1/33/1` |\n| `Ethernet126` | `lanes=128 speed=10000 alias=Eth1/34`
        | `lanes=127 speed=25000 alias=Eth1/34/1` |\n\nAll three fields are wrong,
        and both ports are re-presented as breakout\nsub-ports. Two things make this
        reach a real switch rather than staying\ntheoretical:\n\n- a `breakout_ports`
        entry is **authoritative** for a port's lanes and speed \u2014\n  the declared
        path stashes them directly, the inferred path recomputes them\n  from the
        *master's* lane list via `_calculate_breakout_port_lane()`;\n- the `PORT`
        table is built from **every entry in `port_config`**, not only the\n  interfaces
        present in NetBox, so no NetBox modelling of the SFP ports is\n  needed for
        them to be emitted and corrupted. Every generated config for that\n  HWSKU
        already contains all 34 ports.\n\n`2x50G` collides the same way, on `Ethernet126`
        alone.\n\n## The fix\n\n`_breakout_child_collisions()` returns any child name
        that is a port of this\nHWSKU in its own right. Both affected paths now check
        it **before mutating\nanything**, so the group is dropped whole rather than
        half-applied and the\nmaster keeps its own configuration:\n\n- the `Eth<module>/<port>/<subport>`
        path, which computes child names from the\n  master offset and had no check
        at all;\n- the SONiC-name 400G grouping path, likewise.\n\nThe SONiC-name
        **standard** grouping path needed no change. Its existing\ntopology gate already
        skips a group whose intermediate slots are ports in\n`port_config` \u2014
        the same condition \u2014 so only a comment was added there,\nrecording that
        the gate is load-bearing for correctness and not only for the\nnative-port
        misdetection it was written to prevent.\n\nThe collision test is simply that
        a child name other than the master is itself a\nkey in `port_config`. Swept
        across every master of all nine bundled HWSKUs at\n1x/2x/4x/8x, it flags exactly
        the three real cases on that one HWSKU and nothing\nelse, so it needs no per-HWSKU
        exception list and no false positives to\nsuppress.\n\n## Why the existing
        tests could not have caught this\n\nEvery breakout test builds its `port_config`
        from a helper that returns a\n**single entry** (occasionally two). A one-port
        `port_config` cannot express a\nchild slot occupied by another port, so this
        class of bug was structurally\nunreachable by the suite \u2014 the fixtures
        encoded the same assumption as the code.\n\nThe new tests therefore load the
        `.ini` files shipped in this repo. The 400G case\nkeeps a synthetic `port_config`,
        because no bundled HWSKU has an 8-lane master\nwith an occupied child slot.\n\n##
        Note on the underlying port config\n\nWorth flagging for whoever owns those
        files, though it is deliberately **not**\nchanged here. Upstream `sonic-buildimage`
        ships 32 ports for this HWSKU \u2014\n`Ethernet125`/`Ethernet126` do not exist
        there \u2014 and its Broadcom config carries\nthem only as commented-out entries
        (`#portmap_130=128:10:m`,\n`#portmap_66=129:10:m`). Lane 128 is muxed between
        the last 100G port's fourth\nlane and a 10G port, so the vendor ships the
        10G ports disabled to leave the\n100G port all four lanes. `Accton-AS7326-56X.ini`
        has the same lane-128 overlap.\n\nSo these files declare port pairs the hardware
        cannot run simultaneously, which\nis a data question separate from this change.
        Refusing to silently claim a port\nthat exists is correct either way, which
        is why the guard goes in regardless of\nhow that is settled.\n\n## Verification\n\n-
        Full unit suite green; `tests/unit/tasks/conductor/sonic` at 701 passed.\n-
        Each new guard verified to fail loudly: with the guards disabled, exactly
        the\n  two corresponding tests fail, while the topology-gate test and the\n
        \ breakout-still-works control keep passing.\n- `flake8` and `black` clean.\n"
      change_url: https://github.com/osism/python-osism/pull/2560
      child_jobs: []
      commit_id: 8018af52dedd22572fcb74438370cef2ea7fea52
      event_id: a0113cb0-90c4-11f1-9ebd-73a9e59b50af
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/9e54e4ec6c084cb9a51385ec0c41bc80/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/9e54e4ec6c084cb9a51385ec0c41bc80/work/logs
        result_data_file: /var/lib/zuul/builds/9e54e4ec6c084cb9a51385ec0c41bc80/work/results.json
        src_root: /var/lib/zuul/builds/9e54e4ec6c084cb9a51385ec0c41bc80/work/src
        work_root: /var/lib/zuul/builds/9e54e4ec6c084cb9a51385ec0c41bc80/work
      include_vars: []
      items:
      - branch: main
        change: '2560'
        change_message: "Refuse breakouts that claim other ports\n\nA detected breakout
          names its children after the master's lane offsets \u2014\n`Ethernet<base
          + n*lanes_per_child>` \u2014 which assumes every slot below the next\nmaster
          is free. That holds for every port of every bundled HWSKU except one.\n\nOn
          **Accton-AS7726-32X** the last 100G port has four lanes, but the next two\nport
          names are already taken by independent 10G SFP+ ports:\n\n```\nEthernet124
          \    125,126,127,128       hundredGigE32     32    100000\nEthernet125     129
          \                  tenGigE33         33     10000\nEthernet126     128                   tenGigE34
          \        34     10000\n```\n\nA 4x breakout of `Ethernet124` generates children
          `Ethernet124/125/126/127`, so\nit claims `Ethernet125` and `Ethernet126`
          as sub-ports of a cage they are not\npart of.\n\n## What that does to the
          generated config\n\n| port | before | after a 4x25G breakout of Ethernet124
          |\n|------|--------|----------------------------------------|\n| `Ethernet125`
          | `lanes=129 speed=10000 alias=Eth1/33` | `lanes=126 speed=25000 alias=Eth1/33/1`
          |\n| `Ethernet126` | `lanes=128 speed=10000 alias=Eth1/34` | `lanes=127
          speed=25000 alias=Eth1/34/1` |\n\nAll three fields are wrong, and both ports
          are re-presented as breakout\nsub-ports. Two things make this reach a real
          switch rather than staying\ntheoretical:\n\n- a `breakout_ports` entry is
          **authoritative** for a port's lanes and speed \u2014\n  the declared path
          stashes them directly, the inferred path recomputes them\n  from the *master's*
          lane list via `_calculate_breakout_port_lane()`;\n- the `PORT` table is
          built from **every entry in `port_config`**, not only the\n  interfaces
          present in NetBox, so no NetBox modelling of the SFP ports is\n  needed
          for them to be emitted and corrupted. Every generated config for that\n
          \ HWSKU already contains all 34 ports.\n\n`2x50G` collides the same way,
          on `Ethernet126` alone.\n\n## The fix\n\n`_breakout_child_collisions()`
          returns any child name that is a port of this\nHWSKU in its own right. Both
          affected paths now check it **before mutating\nanything**, so the group
          is dropped whole rather than half-applied and the\nmaster keeps its own
          configuration:\n\n- the `Eth<module>/<port>/<subport>` path, which computes
          child names from the\n  master offset and had no check at all;\n- the SONiC-name
          400G grouping path, likewise.\n\nThe SONiC-name **standard** grouping path
          needed no change. Its existing\ntopology gate already skips a group whose
          intermediate slots are ports in\n`port_config` \u2014 the same condition
          \u2014 so only a comment was added there,\nrecording that the gate is load-bearing
          for correctness and not only for the\nnative-port misdetection it was written
          to prevent.\n\nThe collision test is simply that a child name other than
          the master is itself a\nkey in `port_config`. Swept across every master
          of all nine bundled HWSKUs at\n1x/2x/4x/8x, it flags exactly the three real
          cases on that one HWSKU and nothing\nelse, so it needs no per-HWSKU exception
          list and no false positives to\nsuppress.\n\n## Why the existing tests could
          not have caught this\n\nEvery breakout test builds its `port_config` from
          a helper that returns a\n**single entry** (occasionally two). A one-port
          `port_config` cannot express a\nchild slot occupied by another port, so
          this class of bug was structurally\nunreachable by the suite \u2014 the
          fixtures encoded the same assumption as the code.\n\nThe new tests therefore
          load the `.ini` files shipped in this repo. The 400G case\nkeeps a synthetic
          `port_config`, because no bundled HWSKU has an 8-lane master\nwith an occupied
          child slot.\n\n## Note on the underlying port config\n\nWorth flagging for
          whoever owns those files, though it is deliberately **not**\nchanged here.
          Upstream `sonic-buildimage` ships 32 ports for this HWSKU \u2014\n`Ethernet125`/`Ethernet126`
          do not exist there \u2014 and its Broadcom config carries\nthem only as
          commented-out entries (`#portmap_130=128:10:m`,\n`#portmap_66=129:10:m`).
          Lane 128 is muxed between the last 100G port's fourth\nlane and a 10G port,
          so the vendor ships the 10G ports disabled to leave the\n100G port all four
          lanes. `Accton-AS7326-56X.ini` has the same lane-128 overlap.\n\nSo these
          files declare port pairs the hardware cannot run simultaneously, which\nis
          a data question separate from this change. Refusing to silently claim a
          port\nthat exists is correct either way, which is why the guard goes in
          regardless of\nhow that is settled.\n\n## Verification\n\n- Full unit suite
          green; `tests/unit/tasks/conductor/sonic` at 701 passed.\n- Each new guard
          verified to fail loudly: with the guards disabled, exactly the\n  two corresponding
          tests fail, while the topology-gate test and the\n  breakout-still-works
          control keep passing.\n- `flake8` and `black` clean.\n"
        change_url: https://github.com/osism/python-osism/pull/2560
        commit_id: 8018af52dedd22572fcb74438370cef2ea7fea52
        patchset: 8018af52dedd22572fcb74438370cef2ea7fea52
        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: mypy
      jobtags: []
      max_attempts: 3
      message: UmVmdXNlIGJyZWFrb3V0cyB0aGF0IGNsYWltIG90aGVyIHBvcnRzCgpBIGRldGVjdGVkIGJyZWFrb3V0IG5hbWVzIGl0cyBjaGlsZHJlbiBhZnRlciB0aGUgbWFzdGVyJ3MgbGFuZSBvZmZzZXRzIOKAlApgRXRoZXJuZXQ8YmFzZSArIG4qbGFuZXNfcGVyX2NoaWxkPmAg4oCUIHdoaWNoIGFzc3VtZXMgZXZlcnkgc2xvdCBiZWxvdyB0aGUgbmV4dAptYXN0ZXIgaXMgZnJlZS4gVGhhdCBob2xkcyBmb3IgZXZlcnkgcG9ydCBvZiBldmVyeSBidW5kbGVkIEhXU0tVIGV4Y2VwdCBvbmUuCgpPbiAqKkFjY3Rvbi1BUzc3MjYtMzJYKiogdGhlIGxhc3QgMTAwRyBwb3J0IGhhcyBmb3VyIGxhbmVzLCBidXQgdGhlIG5leHQgdHdvCnBvcnQgbmFtZXMgYXJlIGFscmVhZHkgdGFrZW4gYnkgaW5kZXBlbmRlbnQgMTBHIFNGUCsgcG9ydHM6CgpgYGAKRXRoZXJuZXQxMjQgICAgIDEyNSwxMjYsMTI3LDEyOCAgICAgICBodW5kcmVkR2lnRTMyICAgICAzMiAgICAxMDAwMDAKRXRoZXJuZXQxMjUgICAgIDEyOSAgICAgICAgICAgICAgICAgICB0ZW5HaWdFMzMgICAgICAgICAzMyAgICAgMTAwMDAKRXRoZXJuZXQxMjYgICAgIDEyOCAgICAgICAgICAgICAgICAgICB0ZW5HaWdFMzQgICAgICAgICAzNCAgICAgMTAwMDAKYGBgCgpBIDR4IGJyZWFrb3V0IG9mIGBFdGhlcm5ldDEyNGAgZ2VuZXJhdGVzIGNoaWxkcmVuIGBFdGhlcm5ldDEyNC8xMjUvMTI2LzEyN2AsIHNvCml0IGNsYWltcyBgRXRoZXJuZXQxMjVgIGFuZCBgRXRoZXJuZXQxMjZgIGFzIHN1Yi1wb3J0cyBvZiBhIGNhZ2UgdGhleSBhcmUgbm90CnBhcnQgb2YuCgojIyBXaGF0IHRoYXQgZG9lcyB0byB0aGUgZ2VuZXJhdGVkIGNvbmZpZwoKfCBwb3J0IHwgYmVmb3JlIHwgYWZ0ZXIgYSA0eDI1RyBicmVha291dCBvZiBFdGhlcm5ldDEyNCB8CnwtLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBgRXRoZXJuZXQxMjVgIHwgYGxhbmVzPTEyOSBzcGVlZD0xMDAwMCBhbGlhcz1FdGgxLzMzYCB8IGBsYW5lcz0xMjYgc3BlZWQ9MjUwMDAgYWxpYXM9RXRoMS8zMy8xYCB8CnwgYEV0aGVybmV0MTI2YCB8IGBsYW5lcz0xMjggc3BlZWQ9MTAwMDAgYWxpYXM9RXRoMS8zNGAgfCBgbGFuZXM9MTI3IHNwZWVkPTI1MDAwIGFsaWFzPUV0aDEvMzQvMWAgfAoKQWxsIHRocmVlIGZpZWxkcyBhcmUgd3JvbmcsIGFuZCBib3RoIHBvcnRzIGFyZSByZS1wcmVzZW50ZWQgYXMgYnJlYWtvdXQKc3ViLXBvcnRzLiBUd28gdGhpbmdzIG1ha2UgdGhpcyByZWFjaCBhIHJlYWwgc3dpdGNoIHJhdGhlciB0aGFuIHN0YXlpbmcKdGhlb3JldGljYWw6CgotIGEgYGJyZWFrb3V0X3BvcnRzYCBlbnRyeSBpcyAqKmF1dGhvcml0YXRpdmUqKiBmb3IgYSBwb3J0J3MgbGFuZXMgYW5kIHNwZWVkIOKAlAogIHRoZSBkZWNsYXJlZCBwYXRoIHN0YXNoZXMgdGhlbSBkaXJlY3RseSwgdGhlIGluZmVycmVkIHBhdGggcmVjb21wdXRlcyB0aGVtCiAgZnJvbSB0aGUgKm1hc3RlcidzKiBsYW5lIGxpc3QgdmlhIGBfY2FsY3VsYXRlX2JyZWFrb3V0X3BvcnRfbGFuZSgpYDsKLSB0aGUgYFBPUlRgIHRhYmxlIGlzIGJ1aWx0IGZyb20gKipldmVyeSBlbnRyeSBpbiBgcG9ydF9jb25maWdgKiosIG5vdCBvbmx5IHRoZQogIGludGVyZmFjZXMgcHJlc2VudCBpbiBOZXRCb3gsIHNvIG5vIE5ldEJveCBtb2RlbGxpbmcgb2YgdGhlIFNGUCBwb3J0cyBpcwogIG5lZWRlZCBmb3IgdGhlbSB0byBiZSBlbWl0dGVkIGFuZCBjb3JydXB0ZWQuIEV2ZXJ5IGdlbmVyYXRlZCBjb25maWcgZm9yIHRoYXQKICBIV1NLVSBhbHJlYWR5IGNvbnRhaW5zIGFsbCAzNCBwb3J0cy4KCmAyeDUwR2AgY29sbGlkZXMgdGhlIHNhbWUgd2F5LCBvbiBgRXRoZXJuZXQxMjZgIGFsb25lLgoKIyMgVGhlIGZpeAoKYF9icmVha291dF9jaGlsZF9jb2xsaXNpb25zKClgIHJldHVybnMgYW55IGNoaWxkIG5hbWUgdGhhdCBpcyBhIHBvcnQgb2YgdGhpcwpIV1NLVSBpbiBpdHMgb3duIHJpZ2h0LiBCb3RoIGFmZmVjdGVkIHBhdGhzIG5vdyBjaGVjayBpdCAqKmJlZm9yZSBtdXRhdGluZwphbnl0aGluZyoqLCBzbyB0aGUgZ3JvdXAgaXMgZHJvcHBlZCB3aG9sZSByYXRoZXIgdGhhbiBoYWxmLWFwcGxpZWQgYW5kIHRoZQptYXN0ZXIga2VlcHMgaXRzIG93biBjb25maWd1cmF0aW9uOgoKLSB0aGUgYEV0aDxtb2R1bGU+Lzxwb3J0Pi88c3VicG9ydD5gIHBhdGgsIHdoaWNoIGNvbXB1dGVzIGNoaWxkIG5hbWVzIGZyb20gdGhlCiAgbWFzdGVyIG9mZnNldCBhbmQgaGFkIG5vIGNoZWNrIGF0IGFsbDsKLSB0aGUgU09OaUMtbmFtZSA0MDBHIGdyb3VwaW5nIHBhdGgsIGxpa2V3aXNlLgoKVGhlIFNPTmlDLW5hbWUgKipzdGFuZGFyZCoqIGdyb3VwaW5nIHBhdGggbmVlZGVkIG5vIGNoYW5nZS4gSXRzIGV4aXN0aW5nCnRvcG9sb2d5IGdhdGUgYWxyZWFkeSBza2lwcyBhIGdyb3VwIHdob3NlIGludGVybWVkaWF0ZSBzbG90cyBhcmUgcG9ydHMgaW4KYHBvcnRfY29uZmlnYCDigJQgdGhlIHNhbWUgY29uZGl0aW9uIOKAlCBzbyBvbmx5IGEgY29tbWVudCB3YXMgYWRkZWQgdGhlcmUsCnJlY29yZGluZyB0aGF0IHRoZSBnYXRlIGlzIGxvYWQtYmVhcmluZyBmb3IgY29ycmVjdG5lc3MgYW5kIG5vdCBvbmx5IGZvciB0aGUKbmF0aXZlLXBvcnQgbWlzZGV0ZWN0aW9uIGl0IHdhcyB3cml0dGVuIHRvIHByZXZlbnQuCgpUaGUgY29sbGlzaW9uIHRlc3QgaXMgc2ltcGx5IHRoYXQgYSBjaGlsZCBuYW1lIG90aGVyIHRoYW4gdGhlIG1hc3RlciBpcyBpdHNlbGYgYQprZXkgaW4gYHBvcnRfY29uZmlnYC4gU3dlcHQgYWNyb3NzIGV2ZXJ5IG1hc3RlciBvZiBhbGwgbmluZSBidW5kbGVkIEhXU0tVcyBhdAoxeC8yeC80eC84eCwgaXQgZmxhZ3MgZXhhY3RseSB0aGUgdGhyZWUgcmVhbCBjYXNlcyBvbiB0aGF0IG9uZSBIV1NLVSBhbmQgbm90aGluZwplbHNlLCBzbyBpdCBuZWVkcyBubyBwZXItSFdTS1UgZXhjZXB0aW9uIGxpc3QgYW5kIG5vIGZhbHNlIHBvc2l0aXZlcyB0bwpzdXBwcmVzcy4KCiMjIFdoeSB0aGUgZXhpc3RpbmcgdGVzdHMgY291bGQgbm90IGhhdmUgY2F1Z2h0IHRoaXMKCkV2ZXJ5IGJyZWFrb3V0IHRlc3QgYnVpbGRzIGl0cyBgcG9ydF9jb25maWdgIGZyb20gYSBoZWxwZXIgdGhhdCByZXR1cm5zIGEKKipzaW5nbGUgZW50cnkqKiAob2NjYXNpb25hbGx5IHR3bykuIEEgb25lLXBvcnQgYHBvcnRfY29uZmlnYCBjYW5ub3QgZXhwcmVzcyBhCmNoaWxkIHNsb3Qgb2NjdXBpZWQgYnkgYW5vdGhlciBwb3J0LCBzbyB0aGlzIGNsYXNzIG9mIGJ1ZyB3YXMgc3RydWN0dXJhbGx5CnVucmVhY2hhYmxlIGJ5IHRoZSBzdWl0ZSDigJQgdGhlIGZpeHR1cmVzIGVuY29kZWQgdGhlIHNhbWUgYXNzdW1wdGlvbiBhcyB0aGUgY29kZS4KClRoZSBuZXcgdGVzdHMgdGhlcmVmb3JlIGxvYWQgdGhlIGAuaW5pYCBmaWxlcyBzaGlwcGVkIGluIHRoaXMgcmVwby4gVGhlIDQwMEcgY2FzZQprZWVwcyBhIHN5bnRoZXRpYyBgcG9ydF9jb25maWdgLCBiZWNhdXNlIG5vIGJ1bmRsZWQgSFdTS1UgaGFzIGFuIDgtbGFuZSBtYXN0ZXIKd2l0aCBhbiBvY2N1cGllZCBjaGlsZCBzbG90LgoKIyMgTm90ZSBvbiB0aGUgdW5kZXJseWluZyBwb3J0IGNvbmZpZwoKV29ydGggZmxhZ2dpbmcgZm9yIHdob2V2ZXIgb3ducyB0aG9zZSBmaWxlcywgdGhvdWdoIGl0IGlzIGRlbGliZXJhdGVseSAqKm5vdCoqCmNoYW5nZWQgaGVyZS4gVXBzdHJlYW0gYHNvbmljLWJ1aWxkaW1hZ2VgIHNoaXBzIDMyIHBvcnRzIGZvciB0aGlzIEhXU0tVIOKAlApgRXRoZXJuZXQxMjVgL2BFdGhlcm5ldDEyNmAgZG8gbm90IGV4aXN0IHRoZXJlIOKAlCBhbmQgaXRzIEJyb2FkY29tIGNvbmZpZyBjYXJyaWVzCnRoZW0gb25seSBhcyBjb21tZW50ZWQtb3V0IGVudHJpZXMgKGAjcG9ydG1hcF8xMzA9MTI4OjEwOm1gLApgI3BvcnRtYXBfNjY9MTI5OjEwOm1gKS4gTGFuZSAxMjggaXMgbXV4ZWQgYmV0d2VlbiB0aGUgbGFzdCAxMDBHIHBvcnQncyBmb3VydGgKbGFuZSBhbmQgYSAxMEcgcG9ydCwgc28gdGhlIHZlbmRvciBzaGlwcyB0aGUgMTBHIHBvcnRzIGRpc2FibGVkIHRvIGxlYXZlIHRoZQoxMDBHIHBvcnQgYWxsIGZvdXIgbGFuZXMuIGBBY2N0b24tQVM3MzI2LTU2WC5pbmlgIGhhcyB0aGUgc2FtZSBsYW5lLTEyOCBvdmVybGFwLgoKU28gdGhlc2UgZmlsZXMgZGVjbGFyZSBwb3J0IHBhaXJzIHRoZSBoYXJkd2FyZSBjYW5ub3QgcnVuIHNpbXVsdGFuZW91c2x5LCB3aGljaAppcyBhIGRhdGEgcXVlc3Rpb24gc2VwYXJhdGUgZnJvbSB0aGlzIGNoYW5nZS4gUmVmdXNpbmcgdG8gc2lsZW50bHkgY2xhaW0gYSBwb3J0CnRoYXQgZXhpc3RzIGlzIGNvcnJlY3QgZWl0aGVyIHdheSwgd2hpY2ggaXMgd2h5IHRoZSBndWFyZCBnb2VzIGluIHJlZ2FyZGxlc3Mgb2YKaG93IHRoYXQgaXMgc2V0dGxlZC4KCiMjIFZlcmlmaWNhdGlvbgoKLSBGdWxsIHVuaXQgc3VpdGUgZ3JlZW47IGB0ZXN0cy91bml0L3Rhc2tzL2NvbmR1Y3Rvci9zb25pY2AgYXQgNzAxIHBhc3NlZC4KLSBFYWNoIG5ldyBndWFyZCB2ZXJpZmllZCB0byBmYWlsIGxvdWRseTogd2l0aCB0aGUgZ3VhcmRzIGRpc2FibGVkLCBleGFjdGx5IHRoZQogIHR3byBjb3JyZXNwb25kaW5nIHRlc3RzIGZhaWwsIHdoaWxlIHRoZSB0b3BvbG9neS1nYXRlIHRlc3QgYW5kIHRoZQogIGJyZWFrb3V0LXN0aWxsLXdvcmtzIGNvbnRyb2wga2VlcCBwYXNzaW5nLgotIGBmbGFrZThgIGFuZCBgYmxhY2tgIGNsZWFuLgo=
      patchset: 8018af52dedd22572fcb74438370cef2ea7fea52
      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/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: dcb06ea8a3ad422cc9d98b376216617b2daa6a02
          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/mypy/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: d6209f5aa77e97af88b137bf97208567bc42925f
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2560/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
