all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe0f:187
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 5adb2cb4-1090-4d03-a4a7-995fed1e6799
        host_id: 7f2607eceb24f4583c6f9496c53c64b51afe50de5eacda4379b21c42
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe0f:187
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.42
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.235
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe0f:187
        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-test-setup explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/python-osism/.zuul.yaml@main#128>'
      - '<Job python-osism-test-setup explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: ee985ae36589407bbc876c40bd4a4bc9
      build_refs:
      - branch: main
        change: '2479'
        change_message: "Normalize NetBox interface speeds to Mbps at collection time\n\n##
          Summary\n\nFixes the broken SONiC breakout port speeds reported in #2478
          (e.g. `\"speed\": \"100\"` with `\"valid_speeds\": \"100,10000,1000\"` on
          a 100G breakout of an Edgecore 9726-32DB).\n\n`netbox_interfaces` mixed
          two units: explicitly set NetBox speeds are stored in **kbps**, while speeds
          derived from the interface type via `get_speed_from_port_type` are already
          **Mbps**. The kbps-to-Mbps division applied downstream in the breakout paths
          therefore turned a derived 100G breakout port (`100000` Mbps) into `\"100\"`.
          The regression window matches 1dbcb2b, which added the division to `_add_missing_breakout_ports`
          \u2014 the path breakout subports take on platforms whose `port_config`
          only lists master ports.\n\n## Changes\n\n**Config generation (`config_generator.py`):**\n-
          Normalize the unit once at collection time in `generate_sonic_config`: explicit
          NetBox speeds (kbps) are converted to Mbps when `netbox_interfaces` is built,
          derived speeds pass through unchanged. The mapping now always carries Mbps.\n-
          Drop the three per-site `// 1000` divisions in `_add_port_configurations`
          and `_add_missing_breakout_ports`.\n- Determine `speed_explicit` with `bool()`
          so an explicit speed of `0` is no longer labeled explicit while the value
          is actually derived from the port type.\n\n**Breakout detection (`interface.py`):**\n-
          `detect_breakout_ports` compared raw NetBox speeds against Mbps constants,
          so interfaces with an explicitly set speed (kbps) could never match a breakout
          mode. The new `get_interface_speed` helper returns Mbps regardless of the
          source and is used at all four detection sites.\n\n**Tests:**\n- Update
          the unit tests that encoded the mixed-unit behavior, model explicit NetBox
          speeds in kbps as NetBox stores them, and add coverage for the normalization,
          the `get_interface_speed` helper, and the 100G breakout scenario from the
          issue.\n\nCloses #2478\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2479
        commit_id: 8498d69b4b50db16cdb97b28f3f8c66acbc84df3
        patchset: 8498d69b4b50db16cdb97b28f3f8c66acbc84df3
        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: 68955c36c459438a8835eca50759e848
      buildset_refs:
      - branch: main
        change: '2479'
        change_message: "Normalize NetBox interface speeds to Mbps at collection time\n\n##
          Summary\n\nFixes the broken SONiC breakout port speeds reported in #2478
          (e.g. `\"speed\": \"100\"` with `\"valid_speeds\": \"100,10000,1000\"` on
          a 100G breakout of an Edgecore 9726-32DB).\n\n`netbox_interfaces` mixed
          two units: explicitly set NetBox speeds are stored in **kbps**, while speeds
          derived from the interface type via `get_speed_from_port_type` are already
          **Mbps**. The kbps-to-Mbps division applied downstream in the breakout paths
          therefore turned a derived 100G breakout port (`100000` Mbps) into `\"100\"`.
          The regression window matches 1dbcb2b, which added the division to `_add_missing_breakout_ports`
          \u2014 the path breakout subports take on platforms whose `port_config`
          only lists master ports.\n\n## Changes\n\n**Config generation (`config_generator.py`):**\n-
          Normalize the unit once at collection time in `generate_sonic_config`: explicit
          NetBox speeds (kbps) are converted to Mbps when `netbox_interfaces` is built,
          derived speeds pass through unchanged. The mapping now always carries Mbps.\n-
          Drop the three per-site `// 1000` divisions in `_add_port_configurations`
          and `_add_missing_breakout_ports`.\n- Determine `speed_explicit` with `bool()`
          so an explicit speed of `0` is no longer labeled explicit while the value
          is actually derived from the port type.\n\n**Breakout detection (`interface.py`):**\n-
          `detect_breakout_ports` compared raw NetBox speeds against Mbps constants,
          so interfaces with an explicitly set speed (kbps) could never match a breakout
          mode. The new `get_interface_speed` helper returns Mbps regardless of the
          source and is used at all four detection sites.\n\n**Tests:**\n- Update
          the unit tests that encoded the mixed-unit behavior, model explicit NetBox
          speeds in kbps as NetBox stores them, and add coverage for the normalization,
          the `get_interface_speed` helper, and the 100G breakout scenario from the
          issue.\n\nCloses #2478\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2479
        commit_id: 8498d69b4b50db16cdb97b28f3f8c66acbc84df3
        patchset: 8498d69b4b50db16cdb97b28f3f8c66acbc84df3
        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: '2479'
      change_message: "Normalize NetBox interface speeds to Mbps at collection time\n\n##
        Summary\n\nFixes the broken SONiC breakout port speeds reported in #2478 (e.g.
        `\"speed\": \"100\"` with `\"valid_speeds\": \"100,10000,1000\"` on a 100G
        breakout of an Edgecore 9726-32DB).\n\n`netbox_interfaces` mixed two units:
        explicitly set NetBox speeds are stored in **kbps**, while speeds derived
        from the interface type via `get_speed_from_port_type` are already **Mbps**.
        The kbps-to-Mbps division applied downstream in the breakout paths therefore
        turned a derived 100G breakout port (`100000` Mbps) into `\"100\"`. The regression
        window matches 1dbcb2b, which added the division to `_add_missing_breakout_ports`
        \u2014 the path breakout subports take on platforms whose `port_config` only
        lists master ports.\n\n## Changes\n\n**Config generation (`config_generator.py`):**\n-
        Normalize the unit once at collection time in `generate_sonic_config`: explicit
        NetBox speeds (kbps) are converted to Mbps when `netbox_interfaces` is built,
        derived speeds pass through unchanged. The mapping now always carries Mbps.\n-
        Drop the three per-site `// 1000` divisions in `_add_port_configurations`
        and `_add_missing_breakout_ports`.\n- Determine `speed_explicit` with `bool()`
        so an explicit speed of `0` is no longer labeled explicit while the value
        is actually derived from the port type.\n\n**Breakout detection (`interface.py`):**\n-
        `detect_breakout_ports` compared raw NetBox speeds against Mbps constants,
        so interfaces with an explicitly set speed (kbps) could never match a breakout
        mode. The new `get_interface_speed` helper returns Mbps regardless of the
        source and is used at all four detection sites.\n\n**Tests:**\n- Update the
        unit tests that encoded the mixed-unit behavior, model explicit NetBox speeds
        in kbps as NetBox stores them, and add coverage for the normalization, the
        `get_interface_speed` helper, and the 100G breakout scenario from the issue.\n\nCloses
        #2478\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)"
      change_url: https://github.com/osism/python-osism/pull/2479
      child_jobs: []
      commit_id: 8498d69b4b50db16cdb97b28f3f8c66acbc84df3
      event_id: 0ee70a50-81cc-11f1-8d74-503cd2b31296
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/ee985ae36589407bbc876c40bd4a4bc9/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/ee985ae36589407bbc876c40bd4a4bc9/work/logs
        result_data_file: /var/lib/zuul/builds/ee985ae36589407bbc876c40bd4a4bc9/work/results.json
        src_root: /var/lib/zuul/builds/ee985ae36589407bbc876c40bd4a4bc9/work/src
        work_root: /var/lib/zuul/builds/ee985ae36589407bbc876c40bd4a4bc9/work
      include_vars: []
      items:
      - branch: main
        change: '2479'
        change_message: "Normalize NetBox interface speeds to Mbps at collection time\n\n##
          Summary\n\nFixes the broken SONiC breakout port speeds reported in #2478
          (e.g. `\"speed\": \"100\"` with `\"valid_speeds\": \"100,10000,1000\"` on
          a 100G breakout of an Edgecore 9726-32DB).\n\n`netbox_interfaces` mixed
          two units: explicitly set NetBox speeds are stored in **kbps**, while speeds
          derived from the interface type via `get_speed_from_port_type` are already
          **Mbps**. The kbps-to-Mbps division applied downstream in the breakout paths
          therefore turned a derived 100G breakout port (`100000` Mbps) into `\"100\"`.
          The regression window matches 1dbcb2b, which added the division to `_add_missing_breakout_ports`
          \u2014 the path breakout subports take on platforms whose `port_config`
          only lists master ports.\n\n## Changes\n\n**Config generation (`config_generator.py`):**\n-
          Normalize the unit once at collection time in `generate_sonic_config`: explicit
          NetBox speeds (kbps) are converted to Mbps when `netbox_interfaces` is built,
          derived speeds pass through unchanged. The mapping now always carries Mbps.\n-
          Drop the three per-site `// 1000` divisions in `_add_port_configurations`
          and `_add_missing_breakout_ports`.\n- Determine `speed_explicit` with `bool()`
          so an explicit speed of `0` is no longer labeled explicit while the value
          is actually derived from the port type.\n\n**Breakout detection (`interface.py`):**\n-
          `detect_breakout_ports` compared raw NetBox speeds against Mbps constants,
          so interfaces with an explicitly set speed (kbps) could never match a breakout
          mode. The new `get_interface_speed` helper returns Mbps regardless of the
          source and is used at all four detection sites.\n\n**Tests:**\n- Update
          the unit tests that encoded the mixed-unit behavior, model explicit NetBox
          speeds in kbps as NetBox stores them, and add coverage for the normalization,
          the `get_interface_speed` helper, and the 100G breakout scenario from the
          issue.\n\nCloses #2478\n\n\U0001F916 Generated with [Claude Code](https://claude.com/claude-code)"
        change_url: https://github.com/osism/python-osism/pull/2479
        commit_id: 8498d69b4b50db16cdb97b28f3f8c66acbc84df3
        patchset: 8498d69b4b50db16cdb97b28f3f8c66acbc84df3
        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-test-setup
      jobtags: []
      max_attempts: 3
      message: Tm9ybWFsaXplIE5ldEJveCBpbnRlcmZhY2Ugc3BlZWRzIHRvIE1icHMgYXQgY29sbGVjdGlvbiB0aW1lCgojIyBTdW1tYXJ5CgpGaXhlcyB0aGUgYnJva2VuIFNPTmlDIGJyZWFrb3V0IHBvcnQgc3BlZWRzIHJlcG9ydGVkIGluICMyNDc4IChlLmcuIGAic3BlZWQiOiAiMTAwImAgd2l0aCBgInZhbGlkX3NwZWVkcyI6ICIxMDAsMTAwMDAsMTAwMCJgIG9uIGEgMTAwRyBicmVha291dCBvZiBhbiBFZGdlY29yZSA5NzI2LTMyREIpLgoKYG5ldGJveF9pbnRlcmZhY2VzYCBtaXhlZCB0d28gdW5pdHM6IGV4cGxpY2l0bHkgc2V0IE5ldEJveCBzcGVlZHMgYXJlIHN0b3JlZCBpbiAqKmticHMqKiwgd2hpbGUgc3BlZWRzIGRlcml2ZWQgZnJvbSB0aGUgaW50ZXJmYWNlIHR5cGUgdmlhIGBnZXRfc3BlZWRfZnJvbV9wb3J0X3R5cGVgIGFyZSBhbHJlYWR5ICoqTWJwcyoqLiBUaGUga2Jwcy10by1NYnBzIGRpdmlzaW9uIGFwcGxpZWQgZG93bnN0cmVhbSBpbiB0aGUgYnJlYWtvdXQgcGF0aHMgdGhlcmVmb3JlIHR1cm5lZCBhIGRlcml2ZWQgMTAwRyBicmVha291dCBwb3J0IChgMTAwMDAwYCBNYnBzKSBpbnRvIGAiMTAwImAuIFRoZSByZWdyZXNzaW9uIHdpbmRvdyBtYXRjaGVzIDFkYmNiMmIsIHdoaWNoIGFkZGVkIHRoZSBkaXZpc2lvbiB0byBgX2FkZF9taXNzaW5nX2JyZWFrb3V0X3BvcnRzYCDigJQgdGhlIHBhdGggYnJlYWtvdXQgc3VicG9ydHMgdGFrZSBvbiBwbGF0Zm9ybXMgd2hvc2UgYHBvcnRfY29uZmlnYCBvbmx5IGxpc3RzIG1hc3RlciBwb3J0cy4KCiMjIENoYW5nZXMKCioqQ29uZmlnIGdlbmVyYXRpb24gKGBjb25maWdfZ2VuZXJhdG9yLnB5YCk6KioKLSBOb3JtYWxpemUgdGhlIHVuaXQgb25jZSBhdCBjb2xsZWN0aW9uIHRpbWUgaW4gYGdlbmVyYXRlX3NvbmljX2NvbmZpZ2A6IGV4cGxpY2l0IE5ldEJveCBzcGVlZHMgKGticHMpIGFyZSBjb252ZXJ0ZWQgdG8gTWJwcyB3aGVuIGBuZXRib3hfaW50ZXJmYWNlc2AgaXMgYnVpbHQsIGRlcml2ZWQgc3BlZWRzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQuIFRoZSBtYXBwaW5nIG5vdyBhbHdheXMgY2FycmllcyBNYnBzLgotIERyb3AgdGhlIHRocmVlIHBlci1zaXRlIGAvLyAxMDAwYCBkaXZpc2lvbnMgaW4gYF9hZGRfcG9ydF9jb25maWd1cmF0aW9uc2AgYW5kIGBfYWRkX21pc3NpbmdfYnJlYWtvdXRfcG9ydHNgLgotIERldGVybWluZSBgc3BlZWRfZXhwbGljaXRgIHdpdGggYGJvb2woKWAgc28gYW4gZXhwbGljaXQgc3BlZWQgb2YgYDBgIGlzIG5vIGxvbmdlciBsYWJlbGVkIGV4cGxpY2l0IHdoaWxlIHRoZSB2YWx1ZSBpcyBhY3R1YWxseSBkZXJpdmVkIGZyb20gdGhlIHBvcnQgdHlwZS4KCioqQnJlYWtvdXQgZGV0ZWN0aW9uIChgaW50ZXJmYWNlLnB5YCk6KioKLSBgZGV0ZWN0X2JyZWFrb3V0X3BvcnRzYCBjb21wYXJlZCByYXcgTmV0Qm94IHNwZWVkcyBhZ2FpbnN0IE1icHMgY29uc3RhbnRzLCBzbyBpbnRlcmZhY2VzIHdpdGggYW4gZXhwbGljaXRseSBzZXQgc3BlZWQgKGticHMpIGNvdWxkIG5ldmVyIG1hdGNoIGEgYnJlYWtvdXQgbW9kZS4gVGhlIG5ldyBgZ2V0X2ludGVyZmFjZV9zcGVlZGAgaGVscGVyIHJldHVybnMgTWJwcyByZWdhcmRsZXNzIG9mIHRoZSBzb3VyY2UgYW5kIGlzIHVzZWQgYXQgYWxsIGZvdXIgZGV0ZWN0aW9uIHNpdGVzLgoKKipUZXN0czoqKgotIFVwZGF0ZSB0aGUgdW5pdCB0ZXN0cyB0aGF0IGVuY29kZWQgdGhlIG1peGVkLXVuaXQgYmVoYXZpb3IsIG1vZGVsIGV4cGxpY2l0IE5ldEJveCBzcGVlZHMgaW4ga2JwcyBhcyBOZXRCb3ggc3RvcmVzIHRoZW0sIGFuZCBhZGQgY292ZXJhZ2UgZm9yIHRoZSBub3JtYWxpemF0aW9uLCB0aGUgYGdldF9pbnRlcmZhY2Vfc3BlZWRgIGhlbHBlciwgYW5kIHRoZSAxMDBHIGJyZWFrb3V0IHNjZW5hcmlvIGZyb20gdGhlIGlzc3VlLgoKQ2xvc2VzICMyNDc4Cgrwn6SWIEdlbmVyYXRlZCB3aXRoIFtDbGF1ZGUgQ29kZV0oaHR0cHM6Ly9jbGF1ZGUuY29tL2NsYXVkZS1jb2RlKQ==
      patchset: 8498d69b4b50db16cdb97b28f3f8c66acbc84df3
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 71b711c422c10c242a8f785dc6d41ed9d12e9cd3
          trusted/project_1/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 242732586e2cba04d04867d3e302888c766bc231
          trusted/project_2/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 1d71e58c93442038e695a5d883d57a603182c7ae
          untrusted/project_0/github.com/osism/python-osism:
            canonical_name: github.com/osism/python-osism
            checkout: main
            commit: 6041e19f0e92eec481b1dadca694bb9bab4b74b2
          untrusted/project_1/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 71b711c422c10c242a8f785dc6d41ed9d12e9cd3
          untrusted/project_2/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 242732586e2cba04d04867d3e302888c766bc231
          untrusted/project_3/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 1d71e58c93442038e695a5d883d57a603182c7ae
        playbooks:
        - path: untrusted/project_0/github.com/osism/python-osism/playbooks/test-setup.yml
          roles:
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_1/zuul-config
            link_target: untrusted/project_1/github.com/osism/zuul-config
            role_path: ansible/playbook_0/role_1/zuul-config/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/playbook_0/role_2/openinfra-zuul-jobs
            link_target: untrusted/project_2/github.com/osism/openinfra-zuul-jobs
            role_path: ansible/playbook_0/role_2/openinfra-zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_3/zuul-jobs
            link_target: untrusted/project_3/github.com/osism/zuul-jobs
            role_path: ansible/playbook_0/role_3/zuul-jobs/roles
      post_review: false
      post_timeout: 1800
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/osism/python-osism
        name: osism/python-osism
        short_name: python-osism
        src_dir: src/github.com/osism/python-osism
      projects:
        github.com/osism/python-osism:
          canonical_hostname: github.com
          canonical_name: github.com/osism/python-osism
          checkout: main
          checkout_description: zuul branch
          commit: 6041e19f0e92eec481b1dadca694bb9bab4b74b2
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2479/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
