all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe75:2287
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 5bd26d98-83e5-4188-bd45-3e1840a1df84
        host_id: 7f2607eceb24f4583c6f9496c53c64b51afe50de5eacda4379b21c42
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe75:2287
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.254
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.192.10
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe75:2287
        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-black explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#54>'
      - '<Job python-black explicit: None implied: None source: osism/python-osism/.zuul.yaml@main#143>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 5dd1491c16f6409994c92c6952698f68
      build_refs:
      - branch: main
        change: '2561'
        change_message: "Correct base config provenance and make its path configurable\n\nThe
          SONiC config generator builds each device's config on top of a base\n`config_db.json`.
          That base is **this repo's** `files/sonic/config_db.json`,\nwhich the Containerfile
          installs into the conductor image at\n`/etc/sonic/config_db.json` \u2014
          nothing from a switch's own config ever reaches\nthe generator.\n\nUntil
          now that path was hardcoded, and the ownership model documented it as\n\"the
          device's image-provided base config_db.json\", which is the switch's image\nrather
          than the conductor's. Both problems have consequences.\n\n## What the hardcoded
          path costs\n\nA generator running outside the conductor image \u2014 local
          development, or a test\nharness in a venv \u2014 finds nothing at that path
          and proceeds with an **empty**\nbase. Silently, because the miss was logged
          at debug level, and because the\ngenerator's own output is unaffected: every
          table it emits is still there.\n\nWhat is missing is everything only the
          base supplies \u2014 the `DEVICE_METADATA`\nlocalhost fields the generator
          does not write itself (`type`,\n`default_config_profile`, `frr_mgmt_framework_config`,
          `intf_naming_mode`) and\n**every pass-through table**: `FEATURE`, `CLASSIFIER_TABLE`,
          the `POLICY_*` set,\nthe `ECMP_LOADSHARE_*` pair, `SWITCH`, `ZTP`, `KDUMP`
          and the rest. Counted\nagainst the shipped base, that is **24 tables** populated
          in production that a\nvenv-generated config omits entirely. The read-only
          `TELEMETRY` gNMI port is\nabsent too, but degrades to `DEFAULT_GNMI_PORT`
          rather than vanishing.\n\nA golden test harness generating in a venv hits
          exactly this, which is how it\nwent unnoticed for months:\n\n- #2483\n\n##
          What the wrong provenance cost\n\nClassifying the base config as foreign,
          operator-editable content justified\ndropping and rebuilding owned tables
          \u2014 but a file baked into a container image\nis not an operator-editable
          surface to begin with. Meanwhile the role that file\nactually had, carrying
          shipped defaults, went unrecognised, so classifying those\ntables as owned
          silently deleted their content on every regen.\n\nThat is the default-VRF
          regression: BGP entries shipped in the base config, the\nowned-table drop
          removed them, nothing regenerated them, and the default VRF\nstopped advertising
          its routes into EVPN.\n\n- #2515\n\n## The three commits\n\n**`sonic: document
          base config as repo-shipped`** \u2014 correct the provenance\nwherever it
          is stated, and add a \"Where defaults belong\" paragraph, because the\nprovenance
          alone does not tell a reader what to do: owned tables are dropped\nbefore
          any helper runs, so a populated owned table in the base config is dead\ncontent
          and defaults the generator needs must live in the module as policy\nconstants.
          Renames `IMAGE_CONSUMED_TABLE_KEYS` to `READ_ONLY_TABLE_KEYS`, since\n\"image\"
          is the word that invited the confusion. Documentation and comments only.\n\n**`sonic:
          guard base config against owned content`** \u2014 the substantive part.
          A\nstatic test reads the **real shipped file** and fails when it populates
          a\ngenerator-owned table. It needs no fixture, so it cannot drift from production,\nand
          it generalises: it fires for the next table that gets orphaned, not just
          the\nfive that were. Verified against the pre-fix base config, where it
          names\n`BGP_GLOBALS`, `BGP_GLOBALS_AF`, `BGP_GLOBALS_ROUTE_ADVERTISE`,\n`ROUTE_REDISTRIBUTE`
          and `VRF`.\n\nWorth being explicit about why more of the existing style
          of test would not\nhave helped: every base-config fixture is built from
          `TOP_LEVEL_SCAFFOLD_KEYS`\nwith all tables empty, so dropping populated
          content is indistinguishable from\ndropping nothing. The exhaustive stale-entry
          sweep seeds a sentinel into every\nowned table and asserts it is gone, which
          verifies the drop works \u2014 but the drop\nis the mechanism at fault,
          and a test asserting that deletion happens cannot\ndetect over-deletion.\n\n`SNMP_SERVER`
          is the one allowlisted table: `_add_snmp_configuration` emits\n`SNMP_SERVER[\"SYSTEM\"]`
          on every run with hardcoded defaults regardless of\nNetBox data, so the
          shipped entry is redundant rather than load-bearing. It\ncould be dropped
          from the base config, which would let the allowlist go away;\nleft out here
          to keep that commit test-only.\n\n**`sonic: make the base config path configurable`**
          \u2014 add\n`SONIC_BASE_CONFIG_PATH`, and raise the not-found log from debug
          to warning.\nGenerating without a base config is not a routine condition
          to discover by\nturning debug logging on; it means the output is incomplete.
          `ERROR` would be\ntoo strong, since the fallback is deliberate and the run
          still produces usable\nconfig for the owned tables, which is what a from-scratch
          device needs.\n\n## Blast radius\n\nNothing changes in production or in
          CI. `SONIC_BASE_CONFIG_PATH` defaults to the\nprevious hardcoded value,
          so the conductor behaves exactly as before, and no\ncaller sets it yet \u2014
          no generated config moves, and no golden file changes. What\nthe PR buys
          is that a harness or a developer *can* now point at the in-repo copy\nand
          generate what the conductor generates.\n\n## Verification\n\nFull unit suite
          passes (3083 passed, 4 pre-existing xfails). `flake8` and\n`black` clean.\n"
        change_url: https://github.com/osism/python-osism/pull/2561
        commit_id: a8f25b1439dc2bc79e54cfd004c002238826919b
        patchset: a8f25b1439dc2bc79e54cfd004c002238826919b
        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: 5856a4fdb21d438e8abccddeb0fe54ea
      buildset_refs:
      - branch: main
        change: '2561'
        change_message: "Correct base config provenance and make its path configurable\n\nThe
          SONiC config generator builds each device's config on top of a base\n`config_db.json`.
          That base is **this repo's** `files/sonic/config_db.json`,\nwhich the Containerfile
          installs into the conductor image at\n`/etc/sonic/config_db.json` \u2014
          nothing from a switch's own config ever reaches\nthe generator.\n\nUntil
          now that path was hardcoded, and the ownership model documented it as\n\"the
          device's image-provided base config_db.json\", which is the switch's image\nrather
          than the conductor's. Both problems have consequences.\n\n## What the hardcoded
          path costs\n\nA generator running outside the conductor image \u2014 local
          development, or a test\nharness in a venv \u2014 finds nothing at that path
          and proceeds with an **empty**\nbase. Silently, because the miss was logged
          at debug level, and because the\ngenerator's own output is unaffected: every
          table it emits is still there.\n\nWhat is missing is everything only the
          base supplies \u2014 the `DEVICE_METADATA`\nlocalhost fields the generator
          does not write itself (`type`,\n`default_config_profile`, `frr_mgmt_framework_config`,
          `intf_naming_mode`) and\n**every pass-through table**: `FEATURE`, `CLASSIFIER_TABLE`,
          the `POLICY_*` set,\nthe `ECMP_LOADSHARE_*` pair, `SWITCH`, `ZTP`, `KDUMP`
          and the rest. Counted\nagainst the shipped base, that is **24 tables** populated
          in production that a\nvenv-generated config omits entirely. The read-only
          `TELEMETRY` gNMI port is\nabsent too, but degrades to `DEFAULT_GNMI_PORT`
          rather than vanishing.\n\nA golden test harness generating in a venv hits
          exactly this, which is how it\nwent unnoticed for months:\n\n- #2483\n\n##
          What the wrong provenance cost\n\nClassifying the base config as foreign,
          operator-editable content justified\ndropping and rebuilding owned tables
          \u2014 but a file baked into a container image\nis not an operator-editable
          surface to begin with. Meanwhile the role that file\nactually had, carrying
          shipped defaults, went unrecognised, so classifying those\ntables as owned
          silently deleted their content on every regen.\n\nThat is the default-VRF
          regression: BGP entries shipped in the base config, the\nowned-table drop
          removed them, nothing regenerated them, and the default VRF\nstopped advertising
          its routes into EVPN.\n\n- #2515\n\n## The three commits\n\n**`sonic: document
          base config as repo-shipped`** \u2014 correct the provenance\nwherever it
          is stated, and add a \"Where defaults belong\" paragraph, because the\nprovenance
          alone does not tell a reader what to do: owned tables are dropped\nbefore
          any helper runs, so a populated owned table in the base config is dead\ncontent
          and defaults the generator needs must live in the module as policy\nconstants.
          Renames `IMAGE_CONSUMED_TABLE_KEYS` to `READ_ONLY_TABLE_KEYS`, since\n\"image\"
          is the word that invited the confusion. Documentation and comments only.\n\n**`sonic:
          guard base config against owned content`** \u2014 the substantive part.
          A\nstatic test reads the **real shipped file** and fails when it populates
          a\ngenerator-owned table. It needs no fixture, so it cannot drift from production,\nand
          it generalises: it fires for the next table that gets orphaned, not just
          the\nfive that were. Verified against the pre-fix base config, where it
          names\n`BGP_GLOBALS`, `BGP_GLOBALS_AF`, `BGP_GLOBALS_ROUTE_ADVERTISE`,\n`ROUTE_REDISTRIBUTE`
          and `VRF`.\n\nWorth being explicit about why more of the existing style
          of test would not\nhave helped: every base-config fixture is built from
          `TOP_LEVEL_SCAFFOLD_KEYS`\nwith all tables empty, so dropping populated
          content is indistinguishable from\ndropping nothing. The exhaustive stale-entry
          sweep seeds a sentinel into every\nowned table and asserts it is gone, which
          verifies the drop works \u2014 but the drop\nis the mechanism at fault,
          and a test asserting that deletion happens cannot\ndetect over-deletion.\n\n`SNMP_SERVER`
          is the one allowlisted table: `_add_snmp_configuration` emits\n`SNMP_SERVER[\"SYSTEM\"]`
          on every run with hardcoded defaults regardless of\nNetBox data, so the
          shipped entry is redundant rather than load-bearing. It\ncould be dropped
          from the base config, which would let the allowlist go away;\nleft out here
          to keep that commit test-only.\n\n**`sonic: make the base config path configurable`**
          \u2014 add\n`SONIC_BASE_CONFIG_PATH`, and raise the not-found log from debug
          to warning.\nGenerating without a base config is not a routine condition
          to discover by\nturning debug logging on; it means the output is incomplete.
          `ERROR` would be\ntoo strong, since the fallback is deliberate and the run
          still produces usable\nconfig for the owned tables, which is what a from-scratch
          device needs.\n\n## Blast radius\n\nNothing changes in production or in
          CI. `SONIC_BASE_CONFIG_PATH` defaults to the\nprevious hardcoded value,
          so the conductor behaves exactly as before, and no\ncaller sets it yet \u2014
          no generated config moves, and no golden file changes. What\nthe PR buys
          is that a harness or a developer *can* now point at the in-repo copy\nand
          generate what the conductor generates.\n\n## Verification\n\nFull unit suite
          passes (3083 passed, 4 pre-existing xfails). `flake8` and\n`black` clean.\n"
        change_url: https://github.com/osism/python-osism/pull/2561
        commit_id: a8f25b1439dc2bc79e54cfd004c002238826919b
        patchset: a8f25b1439dc2bc79e54cfd004c002238826919b
        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: '2561'
      change_message: "Correct base config provenance and make its path configurable\n\nThe
        SONiC config generator builds each device's config on top of a base\n`config_db.json`.
        That base is **this repo's** `files/sonic/config_db.json`,\nwhich the Containerfile
        installs into the conductor image at\n`/etc/sonic/config_db.json` \u2014 nothing
        from a switch's own config ever reaches\nthe generator.\n\nUntil now that
        path was hardcoded, and the ownership model documented it as\n\"the device's
        image-provided base config_db.json\", which is the switch's image\nrather
        than the conductor's. Both problems have consequences.\n\n## What the hardcoded
        path costs\n\nA generator running outside the conductor image \u2014 local
        development, or a test\nharness in a venv \u2014 finds nothing at that path
        and proceeds with an **empty**\nbase. Silently, because the miss was logged
        at debug level, and because the\ngenerator's own output is unaffected: every
        table it emits is still there.\n\nWhat is missing is everything only the base
        supplies \u2014 the `DEVICE_METADATA`\nlocalhost fields the generator does
        not write itself (`type`,\n`default_config_profile`, `frr_mgmt_framework_config`,
        `intf_naming_mode`) and\n**every pass-through table**: `FEATURE`, `CLASSIFIER_TABLE`,
        the `POLICY_*` set,\nthe `ECMP_LOADSHARE_*` pair, `SWITCH`, `ZTP`, `KDUMP`
        and the rest. Counted\nagainst the shipped base, that is **24 tables** populated
        in production that a\nvenv-generated config omits entirely. The read-only
        `TELEMETRY` gNMI port is\nabsent too, but degrades to `DEFAULT_GNMI_PORT`
        rather than vanishing.\n\nA golden test harness generating in a venv hits
        exactly this, which is how it\nwent unnoticed for months:\n\n- #2483\n\n##
        What the wrong provenance cost\n\nClassifying the base config as foreign,
        operator-editable content justified\ndropping and rebuilding owned tables
        \u2014 but a file baked into a container image\nis not an operator-editable
        surface to begin with. Meanwhile the role that file\nactually had, carrying
        shipped defaults, went unrecognised, so classifying those\ntables as owned
        silently deleted their content on every regen.\n\nThat is the default-VRF
        regression: BGP entries shipped in the base config, the\nowned-table drop
        removed them, nothing regenerated them, and the default VRF\nstopped advertising
        its routes into EVPN.\n\n- #2515\n\n## The three commits\n\n**`sonic: document
        base config as repo-shipped`** \u2014 correct the provenance\nwherever it
        is stated, and add a \"Where defaults belong\" paragraph, because the\nprovenance
        alone does not tell a reader what to do: owned tables are dropped\nbefore
        any helper runs, so a populated owned table in the base config is dead\ncontent
        and defaults the generator needs must live in the module as policy\nconstants.
        Renames `IMAGE_CONSUMED_TABLE_KEYS` to `READ_ONLY_TABLE_KEYS`, since\n\"image\"
        is the word that invited the confusion. Documentation and comments only.\n\n**`sonic:
        guard base config against owned content`** \u2014 the substantive part. A\nstatic
        test reads the **real shipped file** and fails when it populates a\ngenerator-owned
        table. It needs no fixture, so it cannot drift from production,\nand it generalises:
        it fires for the next table that gets orphaned, not just the\nfive that were.
        Verified against the pre-fix base config, where it names\n`BGP_GLOBALS`, `BGP_GLOBALS_AF`,
        `BGP_GLOBALS_ROUTE_ADVERTISE`,\n`ROUTE_REDISTRIBUTE` and `VRF`.\n\nWorth being
        explicit about why more of the existing style of test would not\nhave helped:
        every base-config fixture is built from `TOP_LEVEL_SCAFFOLD_KEYS`\nwith all
        tables empty, so dropping populated content is indistinguishable from\ndropping
        nothing. The exhaustive stale-entry sweep seeds a sentinel into every\nowned
        table and asserts it is gone, which verifies the drop works \u2014 but the
        drop\nis the mechanism at fault, and a test asserting that deletion happens
        cannot\ndetect over-deletion.\n\n`SNMP_SERVER` is the one allowlisted table:
        `_add_snmp_configuration` emits\n`SNMP_SERVER[\"SYSTEM\"]` on every run with
        hardcoded defaults regardless of\nNetBox data, so the shipped entry is redundant
        rather than load-bearing. It\ncould be dropped from the base config, which
        would let the allowlist go away;\nleft out here to keep that commit test-only.\n\n**`sonic:
        make the base config path configurable`** \u2014 add\n`SONIC_BASE_CONFIG_PATH`,
        and raise the not-found log from debug to warning.\nGenerating without a base
        config is not a routine condition to discover by\nturning debug logging on;
        it means the output is incomplete. `ERROR` would be\ntoo strong, since the
        fallback is deliberate and the run still produces usable\nconfig for the owned
        tables, which is what a from-scratch device needs.\n\n## Blast radius\n\nNothing
        changes in production or in CI. `SONIC_BASE_CONFIG_PATH` defaults to the\nprevious
        hardcoded value, so the conductor behaves exactly as before, and no\ncaller
        sets it yet \u2014 no generated config moves, and no golden file changes.
        What\nthe PR buys is that a harness or a developer *can* now point at the
        in-repo copy\nand generate what the conductor generates.\n\n## Verification\n\nFull
        unit suite passes (3083 passed, 4 pre-existing xfails). `flake8` and\n`black`
        clean.\n"
      change_url: https://github.com/osism/python-osism/pull/2561
      child_jobs: []
      commit_id: a8f25b1439dc2bc79e54cfd004c002238826919b
      event_id: 461e8db0-90d4-11f1-974e-67926eb19521
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/5dd1491c16f6409994c92c6952698f68/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/5dd1491c16f6409994c92c6952698f68/work/logs
        result_data_file: /var/lib/zuul/builds/5dd1491c16f6409994c92c6952698f68/work/results.json
        src_root: /var/lib/zuul/builds/5dd1491c16f6409994c92c6952698f68/work/src
        work_root: /var/lib/zuul/builds/5dd1491c16f6409994c92c6952698f68/work
      include_vars: []
      items:
      - branch: main
        change: '2561'
        change_message: "Correct base config provenance and make its path configurable\n\nThe
          SONiC config generator builds each device's config on top of a base\n`config_db.json`.
          That base is **this repo's** `files/sonic/config_db.json`,\nwhich the Containerfile
          installs into the conductor image at\n`/etc/sonic/config_db.json` \u2014
          nothing from a switch's own config ever reaches\nthe generator.\n\nUntil
          now that path was hardcoded, and the ownership model documented it as\n\"the
          device's image-provided base config_db.json\", which is the switch's image\nrather
          than the conductor's. Both problems have consequences.\n\n## What the hardcoded
          path costs\n\nA generator running outside the conductor image \u2014 local
          development, or a test\nharness in a venv \u2014 finds nothing at that path
          and proceeds with an **empty**\nbase. Silently, because the miss was logged
          at debug level, and because the\ngenerator's own output is unaffected: every
          table it emits is still there.\n\nWhat is missing is everything only the
          base supplies \u2014 the `DEVICE_METADATA`\nlocalhost fields the generator
          does not write itself (`type`,\n`default_config_profile`, `frr_mgmt_framework_config`,
          `intf_naming_mode`) and\n**every pass-through table**: `FEATURE`, `CLASSIFIER_TABLE`,
          the `POLICY_*` set,\nthe `ECMP_LOADSHARE_*` pair, `SWITCH`, `ZTP`, `KDUMP`
          and the rest. Counted\nagainst the shipped base, that is **24 tables** populated
          in production that a\nvenv-generated config omits entirely. The read-only
          `TELEMETRY` gNMI port is\nabsent too, but degrades to `DEFAULT_GNMI_PORT`
          rather than vanishing.\n\nA golden test harness generating in a venv hits
          exactly this, which is how it\nwent unnoticed for months:\n\n- #2483\n\n##
          What the wrong provenance cost\n\nClassifying the base config as foreign,
          operator-editable content justified\ndropping and rebuilding owned tables
          \u2014 but a file baked into a container image\nis not an operator-editable
          surface to begin with. Meanwhile the role that file\nactually had, carrying
          shipped defaults, went unrecognised, so classifying those\ntables as owned
          silently deleted their content on every regen.\n\nThat is the default-VRF
          regression: BGP entries shipped in the base config, the\nowned-table drop
          removed them, nothing regenerated them, and the default VRF\nstopped advertising
          its routes into EVPN.\n\n- #2515\n\n## The three commits\n\n**`sonic: document
          base config as repo-shipped`** \u2014 correct the provenance\nwherever it
          is stated, and add a \"Where defaults belong\" paragraph, because the\nprovenance
          alone does not tell a reader what to do: owned tables are dropped\nbefore
          any helper runs, so a populated owned table in the base config is dead\ncontent
          and defaults the generator needs must live in the module as policy\nconstants.
          Renames `IMAGE_CONSUMED_TABLE_KEYS` to `READ_ONLY_TABLE_KEYS`, since\n\"image\"
          is the word that invited the confusion. Documentation and comments only.\n\n**`sonic:
          guard base config against owned content`** \u2014 the substantive part.
          A\nstatic test reads the **real shipped file** and fails when it populates
          a\ngenerator-owned table. It needs no fixture, so it cannot drift from production,\nand
          it generalises: it fires for the next table that gets orphaned, not just
          the\nfive that were. Verified against the pre-fix base config, where it
          names\n`BGP_GLOBALS`, `BGP_GLOBALS_AF`, `BGP_GLOBALS_ROUTE_ADVERTISE`,\n`ROUTE_REDISTRIBUTE`
          and `VRF`.\n\nWorth being explicit about why more of the existing style
          of test would not\nhave helped: every base-config fixture is built from
          `TOP_LEVEL_SCAFFOLD_KEYS`\nwith all tables empty, so dropping populated
          content is indistinguishable from\ndropping nothing. The exhaustive stale-entry
          sweep seeds a sentinel into every\nowned table and asserts it is gone, which
          verifies the drop works \u2014 but the drop\nis the mechanism at fault,
          and a test asserting that deletion happens cannot\ndetect over-deletion.\n\n`SNMP_SERVER`
          is the one allowlisted table: `_add_snmp_configuration` emits\n`SNMP_SERVER[\"SYSTEM\"]`
          on every run with hardcoded defaults regardless of\nNetBox data, so the
          shipped entry is redundant rather than load-bearing. It\ncould be dropped
          from the base config, which would let the allowlist go away;\nleft out here
          to keep that commit test-only.\n\n**`sonic: make the base config path configurable`**
          \u2014 add\n`SONIC_BASE_CONFIG_PATH`, and raise the not-found log from debug
          to warning.\nGenerating without a base config is not a routine condition
          to discover by\nturning debug logging on; it means the output is incomplete.
          `ERROR` would be\ntoo strong, since the fallback is deliberate and the run
          still produces usable\nconfig for the owned tables, which is what a from-scratch
          device needs.\n\n## Blast radius\n\nNothing changes in production or in
          CI. `SONIC_BASE_CONFIG_PATH` defaults to the\nprevious hardcoded value,
          so the conductor behaves exactly as before, and no\ncaller sets it yet \u2014
          no generated config moves, and no golden file changes. What\nthe PR buys
          is that a harness or a developer *can* now point at the in-repo copy\nand
          generate what the conductor generates.\n\n## Verification\n\nFull unit suite
          passes (3083 passed, 4 pre-existing xfails). `flake8` and\n`black` clean.\n"
        change_url: https://github.com/osism/python-osism/pull/2561
        commit_id: a8f25b1439dc2bc79e54cfd004c002238826919b
        patchset: a8f25b1439dc2bc79e54cfd004c002238826919b
        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-black
      jobtags: []
      max_attempts: 3
      message: Q29ycmVjdCBiYXNlIGNvbmZpZyBwcm92ZW5hbmNlIGFuZCBtYWtlIGl0cyBwYXRoIGNvbmZpZ3VyYWJsZQoKVGhlIFNPTmlDIGNvbmZpZyBnZW5lcmF0b3IgYnVpbGRzIGVhY2ggZGV2aWNlJ3MgY29uZmlnIG9uIHRvcCBvZiBhIGJhc2UKYGNvbmZpZ19kYi5qc29uYC4gVGhhdCBiYXNlIGlzICoqdGhpcyByZXBvJ3MqKiBgZmlsZXMvc29uaWMvY29uZmlnX2RiLmpzb25gLAp3aGljaCB0aGUgQ29udGFpbmVyZmlsZSBpbnN0YWxscyBpbnRvIHRoZSBjb25kdWN0b3IgaW1hZ2UgYXQKYC9ldGMvc29uaWMvY29uZmlnX2RiLmpzb25gIOKAlCBub3RoaW5nIGZyb20gYSBzd2l0Y2gncyBvd24gY29uZmlnIGV2ZXIgcmVhY2hlcwp0aGUgZ2VuZXJhdG9yLgoKVW50aWwgbm93IHRoYXQgcGF0aCB3YXMgaGFyZGNvZGVkLCBhbmQgdGhlIG93bmVyc2hpcCBtb2RlbCBkb2N1bWVudGVkIGl0IGFzCiJ0aGUgZGV2aWNlJ3MgaW1hZ2UtcHJvdmlkZWQgYmFzZSBjb25maWdfZGIuanNvbiIsIHdoaWNoIGlzIHRoZSBzd2l0Y2gncyBpbWFnZQpyYXRoZXIgdGhhbiB0aGUgY29uZHVjdG9yJ3MuIEJvdGggcHJvYmxlbXMgaGF2ZSBjb25zZXF1ZW5jZXMuCgojIyBXaGF0IHRoZSBoYXJkY29kZWQgcGF0aCBjb3N0cwoKQSBnZW5lcmF0b3IgcnVubmluZyBvdXRzaWRlIHRoZSBjb25kdWN0b3IgaW1hZ2Ug4oCUIGxvY2FsIGRldmVsb3BtZW50LCBvciBhIHRlc3QKaGFybmVzcyBpbiBhIHZlbnYg4oCUIGZpbmRzIG5vdGhpbmcgYXQgdGhhdCBwYXRoIGFuZCBwcm9jZWVkcyB3aXRoIGFuICoqZW1wdHkqKgpiYXNlLiBTaWxlbnRseSwgYmVjYXVzZSB0aGUgbWlzcyB3YXMgbG9nZ2VkIGF0IGRlYnVnIGxldmVsLCBhbmQgYmVjYXVzZSB0aGUKZ2VuZXJhdG9yJ3Mgb3duIG91dHB1dCBpcyB1bmFmZmVjdGVkOiBldmVyeSB0YWJsZSBpdCBlbWl0cyBpcyBzdGlsbCB0aGVyZS4KCldoYXQgaXMgbWlzc2luZyBpcyBldmVyeXRoaW5nIG9ubHkgdGhlIGJhc2Ugc3VwcGxpZXMg4oCUIHRoZSBgREVWSUNFX01FVEFEQVRBYApsb2NhbGhvc3QgZmllbGRzIHRoZSBnZW5lcmF0b3IgZG9lcyBub3Qgd3JpdGUgaXRzZWxmIChgdHlwZWAsCmBkZWZhdWx0X2NvbmZpZ19wcm9maWxlYCwgYGZycl9tZ210X2ZyYW1ld29ya19jb25maWdgLCBgaW50Zl9uYW1pbmdfbW9kZWApIGFuZAoqKmV2ZXJ5IHBhc3MtdGhyb3VnaCB0YWJsZSoqOiBgRkVBVFVSRWAsIGBDTEFTU0lGSUVSX1RBQkxFYCwgdGhlIGBQT0xJQ1lfKmAgc2V0LAp0aGUgYEVDTVBfTE9BRFNIQVJFXypgIHBhaXIsIGBTV0lUQ0hgLCBgWlRQYCwgYEtEVU1QYCBhbmQgdGhlIHJlc3QuIENvdW50ZWQKYWdhaW5zdCB0aGUgc2hpcHBlZCBiYXNlLCB0aGF0IGlzICoqMjQgdGFibGVzKiogcG9wdWxhdGVkIGluIHByb2R1Y3Rpb24gdGhhdCBhCnZlbnYtZ2VuZXJhdGVkIGNvbmZpZyBvbWl0cyBlbnRpcmVseS4gVGhlIHJlYWQtb25seSBgVEVMRU1FVFJZYCBnTk1JIHBvcnQgaXMKYWJzZW50IHRvbywgYnV0IGRlZ3JhZGVzIHRvIGBERUZBVUxUX0dOTUlfUE9SVGAgcmF0aGVyIHRoYW4gdmFuaXNoaW5nLgoKQSBnb2xkZW4gdGVzdCBoYXJuZXNzIGdlbmVyYXRpbmcgaW4gYSB2ZW52IGhpdHMgZXhhY3RseSB0aGlzLCB3aGljaCBpcyBob3cgaXQKd2VudCB1bm5vdGljZWQgZm9yIG1vbnRoczoKCi0gIzI0ODMKCiMjIFdoYXQgdGhlIHdyb25nIHByb3ZlbmFuY2UgY29zdAoKQ2xhc3NpZnlpbmcgdGhlIGJhc2UgY29uZmlnIGFzIGZvcmVpZ24sIG9wZXJhdG9yLWVkaXRhYmxlIGNvbnRlbnQganVzdGlmaWVkCmRyb3BwaW5nIGFuZCByZWJ1aWxkaW5nIG93bmVkIHRhYmxlcyDigJQgYnV0IGEgZmlsZSBiYWtlZCBpbnRvIGEgY29udGFpbmVyIGltYWdlCmlzIG5vdCBhbiBvcGVyYXRvci1lZGl0YWJsZSBzdXJmYWNlIHRvIGJlZ2luIHdpdGguIE1lYW53aGlsZSB0aGUgcm9sZSB0aGF0IGZpbGUKYWN0dWFsbHkgaGFkLCBjYXJyeWluZyBzaGlwcGVkIGRlZmF1bHRzLCB3ZW50IHVucmVjb2duaXNlZCwgc28gY2xhc3NpZnlpbmcgdGhvc2UKdGFibGVzIGFzIG93bmVkIHNpbGVudGx5IGRlbGV0ZWQgdGhlaXIgY29udGVudCBvbiBldmVyeSByZWdlbi4KClRoYXQgaXMgdGhlIGRlZmF1bHQtVlJGIHJlZ3Jlc3Npb246IEJHUCBlbnRyaWVzIHNoaXBwZWQgaW4gdGhlIGJhc2UgY29uZmlnLCB0aGUKb3duZWQtdGFibGUgZHJvcCByZW1vdmVkIHRoZW0sIG5vdGhpbmcgcmVnZW5lcmF0ZWQgdGhlbSwgYW5kIHRoZSBkZWZhdWx0IFZSRgpzdG9wcGVkIGFkdmVydGlzaW5nIGl0cyByb3V0ZXMgaW50byBFVlBOLgoKLSAjMjUxNQoKIyMgVGhlIHRocmVlIGNvbW1pdHMKCioqYHNvbmljOiBkb2N1bWVudCBiYXNlIGNvbmZpZyBhcyByZXBvLXNoaXBwZWRgKiog4oCUIGNvcnJlY3QgdGhlIHByb3ZlbmFuY2UKd2hlcmV2ZXIgaXQgaXMgc3RhdGVkLCBhbmQgYWRkIGEgIldoZXJlIGRlZmF1bHRzIGJlbG9uZyIgcGFyYWdyYXBoLCBiZWNhdXNlIHRoZQpwcm92ZW5hbmNlIGFsb25lIGRvZXMgbm90IHRlbGwgYSByZWFkZXIgd2hhdCB0byBkbzogb3duZWQgdGFibGVzIGFyZSBkcm9wcGVkCmJlZm9yZSBhbnkgaGVscGVyIHJ1bnMsIHNvIGEgcG9wdWxhdGVkIG93bmVkIHRhYmxlIGluIHRoZSBiYXNlIGNvbmZpZyBpcyBkZWFkCmNvbnRlbnQgYW5kIGRlZmF1bHRzIHRoZSBnZW5lcmF0b3IgbmVlZHMgbXVzdCBsaXZlIGluIHRoZSBtb2R1bGUgYXMgcG9saWN5CmNvbnN0YW50cy4gUmVuYW1lcyBgSU1BR0VfQ09OU1VNRURfVEFCTEVfS0VZU2AgdG8gYFJFQURfT05MWV9UQUJMRV9LRVlTYCwgc2luY2UKImltYWdlIiBpcyB0aGUgd29yZCB0aGF0IGludml0ZWQgdGhlIGNvbmZ1c2lvbi4gRG9jdW1lbnRhdGlvbiBhbmQgY29tbWVudHMgb25seS4KCioqYHNvbmljOiBndWFyZCBiYXNlIGNvbmZpZyBhZ2FpbnN0IG93bmVkIGNvbnRlbnRgKiog4oCUIHRoZSBzdWJzdGFudGl2ZSBwYXJ0LiBBCnN0YXRpYyB0ZXN0IHJlYWRzIHRoZSAqKnJlYWwgc2hpcHBlZCBmaWxlKiogYW5kIGZhaWxzIHdoZW4gaXQgcG9wdWxhdGVzIGEKZ2VuZXJhdG9yLW93bmVkIHRhYmxlLiBJdCBuZWVkcyBubyBmaXh0dXJlLCBzbyBpdCBjYW5ub3QgZHJpZnQgZnJvbSBwcm9kdWN0aW9uLAphbmQgaXQgZ2VuZXJhbGlzZXM6IGl0IGZpcmVzIGZvciB0aGUgbmV4dCB0YWJsZSB0aGF0IGdldHMgb3JwaGFuZWQsIG5vdCBqdXN0IHRoZQpmaXZlIHRoYXQgd2VyZS4gVmVyaWZpZWQgYWdhaW5zdCB0aGUgcHJlLWZpeCBiYXNlIGNvbmZpZywgd2hlcmUgaXQgbmFtZXMKYEJHUF9HTE9CQUxTYCwgYEJHUF9HTE9CQUxTX0FGYCwgYEJHUF9HTE9CQUxTX1JPVVRFX0FEVkVSVElTRWAsCmBST1VURV9SRURJU1RSSUJVVEVgIGFuZCBgVlJGYC4KCldvcnRoIGJlaW5nIGV4cGxpY2l0IGFib3V0IHdoeSBtb3JlIG9mIHRoZSBleGlzdGluZyBzdHlsZSBvZiB0ZXN0IHdvdWxkIG5vdApoYXZlIGhlbHBlZDogZXZlcnkgYmFzZS1jb25maWcgZml4dHVyZSBpcyBidWlsdCBmcm9tIGBUT1BfTEVWRUxfU0NBRkZPTERfS0VZU2AKd2l0aCBhbGwgdGFibGVzIGVtcHR5LCBzbyBkcm9wcGluZyBwb3B1bGF0ZWQgY29udGVudCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tCmRyb3BwaW5nIG5vdGhpbmcuIFRoZSBleGhhdXN0aXZlIHN0YWxlLWVudHJ5IHN3ZWVwIHNlZWRzIGEgc2VudGluZWwgaW50byBldmVyeQpvd25lZCB0YWJsZSBhbmQgYXNzZXJ0cyBpdCBpcyBnb25lLCB3aGljaCB2ZXJpZmllcyB0aGUgZHJvcCB3b3JrcyDigJQgYnV0IHRoZSBkcm9wCmlzIHRoZSBtZWNoYW5pc20gYXQgZmF1bHQsIGFuZCBhIHRlc3QgYXNzZXJ0aW5nIHRoYXQgZGVsZXRpb24gaGFwcGVucyBjYW5ub3QKZGV0ZWN0IG92ZXItZGVsZXRpb24uCgpgU05NUF9TRVJWRVJgIGlzIHRoZSBvbmUgYWxsb3dsaXN0ZWQgdGFibGU6IGBfYWRkX3NubXBfY29uZmlndXJhdGlvbmAgZW1pdHMKYFNOTVBfU0VSVkVSWyJTWVNURU0iXWAgb24gZXZlcnkgcnVuIHdpdGggaGFyZGNvZGVkIGRlZmF1bHRzIHJlZ2FyZGxlc3Mgb2YKTmV0Qm94IGRhdGEsIHNvIHRoZSBzaGlwcGVkIGVudHJ5IGlzIHJlZHVuZGFudCByYXRoZXIgdGhhbiBsb2FkLWJlYXJpbmcuIEl0CmNvdWxkIGJlIGRyb3BwZWQgZnJvbSB0aGUgYmFzZSBjb25maWcsIHdoaWNoIHdvdWxkIGxldCB0aGUgYWxsb3dsaXN0IGdvIGF3YXk7CmxlZnQgb3V0IGhlcmUgdG8ga2VlcCB0aGF0IGNvbW1pdCB0ZXN0LW9ubHkuCgoqKmBzb25pYzogbWFrZSB0aGUgYmFzZSBjb25maWcgcGF0aCBjb25maWd1cmFibGVgKiog4oCUIGFkZApgU09OSUNfQkFTRV9DT05GSUdfUEFUSGAsIGFuZCByYWlzZSB0aGUgbm90LWZvdW5kIGxvZyBmcm9tIGRlYnVnIHRvIHdhcm5pbmcuCkdlbmVyYXRpbmcgd2l0aG91dCBhIGJhc2UgY29uZmlnIGlzIG5vdCBhIHJvdXRpbmUgY29uZGl0aW9uIHRvIGRpc2NvdmVyIGJ5CnR1cm5pbmcgZGVidWcgbG9nZ2luZyBvbjsgaXQgbWVhbnMgdGhlIG91dHB1dCBpcyBpbmNvbXBsZXRlLiBgRVJST1JgIHdvdWxkIGJlCnRvbyBzdHJvbmcsIHNpbmNlIHRoZSBmYWxsYmFjayBpcyBkZWxpYmVyYXRlIGFuZCB0aGUgcnVuIHN0aWxsIHByb2R1Y2VzIHVzYWJsZQpjb25maWcgZm9yIHRoZSBvd25lZCB0YWJsZXMsIHdoaWNoIGlzIHdoYXQgYSBmcm9tLXNjcmF0Y2ggZGV2aWNlIG5lZWRzLgoKIyMgQmxhc3QgcmFkaXVzCgpOb3RoaW5nIGNoYW5nZXMgaW4gcHJvZHVjdGlvbiBvciBpbiBDSS4gYFNPTklDX0JBU0VfQ09ORklHX1BBVEhgIGRlZmF1bHRzIHRvIHRoZQpwcmV2aW91cyBoYXJkY29kZWQgdmFsdWUsIHNvIHRoZSBjb25kdWN0b3IgYmVoYXZlcyBleGFjdGx5IGFzIGJlZm9yZSwgYW5kIG5vCmNhbGxlciBzZXRzIGl0IHlldCDigJQgbm8gZ2VuZXJhdGVkIGNvbmZpZyBtb3ZlcywgYW5kIG5vIGdvbGRlbiBmaWxlIGNoYW5nZXMuIFdoYXQKdGhlIFBSIGJ1eXMgaXMgdGhhdCBhIGhhcm5lc3Mgb3IgYSBkZXZlbG9wZXIgKmNhbiogbm93IHBvaW50IGF0IHRoZSBpbi1yZXBvIGNvcHkKYW5kIGdlbmVyYXRlIHdoYXQgdGhlIGNvbmR1Y3RvciBnZW5lcmF0ZXMuCgojIyBWZXJpZmljYXRpb24KCkZ1bGwgdW5pdCBzdWl0ZSBwYXNzZXMgKDMwODMgcGFzc2VkLCA0IHByZS1leGlzdGluZyB4ZmFpbHMpLiBgZmxha2U4YCBhbmQKYGJsYWNrYCBjbGVhbi4K
      patchset: a8f25b1439dc2bc79e54cfd004c002238826919b
      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/python-black/run.yml
          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: ef9eddb3c6c4a1f920a627f4e157ba3be5132c37
          name: osism/python-osism
          required: false
          short_name: python-osism
          src_dir: src/github.com/osism/python-osism
      ref: refs/pull/2561/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
