all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    ubuntu-noble:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fedf:7681
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: af3a3b6a-9c4c-4586-b854-0c5700acbdf6
        host_id: 82101243836454d7401d5893feae9e2c5df7cc291646d8a99b33b53b
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fedf:7681
        label: ubuntu-noble
        node_properties: {}
        private_ipv4: 10.128.7.118
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.29
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fedf:7681
        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-sonic-e2e explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/python-osism/.zuul.yaml@main#151>'
      - '<Job python-osism-sonic-e2e explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#171>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: d0414c8329ba4a5190cb3f3f54486da2
      build_refs:
      - branch: main
        change: '2483'
        change_message: "Add E2E golden tests for SONiC config generation\n\n## Summary\n\nAdds
          an end-to-end golden test for the SONiC config generator: provision NetBox
          on a local kind cluster, seed it with the netbox-manager example data plus
          a small regression-scenario overlay, run `sync_sonic()`, and compare every
          exported `config_db.json` against golden files committed under `tests/e2e/golden/`.
          Any behavior change in the generator becomes a reviewable golden diff in
          the same PR.\n\n## Motivation\n\nUnit tests verify the generator against
          fixture values that encode the author's assumptions, so a class of regressions
          \u2014 such as mixed kbps/Mbps interface speeds \u2014 can pass the unit
          suite while producing broken switch configurations. Nothing exercised the
          full pipeline (real NetBox data in, complete config_db out) until now:\n\n-
          #2478 \u2014 the customer-visible breakage (breakout ports with `\"speed\":
          \"100\"`)\n- #2246 \u2014 where that regression slipped in, past both author
          and review\n\n## Changes\n\n- **`SONIC_PORT_CONFIG_PATH`** setting so the
          generator can read the in-repo `files/sonic/port_config/` outside the container
          image\n- **`tests/e2e/generate.py`** \u2014 drives `sync_sonic()`; since
          it returns only a device\u2192config dict and swallows per-device failures,
          the driver asserts success itself (expected device set derived from golden
          filenames, empty-config detection, a loguru sink that fails the run on any
          ERROR record)\n- **`tests/e2e/compare.py`** \u2014 exact file-set equality
          (missing / extra / mismatched reported separately), structural diff paths
          like `PORT|Ethernet4.speed`, canonical unified diff, `--regenerate` for
          intentional output changes\n- **`tests/e2e/run.sh` + Makefile targets**
          `sonic-e2e`, `sonic-e2e-regen`, `sonic-e2e-up`, `sonic-e2e-down`; netbox-manager
          is installed from a checkout (sibling dir or `NETBOX_MANAGER_DIR`) into
          a dedicated venv\n- **Golden files** for the five example-testbed switches,
          cross-checked against their independent sources (seed YAML, port_config
          `.ini` speeds, the ASN derivation rule) and reproduced byte-for-byte by
          a second seed-and-generate cycle\n- **Breakout regression scenario** (`tests/e2e/scenario/`)
          \u2014 the base example models no breakout ports and sets no explicit interface
          speeds, so those code paths were unexercised. A second seeding pass adds
          two devices (a minimal synthetic `Accton-AS9726-32D` device type) that break
          a 400G master into a 4x100G group whose non-master sub-ports take the `_add_missing_breakout_ports`
          path; one derives the sub-port speed from the interface type, the other
          sets it explicitly in kbps, and both must yield `100000`. A tagged-VLAN
          port adds VLAN / VLAN_MEMBER coverage. The seed data is synthetic and modeled
          on real deployment conventions (no customer identifiers).\n- **Zuul job
          `python-osism-sonic-e2e`** in check (restricted by a files matcher to changes
          that can alter generator output) and periodic-daily (unconditional, bounds
          seed-data drift); netbox-manager comes from `required-projects`, so `Depends-On`
          is honored for its code and seed data\n- **Drive-by fix**: `_add_snmp_configuration`
          no longer builds the Redis-backed Ansible vault for devices without encrypted
          secrets \u2014 it logged three ERRORs per device in any environment without
          vault infrastructure (found by the new error guard)\n\n## Verification\n\n-
          Unit tests pass (2043); the comparator and driver logic are unit-tested
          (`tests/unit/e2e/`)\n- Full local E2E cycle against kind + NetBox 4.5.10:
          golden bootstrap, then a compare-mode rerun against a fresh re-seed reproduced
          all seven goldens byte-for-byte\n- **Regression guard verified**: reverting
          the speed-normalization fix against these goldens turns exactly the affected
          device red \u2014 the derived breakout device shows `100000 \u2192 100`
          (the customer-visible symptom), the explicit device `100000 \u2192 100000000`
          (raw kbps) \u2014 and the two revert variants isolate the two historical
          bugs; the current code keeps both green\n- `python-osism-sonic-e2e` is green
          in CI, seeding the overlay and matching all seven goldens (the job validates
          itself on this PR \u2014 the files matcher covers `.zuul.yaml`, `tests/e2e/`,
          and the playbooks)\n\n## Follow-up work\n\n- Broaden coverage to the generator
          subsystems the current seed data still leaves unexercised: VXLAN / EVPN
          + VRF, port-channels, additional hwskus, DNS / NTP. The base example populates
          16 config-db tables and emits roughly as many empty; each seeded device's
          golden pins its entire config, so coverage grows by seeding more representative
          devices. A higher-fidelity option is to generate against sanitized copies
          of real configs.\n- Factor the kind / kubectl / helm pre-run into a shared
          zuul-jobs role instead of the copy adapted from netbox-manager's `pre-e2e.yml`.\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2483
        commit_id: 56e338acd5e5f5dfbf20ee1a6af7a12d61bf9a40
        patchset: 56e338acd5e5f5dfbf20ee1a6af7a12d61bf9a40
        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: af4b9b8ff7f34146ae53ce787e08640d
      buildset_refs:
      - branch: main
        change: '2483'
        change_message: "Add E2E golden tests for SONiC config generation\n\n## Summary\n\nAdds
          an end-to-end golden test for the SONiC config generator: provision NetBox
          on a local kind cluster, seed it with the netbox-manager example data plus
          a small regression-scenario overlay, run `sync_sonic()`, and compare every
          exported `config_db.json` against golden files committed under `tests/e2e/golden/`.
          Any behavior change in the generator becomes a reviewable golden diff in
          the same PR.\n\n## Motivation\n\nUnit tests verify the generator against
          fixture values that encode the author's assumptions, so a class of regressions
          \u2014 such as mixed kbps/Mbps interface speeds \u2014 can pass the unit
          suite while producing broken switch configurations. Nothing exercised the
          full pipeline (real NetBox data in, complete config_db out) until now:\n\n-
          #2478 \u2014 the customer-visible breakage (breakout ports with `\"speed\":
          \"100\"`)\n- #2246 \u2014 where that regression slipped in, past both author
          and review\n\n## Changes\n\n- **`SONIC_PORT_CONFIG_PATH`** setting so the
          generator can read the in-repo `files/sonic/port_config/` outside the container
          image\n- **`tests/e2e/generate.py`** \u2014 drives `sync_sonic()`; since
          it returns only a device\u2192config dict and swallows per-device failures,
          the driver asserts success itself (expected device set derived from golden
          filenames, empty-config detection, a loguru sink that fails the run on any
          ERROR record)\n- **`tests/e2e/compare.py`** \u2014 exact file-set equality
          (missing / extra / mismatched reported separately), structural diff paths
          like `PORT|Ethernet4.speed`, canonical unified diff, `--regenerate` for
          intentional output changes\n- **`tests/e2e/run.sh` + Makefile targets**
          `sonic-e2e`, `sonic-e2e-regen`, `sonic-e2e-up`, `sonic-e2e-down`; netbox-manager
          is installed from a checkout (sibling dir or `NETBOX_MANAGER_DIR`) into
          a dedicated venv\n- **Golden files** for the five example-testbed switches,
          cross-checked against their independent sources (seed YAML, port_config
          `.ini` speeds, the ASN derivation rule) and reproduced byte-for-byte by
          a second seed-and-generate cycle\n- **Breakout regression scenario** (`tests/e2e/scenario/`)
          \u2014 the base example models no breakout ports and sets no explicit interface
          speeds, so those code paths were unexercised. A second seeding pass adds
          two devices (a minimal synthetic `Accton-AS9726-32D` device type) that break
          a 400G master into a 4x100G group whose non-master sub-ports take the `_add_missing_breakout_ports`
          path; one derives the sub-port speed from the interface type, the other
          sets it explicitly in kbps, and both must yield `100000`. A tagged-VLAN
          port adds VLAN / VLAN_MEMBER coverage. The seed data is synthetic and modeled
          on real deployment conventions (no customer identifiers).\n- **Zuul job
          `python-osism-sonic-e2e`** in check (restricted by a files matcher to changes
          that can alter generator output) and periodic-daily (unconditional, bounds
          seed-data drift); netbox-manager comes from `required-projects`, so `Depends-On`
          is honored for its code and seed data\n- **Drive-by fix**: `_add_snmp_configuration`
          no longer builds the Redis-backed Ansible vault for devices without encrypted
          secrets \u2014 it logged three ERRORs per device in any environment without
          vault infrastructure (found by the new error guard)\n\n## Verification\n\n-
          Unit tests pass (2043); the comparator and driver logic are unit-tested
          (`tests/unit/e2e/`)\n- Full local E2E cycle against kind + NetBox 4.5.10:
          golden bootstrap, then a compare-mode rerun against a fresh re-seed reproduced
          all seven goldens byte-for-byte\n- **Regression guard verified**: reverting
          the speed-normalization fix against these goldens turns exactly the affected
          device red \u2014 the derived breakout device shows `100000 \u2192 100`
          (the customer-visible symptom), the explicit device `100000 \u2192 100000000`
          (raw kbps) \u2014 and the two revert variants isolate the two historical
          bugs; the current code keeps both green\n- `python-osism-sonic-e2e` is green
          in CI, seeding the overlay and matching all seven goldens (the job validates
          itself on this PR \u2014 the files matcher covers `.zuul.yaml`, `tests/e2e/`,
          and the playbooks)\n\n## Follow-up work\n\n- Broaden coverage to the generator
          subsystems the current seed data still leaves unexercised: VXLAN / EVPN
          + VRF, port-channels, additional hwskus, DNS / NTP. The base example populates
          16 config-db tables and emits roughly as many empty; each seeded device's
          golden pins its entire config, so coverage grows by seeding more representative
          devices. A higher-fidelity option is to generate against sanitized copies
          of real configs.\n- Factor the kind / kubectl / helm pre-run into a shared
          zuul-jobs role instead of the copy adapted from netbox-manager's `pre-e2e.yml`.\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2483
        commit_id: 56e338acd5e5f5dfbf20ee1a6af7a12d61bf9a40
        patchset: 56e338acd5e5f5dfbf20ee1a6af7a12d61bf9a40
        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: '2483'
      change_message: "Add E2E golden tests for SONiC config generation\n\n## Summary\n\nAdds
        an end-to-end golden test for the SONiC config generator: provision NetBox
        on a local kind cluster, seed it with the netbox-manager example data plus
        a small regression-scenario overlay, run `sync_sonic()`, and compare every
        exported `config_db.json` against golden files committed under `tests/e2e/golden/`.
        Any behavior change in the generator becomes a reviewable golden diff in the
        same PR.\n\n## Motivation\n\nUnit tests verify the generator against fixture
        values that encode the author's assumptions, so a class of regressions \u2014
        such as mixed kbps/Mbps interface speeds \u2014 can pass the unit suite while
        producing broken switch configurations. Nothing exercised the full pipeline
        (real NetBox data in, complete config_db out) until now:\n\n- #2478 \u2014
        the customer-visible breakage (breakout ports with `\"speed\": \"100\"`)\n-
        #2246 \u2014 where that regression slipped in, past both author and review\n\n##
        Changes\n\n- **`SONIC_PORT_CONFIG_PATH`** setting so the generator can read
        the in-repo `files/sonic/port_config/` outside the container image\n- **`tests/e2e/generate.py`**
        \u2014 drives `sync_sonic()`; since it returns only a device\u2192config dict
        and swallows per-device failures, the driver asserts success itself (expected
        device set derived from golden filenames, empty-config detection, a loguru
        sink that fails the run on any ERROR record)\n- **`tests/e2e/compare.py`**
        \u2014 exact file-set equality (missing / extra / mismatched reported separately),
        structural diff paths like `PORT|Ethernet4.speed`, canonical unified diff,
        `--regenerate` for intentional output changes\n- **`tests/e2e/run.sh` + Makefile
        targets** `sonic-e2e`, `sonic-e2e-regen`, `sonic-e2e-up`, `sonic-e2e-down`;
        netbox-manager is installed from a checkout (sibling dir or `NETBOX_MANAGER_DIR`)
        into a dedicated venv\n- **Golden files** for the five example-testbed switches,
        cross-checked against their independent sources (seed YAML, port_config `.ini`
        speeds, the ASN derivation rule) and reproduced byte-for-byte by a second
        seed-and-generate cycle\n- **Breakout regression scenario** (`tests/e2e/scenario/`)
        \u2014 the base example models no breakout ports and sets no explicit interface
        speeds, so those code paths were unexercised. A second seeding pass adds two
        devices (a minimal synthetic `Accton-AS9726-32D` device type) that break a
        400G master into a 4x100G group whose non-master sub-ports take the `_add_missing_breakout_ports`
        path; one derives the sub-port speed from the interface type, the other sets
        it explicitly in kbps, and both must yield `100000`. A tagged-VLAN port adds
        VLAN / VLAN_MEMBER coverage. The seed data is synthetic and modeled on real
        deployment conventions (no customer identifiers).\n- **Zuul job `python-osism-sonic-e2e`**
        in check (restricted by a files matcher to changes that can alter generator
        output) and periodic-daily (unconditional, bounds seed-data drift); netbox-manager
        comes from `required-projects`, so `Depends-On` is honored for its code and
        seed data\n- **Drive-by fix**: `_add_snmp_configuration` no longer builds
        the Redis-backed Ansible vault for devices without encrypted secrets \u2014
        it logged three ERRORs per device in any environment without vault infrastructure
        (found by the new error guard)\n\n## Verification\n\n- Unit tests pass (2043);
        the comparator and driver logic are unit-tested (`tests/unit/e2e/`)\n- Full
        local E2E cycle against kind + NetBox 4.5.10: golden bootstrap, then a compare-mode
        rerun against a fresh re-seed reproduced all seven goldens byte-for-byte\n-
        **Regression guard verified**: reverting the speed-normalization fix against
        these goldens turns exactly the affected device red \u2014 the derived breakout
        device shows `100000 \u2192 100` (the customer-visible symptom), the explicit
        device `100000 \u2192 100000000` (raw kbps) \u2014 and the two revert variants
        isolate the two historical bugs; the current code keeps both green\n- `python-osism-sonic-e2e`
        is green in CI, seeding the overlay and matching all seven goldens (the job
        validates itself on this PR \u2014 the files matcher covers `.zuul.yaml`,
        `tests/e2e/`, and the playbooks)\n\n## Follow-up work\n\n- Broaden coverage
        to the generator subsystems the current seed data still leaves unexercised:
        VXLAN / EVPN + VRF, port-channels, additional hwskus, DNS / NTP. The base
        example populates 16 config-db tables and emits roughly as many empty; each
        seeded device's golden pins its entire config, so coverage grows by seeding
        more representative devices. A higher-fidelity option is to generate against
        sanitized copies of real configs.\n- Factor the kind / kubectl / helm pre-run
        into a shared zuul-jobs role instead of the copy adapted from netbox-manager's
        `pre-e2e.yml`.\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)"
      change_url: https://github.com/osism/python-osism/pull/2483
      child_jobs: []
      commit_id: 56e338acd5e5f5dfbf20ee1a6af7a12d61bf9a40
      event_id: ad5bc630-8983-11f1-99b5-b17dc8fe696f
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/d0414c8329ba4a5190cb3f3f54486da2/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/d0414c8329ba4a5190cb3f3f54486da2/work/logs
        result_data_file: /var/lib/zuul/builds/d0414c8329ba4a5190cb3f3f54486da2/work/results.json
        src_root: /var/lib/zuul/builds/d0414c8329ba4a5190cb3f3f54486da2/work/src
        work_root: /var/lib/zuul/builds/d0414c8329ba4a5190cb3f3f54486da2/work
      include_vars: []
      items:
      - branch: main
        change: '2483'
        change_message: "Add E2E golden tests for SONiC config generation\n\n## Summary\n\nAdds
          an end-to-end golden test for the SONiC config generator: provision NetBox
          on a local kind cluster, seed it with the netbox-manager example data plus
          a small regression-scenario overlay, run `sync_sonic()`, and compare every
          exported `config_db.json` against golden files committed under `tests/e2e/golden/`.
          Any behavior change in the generator becomes a reviewable golden diff in
          the same PR.\n\n## Motivation\n\nUnit tests verify the generator against
          fixture values that encode the author's assumptions, so a class of regressions
          \u2014 such as mixed kbps/Mbps interface speeds \u2014 can pass the unit
          suite while producing broken switch configurations. Nothing exercised the
          full pipeline (real NetBox data in, complete config_db out) until now:\n\n-
          #2478 \u2014 the customer-visible breakage (breakout ports with `\"speed\":
          \"100\"`)\n- #2246 \u2014 where that regression slipped in, past both author
          and review\n\n## Changes\n\n- **`SONIC_PORT_CONFIG_PATH`** setting so the
          generator can read the in-repo `files/sonic/port_config/` outside the container
          image\n- **`tests/e2e/generate.py`** \u2014 drives `sync_sonic()`; since
          it returns only a device\u2192config dict and swallows per-device failures,
          the driver asserts success itself (expected device set derived from golden
          filenames, empty-config detection, a loguru sink that fails the run on any
          ERROR record)\n- **`tests/e2e/compare.py`** \u2014 exact file-set equality
          (missing / extra / mismatched reported separately), structural diff paths
          like `PORT|Ethernet4.speed`, canonical unified diff, `--regenerate` for
          intentional output changes\n- **`tests/e2e/run.sh` + Makefile targets**
          `sonic-e2e`, `sonic-e2e-regen`, `sonic-e2e-up`, `sonic-e2e-down`; netbox-manager
          is installed from a checkout (sibling dir or `NETBOX_MANAGER_DIR`) into
          a dedicated venv\n- **Golden files** for the five example-testbed switches,
          cross-checked against their independent sources (seed YAML, port_config
          `.ini` speeds, the ASN derivation rule) and reproduced byte-for-byte by
          a second seed-and-generate cycle\n- **Breakout regression scenario** (`tests/e2e/scenario/`)
          \u2014 the base example models no breakout ports and sets no explicit interface
          speeds, so those code paths were unexercised. A second seeding pass adds
          two devices (a minimal synthetic `Accton-AS9726-32D` device type) that break
          a 400G master into a 4x100G group whose non-master sub-ports take the `_add_missing_breakout_ports`
          path; one derives the sub-port speed from the interface type, the other
          sets it explicitly in kbps, and both must yield `100000`. A tagged-VLAN
          port adds VLAN / VLAN_MEMBER coverage. The seed data is synthetic and modeled
          on real deployment conventions (no customer identifiers).\n- **Zuul job
          `python-osism-sonic-e2e`** in check (restricted by a files matcher to changes
          that can alter generator output) and periodic-daily (unconditional, bounds
          seed-data drift); netbox-manager comes from `required-projects`, so `Depends-On`
          is honored for its code and seed data\n- **Drive-by fix**: `_add_snmp_configuration`
          no longer builds the Redis-backed Ansible vault for devices without encrypted
          secrets \u2014 it logged three ERRORs per device in any environment without
          vault infrastructure (found by the new error guard)\n\n## Verification\n\n-
          Unit tests pass (2043); the comparator and driver logic are unit-tested
          (`tests/unit/e2e/`)\n- Full local E2E cycle against kind + NetBox 4.5.10:
          golden bootstrap, then a compare-mode rerun against a fresh re-seed reproduced
          all seven goldens byte-for-byte\n- **Regression guard verified**: reverting
          the speed-normalization fix against these goldens turns exactly the affected
          device red \u2014 the derived breakout device shows `100000 \u2192 100`
          (the customer-visible symptom), the explicit device `100000 \u2192 100000000`
          (raw kbps) \u2014 and the two revert variants isolate the two historical
          bugs; the current code keeps both green\n- `python-osism-sonic-e2e` is green
          in CI, seeding the overlay and matching all seven goldens (the job validates
          itself on this PR \u2014 the files matcher covers `.zuul.yaml`, `tests/e2e/`,
          and the playbooks)\n\n## Follow-up work\n\n- Broaden coverage to the generator
          subsystems the current seed data still leaves unexercised: VXLAN / EVPN
          + VRF, port-channels, additional hwskus, DNS / NTP. The base example populates
          16 config-db tables and emits roughly as many empty; each seeded device's
          golden pins its entire config, so coverage grows by seeding more representative
          devices. A higher-fidelity option is to generate against sanitized copies
          of real configs.\n- Factor the kind / kubectl / helm pre-run into a shared
          zuul-jobs role instead of the copy adapted from netbox-manager's `pre-e2e.yml`.\n\n\U0001F916
          Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2483
        commit_id: 56e338acd5e5f5dfbf20ee1a6af7a12d61bf9a40
        patchset: 56e338acd5e5f5dfbf20ee1a6af7a12d61bf9a40
        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-sonic-e2e
      jobtags: []
      max_attempts: 3
      message: QWRkIEUyRSBnb2xkZW4gdGVzdHMgZm9yIFNPTmlDIGNvbmZpZyBnZW5lcmF0aW9uCgojIyBTdW1tYXJ5CgpBZGRzIGFuIGVuZC10by1lbmQgZ29sZGVuIHRlc3QgZm9yIHRoZSBTT05pQyBjb25maWcgZ2VuZXJhdG9yOiBwcm92aXNpb24gTmV0Qm94IG9uIGEgbG9jYWwga2luZCBjbHVzdGVyLCBzZWVkIGl0IHdpdGggdGhlIG5ldGJveC1tYW5hZ2VyIGV4YW1wbGUgZGF0YSBwbHVzIGEgc21hbGwgcmVncmVzc2lvbi1zY2VuYXJpbyBvdmVybGF5LCBydW4gYHN5bmNfc29uaWMoKWAsIGFuZCBjb21wYXJlIGV2ZXJ5IGV4cG9ydGVkIGBjb25maWdfZGIuanNvbmAgYWdhaW5zdCBnb2xkZW4gZmlsZXMgY29tbWl0dGVkIHVuZGVyIGB0ZXN0cy9lMmUvZ29sZGVuL2AuIEFueSBiZWhhdmlvciBjaGFuZ2UgaW4gdGhlIGdlbmVyYXRvciBiZWNvbWVzIGEgcmV2aWV3YWJsZSBnb2xkZW4gZGlmZiBpbiB0aGUgc2FtZSBQUi4KCiMjIE1vdGl2YXRpb24KClVuaXQgdGVzdHMgdmVyaWZ5IHRoZSBnZW5lcmF0b3IgYWdhaW5zdCBmaXh0dXJlIHZhbHVlcyB0aGF0IGVuY29kZSB0aGUgYXV0aG9yJ3MgYXNzdW1wdGlvbnMsIHNvIGEgY2xhc3Mgb2YgcmVncmVzc2lvbnMg4oCUIHN1Y2ggYXMgbWl4ZWQga2Jwcy9NYnBzIGludGVyZmFjZSBzcGVlZHMg4oCUIGNhbiBwYXNzIHRoZSB1bml0IHN1aXRlIHdoaWxlIHByb2R1Y2luZyBicm9rZW4gc3dpdGNoIGNvbmZpZ3VyYXRpb25zLiBOb3RoaW5nIGV4ZXJjaXNlZCB0aGUgZnVsbCBwaXBlbGluZSAocmVhbCBOZXRCb3ggZGF0YSBpbiwgY29tcGxldGUgY29uZmlnX2RiIG91dCkgdW50aWwgbm93OgoKLSAjMjQ3OCDigJQgdGhlIGN1c3RvbWVyLXZpc2libGUgYnJlYWthZ2UgKGJyZWFrb3V0IHBvcnRzIHdpdGggYCJzcGVlZCI6ICIxMDAiYCkKLSAjMjI0NiDigJQgd2hlcmUgdGhhdCByZWdyZXNzaW9uIHNsaXBwZWQgaW4sIHBhc3QgYm90aCBhdXRob3IgYW5kIHJldmlldwoKIyMgQ2hhbmdlcwoKLSAqKmBTT05JQ19QT1JUX0NPTkZJR19QQVRIYCoqIHNldHRpbmcgc28gdGhlIGdlbmVyYXRvciBjYW4gcmVhZCB0aGUgaW4tcmVwbyBgZmlsZXMvc29uaWMvcG9ydF9jb25maWcvYCBvdXRzaWRlIHRoZSBjb250YWluZXIgaW1hZ2UKLSAqKmB0ZXN0cy9lMmUvZ2VuZXJhdGUucHlgKiog4oCUIGRyaXZlcyBgc3luY19zb25pYygpYDsgc2luY2UgaXQgcmV0dXJucyBvbmx5IGEgZGV2aWNl4oaSY29uZmlnIGRpY3QgYW5kIHN3YWxsb3dzIHBlci1kZXZpY2UgZmFpbHVyZXMsIHRoZSBkcml2ZXIgYXNzZXJ0cyBzdWNjZXNzIGl0c2VsZiAoZXhwZWN0ZWQgZGV2aWNlIHNldCBkZXJpdmVkIGZyb20gZ29sZGVuIGZpbGVuYW1lcywgZW1wdHktY29uZmlnIGRldGVjdGlvbiwgYSBsb2d1cnUgc2luayB0aGF0IGZhaWxzIHRoZSBydW4gb24gYW55IEVSUk9SIHJlY29yZCkKLSAqKmB0ZXN0cy9lMmUvY29tcGFyZS5weWAqKiDigJQgZXhhY3QgZmlsZS1zZXQgZXF1YWxpdHkgKG1pc3NpbmcgLyBleHRyYSAvIG1pc21hdGNoZWQgcmVwb3J0ZWQgc2VwYXJhdGVseSksIHN0cnVjdHVyYWwgZGlmZiBwYXRocyBsaWtlIGBQT1JUfEV0aGVybmV0NC5zcGVlZGAsIGNhbm9uaWNhbCB1bmlmaWVkIGRpZmYsIGAtLXJlZ2VuZXJhdGVgIGZvciBpbnRlbnRpb25hbCBvdXRwdXQgY2hhbmdlcwotICoqYHRlc3RzL2UyZS9ydW4uc2hgICsgTWFrZWZpbGUgdGFyZ2V0cyoqIGBzb25pYy1lMmVgLCBgc29uaWMtZTJlLXJlZ2VuYCwgYHNvbmljLWUyZS11cGAsIGBzb25pYy1lMmUtZG93bmA7IG5ldGJveC1tYW5hZ2VyIGlzIGluc3RhbGxlZCBmcm9tIGEgY2hlY2tvdXQgKHNpYmxpbmcgZGlyIG9yIGBORVRCT1hfTUFOQUdFUl9ESVJgKSBpbnRvIGEgZGVkaWNhdGVkIHZlbnYKLSAqKkdvbGRlbiBmaWxlcyoqIGZvciB0aGUgZml2ZSBleGFtcGxlLXRlc3RiZWQgc3dpdGNoZXMsIGNyb3NzLWNoZWNrZWQgYWdhaW5zdCB0aGVpciBpbmRlcGVuZGVudCBzb3VyY2VzIChzZWVkIFlBTUwsIHBvcnRfY29uZmlnIGAuaW5pYCBzcGVlZHMsIHRoZSBBU04gZGVyaXZhdGlvbiBydWxlKSBhbmQgcmVwcm9kdWNlZCBieXRlLWZvci1ieXRlIGJ5IGEgc2Vjb25kIHNlZWQtYW5kLWdlbmVyYXRlIGN5Y2xlCi0gKipCcmVha291dCByZWdyZXNzaW9uIHNjZW5hcmlvKiogKGB0ZXN0cy9lMmUvc2NlbmFyaW8vYCkg4oCUIHRoZSBiYXNlIGV4YW1wbGUgbW9kZWxzIG5vIGJyZWFrb3V0IHBvcnRzIGFuZCBzZXRzIG5vIGV4cGxpY2l0IGludGVyZmFjZSBzcGVlZHMsIHNvIHRob3NlIGNvZGUgcGF0aHMgd2VyZSB1bmV4ZXJjaXNlZC4gQSBzZWNvbmQgc2VlZGluZyBwYXNzIGFkZHMgdHdvIGRldmljZXMgKGEgbWluaW1hbCBzeW50aGV0aWMgYEFjY3Rvbi1BUzk3MjYtMzJEYCBkZXZpY2UgdHlwZSkgdGhhdCBicmVhayBhIDQwMEcgbWFzdGVyIGludG8gYSA0eDEwMEcgZ3JvdXAgd2hvc2Ugbm9uLW1hc3RlciBzdWItcG9ydHMgdGFrZSB0aGUgYF9hZGRfbWlzc2luZ19icmVha291dF9wb3J0c2AgcGF0aDsgb25lIGRlcml2ZXMgdGhlIHN1Yi1wb3J0IHNwZWVkIGZyb20gdGhlIGludGVyZmFjZSB0eXBlLCB0aGUgb3RoZXIgc2V0cyBpdCBleHBsaWNpdGx5IGluIGticHMsIGFuZCBib3RoIG11c3QgeWllbGQgYDEwMDAwMGAuIEEgdGFnZ2VkLVZMQU4gcG9ydCBhZGRzIFZMQU4gLyBWTEFOX01FTUJFUiBjb3ZlcmFnZS4gVGhlIHNlZWQgZGF0YSBpcyBzeW50aGV0aWMgYW5kIG1vZGVsZWQgb24gcmVhbCBkZXBsb3ltZW50IGNvbnZlbnRpb25zIChubyBjdXN0b21lciBpZGVudGlmaWVycykuCi0gKipadXVsIGpvYiBgcHl0aG9uLW9zaXNtLXNvbmljLWUyZWAqKiBpbiBjaGVjayAocmVzdHJpY3RlZCBieSBhIGZpbGVzIG1hdGNoZXIgdG8gY2hhbmdlcyB0aGF0IGNhbiBhbHRlciBnZW5lcmF0b3Igb3V0cHV0KSBhbmQgcGVyaW9kaWMtZGFpbHkgKHVuY29uZGl0aW9uYWwsIGJvdW5kcyBzZWVkLWRhdGEgZHJpZnQpOyBuZXRib3gtbWFuYWdlciBjb21lcyBmcm9tIGByZXF1aXJlZC1wcm9qZWN0c2AsIHNvIGBEZXBlbmRzLU9uYCBpcyBob25vcmVkIGZvciBpdHMgY29kZSBhbmQgc2VlZCBkYXRhCi0gKipEcml2ZS1ieSBmaXgqKjogYF9hZGRfc25tcF9jb25maWd1cmF0aW9uYCBubyBsb25nZXIgYnVpbGRzIHRoZSBSZWRpcy1iYWNrZWQgQW5zaWJsZSB2YXVsdCBmb3IgZGV2aWNlcyB3aXRob3V0IGVuY3J5cHRlZCBzZWNyZXRzIOKAlCBpdCBsb2dnZWQgdGhyZWUgRVJST1JzIHBlciBkZXZpY2UgaW4gYW55IGVudmlyb25tZW50IHdpdGhvdXQgdmF1bHQgaW5mcmFzdHJ1Y3R1cmUgKGZvdW5kIGJ5IHRoZSBuZXcgZXJyb3IgZ3VhcmQpCgojIyBWZXJpZmljYXRpb24KCi0gVW5pdCB0ZXN0cyBwYXNzICgyMDQzKTsgdGhlIGNvbXBhcmF0b3IgYW5kIGRyaXZlciBsb2dpYyBhcmUgdW5pdC10ZXN0ZWQgKGB0ZXN0cy91bml0L2UyZS9gKQotIEZ1bGwgbG9jYWwgRTJFIGN5Y2xlIGFnYWluc3Qga2luZCArIE5ldEJveCA0LjUuMTA6IGdvbGRlbiBib290c3RyYXAsIHRoZW4gYSBjb21wYXJlLW1vZGUgcmVydW4gYWdhaW5zdCBhIGZyZXNoIHJlLXNlZWQgcmVwcm9kdWNlZCBhbGwgc2V2ZW4gZ29sZGVucyBieXRlLWZvci1ieXRlCi0gKipSZWdyZXNzaW9uIGd1YXJkIHZlcmlmaWVkKio6IHJldmVydGluZyB0aGUgc3BlZWQtbm9ybWFsaXphdGlvbiBmaXggYWdhaW5zdCB0aGVzZSBnb2xkZW5zIHR1cm5zIGV4YWN0bHkgdGhlIGFmZmVjdGVkIGRldmljZSByZWQg4oCUIHRoZSBkZXJpdmVkIGJyZWFrb3V0IGRldmljZSBzaG93cyBgMTAwMDAwIOKGkiAxMDBgICh0aGUgY3VzdG9tZXItdmlzaWJsZSBzeW1wdG9tKSwgdGhlIGV4cGxpY2l0IGRldmljZSBgMTAwMDAwIOKGkiAxMDAwMDAwMDBgIChyYXcga2Jwcykg4oCUIGFuZCB0aGUgdHdvIHJldmVydCB2YXJpYW50cyBpc29sYXRlIHRoZSB0d28gaGlzdG9yaWNhbCBidWdzOyB0aGUgY3VycmVudCBjb2RlIGtlZXBzIGJvdGggZ3JlZW4KLSBgcHl0aG9uLW9zaXNtLXNvbmljLWUyZWAgaXMgZ3JlZW4gaW4gQ0ksIHNlZWRpbmcgdGhlIG92ZXJsYXkgYW5kIG1hdGNoaW5nIGFsbCBzZXZlbiBnb2xkZW5zICh0aGUgam9iIHZhbGlkYXRlcyBpdHNlbGYgb24gdGhpcyBQUiDigJQgdGhlIGZpbGVzIG1hdGNoZXIgY292ZXJzIGAuenV1bC55YW1sYCwgYHRlc3RzL2UyZS9gLCBhbmQgdGhlIHBsYXlib29rcykKCiMjIEZvbGxvdy11cCB3b3JrCgotIEJyb2FkZW4gY292ZXJhZ2UgdG8gdGhlIGdlbmVyYXRvciBzdWJzeXN0ZW1zIHRoZSBjdXJyZW50IHNlZWQgZGF0YSBzdGlsbCBsZWF2ZXMgdW5leGVyY2lzZWQ6IFZYTEFOIC8gRVZQTiArIFZSRiwgcG9ydC1jaGFubmVscywgYWRkaXRpb25hbCBod3NrdXMsIEROUyAvIE5UUC4gVGhlIGJhc2UgZXhhbXBsZSBwb3B1bGF0ZXMgMTYgY29uZmlnLWRiIHRhYmxlcyBhbmQgZW1pdHMgcm91Z2hseSBhcyBtYW55IGVtcHR5OyBlYWNoIHNlZWRlZCBkZXZpY2UncyBnb2xkZW4gcGlucyBpdHMgZW50aXJlIGNvbmZpZywgc28gY292ZXJhZ2UgZ3Jvd3MgYnkgc2VlZGluZyBtb3JlIHJlcHJlc2VudGF0aXZlIGRldmljZXMuIEEgaGlnaGVyLWZpZGVsaXR5IG9wdGlvbiBpcyB0byBnZW5lcmF0ZSBhZ2FpbnN0IHNhbml0aXplZCBjb3BpZXMgb2YgcmVhbCBjb25maWdzLgotIEZhY3RvciB0aGUga2luZCAvIGt1YmVjdGwgLyBoZWxtIHByZS1ydW4gaW50byBhIHNoYXJlZCB6dXVsLWpvYnMgcm9sZSBpbnN0ZWFkIG9mIHRoZSBjb3B5IGFkYXB0ZWQgZnJvbSBuZXRib3gtbWFuYWdlcidzIGBwcmUtZTJlLnltbGAuCgrwn6SWIEdlbmVyYXRlZCB3aXRoIFtDbGF1ZGUgQ29kZV0oaHR0cHM6Ly9jbGF1ZGUuY29tL2NsYXVkZS1jb2RlKQ==
      patchset: 56e338acd5e5f5dfbf20ee1a6af7a12d61bf9a40
      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: e4ad365800586d2a13ffcf6f2dab72fb81cedd88
          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-sonic-e2e.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/netbox-manager:
          canonical_hostname: github.com
          canonical_name: github.com/osism/netbox-manager
          checkout: main
          checkout_description: zuul branch
          commit: dfe5d75411dffe0c23ac54a709d2ed15b2922c76
          name: osism/netbox-manager
          required: true
          short_name: netbox-manager
          src_dir: src/github.com/osism/netbox-manager
        github.com/osism/python-osism:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          checkout: main
          checkout_description: zuul branch
          commit: e4ad365800586d2a13ffcf6f2dab72fb81cedd88
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2483/head
      resources: {}
      tenant: osism
      timeout: 2400
      topic: null
      voting: true
