all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    ubuntu-noble:
      ansible_connection: ssh
      ansible_host: 162.253.55.221
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: public
        external_id: dce50476-7290-46ed-a718-aa882555a9ad
        host_id: 413ad91e6120ae81306de27e59dcefd40ab96f06b8665fea7030ef8f
        interface_ip: 162.253.55.221
        label: ubuntu-noble
        node_properties: {}
        private_ipv4: 162.253.55.221
        private_ipv6: null
        provider: yul1
        public_ipv4: 162.253.55.221
        public_ipv6: 2604:e100:1:0:f816:3eff:fe9b:6afa
        region: ca-ymq-1
        slot: null
      tox_environment:
        NOSE_HTML_OUT_FILE: nose_results.html
        NOSE_WITH_HTML_OUTPUT: 1
        NOSE_WITH_XUNIT: 1
      tox_envlist: unit
      zuul_node:
        az: nova
        cloud: public
        external_id: dce50476-7290-46ed-a718-aa882555a9ad
        host_id: 413ad91e6120ae81306de27e59dcefd40ab96f06b8665fea7030ef8f
        interface_ip: 162.253.55.221
        label: ubuntu-noble
        node_properties: {}
        private_ipv4: 162.253.55.221
        private_ipv6: null
        provider: yul1
        public_ipv4: 162.253.55.221
        public_ipv6: 2604:e100:1:0:f816:3eff:fe9b:6afa
        region: ca-ymq-1
        slot: null
        uuid: null
  vars:
    tox_environment:
      NOSE_HTML_OUT_FILE: nose_results.html
      NOSE_WITH_HTML_OUTPUT: 1
      NOSE_WITH_XUNIT: 1
    tox_envlist: unit
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#1>'
      - '<Job unittests explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: zuul/zuul-jobs/zuul.d/general-jobs.yaml@master#9>'
      - '<Job tox explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: zuul/zuul-jobs/zuul.d/python-jobs.yaml@master#1>'
      - '<Job magnum-cluster-api-tox explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#1>'
      - '<Job magnum-cluster-api-tox-unit explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/magnum-cluster-api/zuul.d/jobs.yaml@main#7>'
      - '<Job magnum-cluster-api-tox-unit explicit: None implied: None source: vexxhost/magnum-cluster-api/zuul.d/project.yaml@main#1>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 3dc749a486734ab29ccf9e4a8ad2420e
      build_refs:
      - branch: main
        change: '924'
        change_message: "fix: make apiServerLoadBalancer.provider optional in ClusterClass
          schema\n\n## Problem\n\nAfter upgrading to Atmosphere 5.8.0, clusters fail
          to create or update with:\n\n```\nadmission webhook \"default.cluster.cluster.x-k8s.io\"
          denied the request:\nCluster.cluster.x-k8s.io \"...\" is invalid:\nspec.topology.variables[apiServerLoadBalancer].value.provider:
          Required value\n```\n\nThis was introduced by PR #834 which made the `octavia_provider`
          label conditional \u2014 the Python code stopped always sending `provider`,
          but the Rust-generated ClusterClass schema still marked it as required.\n\n##
          Root Cause\n\nThe Rust struct `APIServerLoadBalancerConfig` defined `provider:
          String` (non-Optional), causing `schemars` to include it in the JSON schema's
          `required` array. CAPI's admission webhook validates topology variables
          against this schema and rejects any cluster that omits provider.\n\n**This
          is not a CAPO requirement.** CAPO's upstream CRD defines provider as `optional.String`
          with the `+optional` annotation. The \"Required value\" error comes entirely
          from our own ClusterClass schema.\n\n## Fix\n\nChange `provider` from `String`
          to `Option<String>` with `#[serde(default, skip_serializing_if = \"Option::is_none\")]`,
          matching CAPO's upstream type exactly. No Python code changes are needed
          \u2014 the existing code already correctly sends provider only when the
          `octavia_provider` label is set.\n\n## Comparison with #899\n\n| | **This
          PR** | **#899** |\n|---|---|---|\n| **Approach** | Fixes the schema (root
          cause) | Works around it in Python |\n| **Rust changes** | `String` \u2192
          `Option<String>` (1 field) | None |\n| **Python changes** | None needed
          | Adds `get_or_none()` K8s API call, precedence logic, hardcoded provider
          allowlist |\n| **Risk** | None \u2014 aligns with CAPO's own type | `get_or_none()`
          adds network call on every create/upgrade; allowlist silently drops valid
          providers |\n| **Impact on existing clusters** | None \u2014 omitting provider
          means CAPO keeps whatever was already set (provider is immutable in CAPO)
          | Complex precedence logic that could misfire |\n\n## Tests\n\n- **Rust**:
          Added `test_patches_without_provider` proving the field is excluded from
          the schema when not set. Updated existing tests for `Option<String>` type.
          All 118 workspace tests pass.\n- **Python**: Added `cluster_topology_variable`
          fixture and two tests verifying: no label \u2192 provider absent; label
          set \u2192 value passed through. All 15 unit tests pass.\n\nSupersedes #899"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/924
        commit_id: 91ebc70bc627dc6d219bf26c5f70607c6876e66a
        patchset: 91ebc70bc627dc6d219bf26c5f70607c6876e66a
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          name: vexxhost/magnum-cluster-api
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        src_dir: src/github.com/vexxhost/magnum-cluster-api
        topic: null
      buildset: f9fa4fb1d8464c528c3331becfe002be
      buildset_refs:
      - branch: main
        change: '924'
        change_message: "fix: make apiServerLoadBalancer.provider optional in ClusterClass
          schema\n\n## Problem\n\nAfter upgrading to Atmosphere 5.8.0, clusters fail
          to create or update with:\n\n```\nadmission webhook \"default.cluster.cluster.x-k8s.io\"
          denied the request:\nCluster.cluster.x-k8s.io \"...\" is invalid:\nspec.topology.variables[apiServerLoadBalancer].value.provider:
          Required value\n```\n\nThis was introduced by PR #834 which made the `octavia_provider`
          label conditional \u2014 the Python code stopped always sending `provider`,
          but the Rust-generated ClusterClass schema still marked it as required.\n\n##
          Root Cause\n\nThe Rust struct `APIServerLoadBalancerConfig` defined `provider:
          String` (non-Optional), causing `schemars` to include it in the JSON schema's
          `required` array. CAPI's admission webhook validates topology variables
          against this schema and rejects any cluster that omits provider.\n\n**This
          is not a CAPO requirement.** CAPO's upstream CRD defines provider as `optional.String`
          with the `+optional` annotation. The \"Required value\" error comes entirely
          from our own ClusterClass schema.\n\n## Fix\n\nChange `provider` from `String`
          to `Option<String>` with `#[serde(default, skip_serializing_if = \"Option::is_none\")]`,
          matching CAPO's upstream type exactly. No Python code changes are needed
          \u2014 the existing code already correctly sends provider only when the
          `octavia_provider` label is set.\n\n## Comparison with #899\n\n| | **This
          PR** | **#899** |\n|---|---|---|\n| **Approach** | Fixes the schema (root
          cause) | Works around it in Python |\n| **Rust changes** | `String` \u2192
          `Option<String>` (1 field) | None |\n| **Python changes** | None needed
          | Adds `get_or_none()` K8s API call, precedence logic, hardcoded provider
          allowlist |\n| **Risk** | None \u2014 aligns with CAPO's own type | `get_or_none()`
          adds network call on every create/upgrade; allowlist silently drops valid
          providers |\n| **Impact on existing clusters** | None \u2014 omitting provider
          means CAPO keeps whatever was already set (provider is immutable in CAPO)
          | Complex precedence logic that could misfire |\n\n## Tests\n\n- **Rust**:
          Added `test_patches_without_provider` proving the field is excluded from
          the schema when not set. Updated existing tests for `Option<String>` type.
          All 118 workspace tests pass.\n- **Python**: Added `cluster_topology_variable`
          fixture and two tests verifying: no label \u2192 provider absent; label
          set \u2192 value passed through. All 15 unit tests pass.\n\nSupersedes #899"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/924
        commit_id: 91ebc70bc627dc6d219bf26c5f70607c6876e66a
        patchset: 91ebc70bc627dc6d219bf26c5f70607c6876e66a
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          name: vexxhost/magnum-cluster-api
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        src_dir: src/github.com/vexxhost/magnum-cluster-api
        topic: null
      change: '924'
      change_message: "fix: make apiServerLoadBalancer.provider optional in ClusterClass
        schema\n\n## Problem\n\nAfter upgrading to Atmosphere 5.8.0, clusters fail
        to create or update with:\n\n```\nadmission webhook \"default.cluster.cluster.x-k8s.io\"
        denied the request:\nCluster.cluster.x-k8s.io \"...\" is invalid:\nspec.topology.variables[apiServerLoadBalancer].value.provider:
        Required value\n```\n\nThis was introduced by PR #834 which made the `octavia_provider`
        label conditional \u2014 the Python code stopped always sending `provider`,
        but the Rust-generated ClusterClass schema still marked it as required.\n\n##
        Root Cause\n\nThe Rust struct `APIServerLoadBalancerConfig` defined `provider:
        String` (non-Optional), causing `schemars` to include it in the JSON schema's
        `required` array. CAPI's admission webhook validates topology variables against
        this schema and rejects any cluster that omits provider.\n\n**This is not
        a CAPO requirement.** CAPO's upstream CRD defines provider as `optional.String`
        with the `+optional` annotation. The \"Required value\" error comes entirely
        from our own ClusterClass schema.\n\n## Fix\n\nChange `provider` from `String`
        to `Option<String>` with `#[serde(default, skip_serializing_if = \"Option::is_none\")]`,
        matching CAPO's upstream type exactly. No Python code changes are needed \u2014
        the existing code already correctly sends provider only when the `octavia_provider`
        label is set.\n\n## Comparison with #899\n\n| | **This PR** | **#899** |\n|---|---|---|\n|
        **Approach** | Fixes the schema (root cause) | Works around it in Python |\n|
        **Rust changes** | `String` \u2192 `Option<String>` (1 field) | None |\n|
        **Python changes** | None needed | Adds `get_or_none()` K8s API call, precedence
        logic, hardcoded provider allowlist |\n| **Risk** | None \u2014 aligns with
        CAPO's own type | `get_or_none()` adds network call on every create/upgrade;
        allowlist silently drops valid providers |\n| **Impact on existing clusters**
        | None \u2014 omitting provider means CAPO keeps whatever was already set
        (provider is immutable in CAPO) | Complex precedence logic that could misfire
        |\n\n## Tests\n\n- **Rust**: Added `test_patches_without_provider` proving
        the field is excluded from the schema when not set. Updated existing tests
        for `Option<String>` type. All 118 workspace tests pass.\n- **Python**: Added
        `cluster_topology_variable` fixture and two tests verifying: no label \u2192
        provider absent; label set \u2192 value passed through. All 15 unit tests
        pass.\n\nSupersedes #899"
      change_url: https://github.com/vexxhost/magnum-cluster-api/pull/924
      child_jobs: []
      commit_id: 91ebc70bc627dc6d219bf26c5f70607c6876e66a
      event_id: 1416dc70-2e2b-11f1-907b-2c8f784f9773
      executor:
        hostname: 0a8996d2b663
        inventory_file: /var/lib/zuul/builds/3dc749a486734ab29ccf9e4a8ad2420e/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/3dc749a486734ab29ccf9e4a8ad2420e/work/logs
        result_data_file: /var/lib/zuul/builds/3dc749a486734ab29ccf9e4a8ad2420e/work/results.json
        src_root: /var/lib/zuul/builds/3dc749a486734ab29ccf9e4a8ad2420e/work/src
        work_root: /var/lib/zuul/builds/3dc749a486734ab29ccf9e4a8ad2420e/work
      include_vars: []
      items:
      - branch: main
        change: '924'
        change_message: "fix: make apiServerLoadBalancer.provider optional in ClusterClass
          schema\n\n## Problem\n\nAfter upgrading to Atmosphere 5.8.0, clusters fail
          to create or update with:\n\n```\nadmission webhook \"default.cluster.cluster.x-k8s.io\"
          denied the request:\nCluster.cluster.x-k8s.io \"...\" is invalid:\nspec.topology.variables[apiServerLoadBalancer].value.provider:
          Required value\n```\n\nThis was introduced by PR #834 which made the `octavia_provider`
          label conditional \u2014 the Python code stopped always sending `provider`,
          but the Rust-generated ClusterClass schema still marked it as required.\n\n##
          Root Cause\n\nThe Rust struct `APIServerLoadBalancerConfig` defined `provider:
          String` (non-Optional), causing `schemars` to include it in the JSON schema's
          `required` array. CAPI's admission webhook validates topology variables
          against this schema and rejects any cluster that omits provider.\n\n**This
          is not a CAPO requirement.** CAPO's upstream CRD defines provider as `optional.String`
          with the `+optional` annotation. The \"Required value\" error comes entirely
          from our own ClusterClass schema.\n\n## Fix\n\nChange `provider` from `String`
          to `Option<String>` with `#[serde(default, skip_serializing_if = \"Option::is_none\")]`,
          matching CAPO's upstream type exactly. No Python code changes are needed
          \u2014 the existing code already correctly sends provider only when the
          `octavia_provider` label is set.\n\n## Comparison with #899\n\n| | **This
          PR** | **#899** |\n|---|---|---|\n| **Approach** | Fixes the schema (root
          cause) | Works around it in Python |\n| **Rust changes** | `String` \u2192
          `Option<String>` (1 field) | None |\n| **Python changes** | None needed
          | Adds `get_or_none()` K8s API call, precedence logic, hardcoded provider
          allowlist |\n| **Risk** | None \u2014 aligns with CAPO's own type | `get_or_none()`
          adds network call on every create/upgrade; allowlist silently drops valid
          providers |\n| **Impact on existing clusters** | None \u2014 omitting provider
          means CAPO keeps whatever was already set (provider is immutable in CAPO)
          | Complex precedence logic that could misfire |\n\n## Tests\n\n- **Rust**:
          Added `test_patches_without_provider` proving the field is excluded from
          the schema when not set. Updated existing tests for `Option<String>` type.
          All 118 workspace tests pass.\n- **Python**: Added `cluster_topology_variable`
          fixture and two tests verifying: no label \u2192 provider absent; label
          set \u2192 value passed through. All 15 unit tests pass.\n\nSupersedes #899"
        change_url: https://github.com/vexxhost/magnum-cluster-api/pull/924
        commit_id: 91ebc70bc627dc6d219bf26c5f70607c6876e66a
        patchset: 91ebc70bc627dc6d219bf26c5f70607c6876e66a
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          name: vexxhost/magnum-cluster-api
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
        topic: null
      job: magnum-cluster-api-tox-unit
      jobtags: []
      max_attempts: 3
      message: Zml4OiBtYWtlIGFwaVNlcnZlckxvYWRCYWxhbmNlci5wcm92aWRlciBvcHRpb25hbCBpbiBDbHVzdGVyQ2xhc3Mgc2NoZW1hCgojIyBQcm9ibGVtCgpBZnRlciB1cGdyYWRpbmcgdG8gQXRtb3NwaGVyZSA1LjguMCwgY2x1c3RlcnMgZmFpbCB0byBjcmVhdGUgb3IgdXBkYXRlIHdpdGg6CgpgYGAKYWRtaXNzaW9uIHdlYmhvb2sgImRlZmF1bHQuY2x1c3Rlci5jbHVzdGVyLngtazhzLmlvIiBkZW5pZWQgdGhlIHJlcXVlc3Q6CkNsdXN0ZXIuY2x1c3Rlci54LWs4cy5pbyAiLi4uIiBpcyBpbnZhbGlkOgpzcGVjLnRvcG9sb2d5LnZhcmlhYmxlc1thcGlTZXJ2ZXJMb2FkQmFsYW5jZXJdLnZhbHVlLnByb3ZpZGVyOiBSZXF1aXJlZCB2YWx1ZQpgYGAKClRoaXMgd2FzIGludHJvZHVjZWQgYnkgUFIgIzgzNCB3aGljaCBtYWRlIHRoZSBgb2N0YXZpYV9wcm92aWRlcmAgbGFiZWwgY29uZGl0aW9uYWwg4oCUIHRoZSBQeXRob24gY29kZSBzdG9wcGVkIGFsd2F5cyBzZW5kaW5nIGBwcm92aWRlcmAsIGJ1dCB0aGUgUnVzdC1nZW5lcmF0ZWQgQ2x1c3RlckNsYXNzIHNjaGVtYSBzdGlsbCBtYXJrZWQgaXQgYXMgcmVxdWlyZWQuCgojIyBSb290IENhdXNlCgpUaGUgUnVzdCBzdHJ1Y3QgYEFQSVNlcnZlckxvYWRCYWxhbmNlckNvbmZpZ2AgZGVmaW5lZCBgcHJvdmlkZXI6IFN0cmluZ2AgKG5vbi1PcHRpb25hbCksIGNhdXNpbmcgYHNjaGVtYXJzYCB0byBpbmNsdWRlIGl0IGluIHRoZSBKU09OIHNjaGVtYSdzIGByZXF1aXJlZGAgYXJyYXkuIENBUEkncyBhZG1pc3Npb24gd2ViaG9vayB2YWxpZGF0ZXMgdG9wb2xvZ3kgdmFyaWFibGVzIGFnYWluc3QgdGhpcyBzY2hlbWEgYW5kIHJlamVjdHMgYW55IGNsdXN0ZXIgdGhhdCBvbWl0cyBwcm92aWRlci4KCioqVGhpcyBpcyBub3QgYSBDQVBPIHJlcXVpcmVtZW50LioqIENBUE8ncyB1cHN0cmVhbSBDUkQgZGVmaW5lcyBwcm92aWRlciBhcyBgb3B0aW9uYWwuU3RyaW5nYCB3aXRoIHRoZSBgK29wdGlvbmFsYCBhbm5vdGF0aW9uLiBUaGUgIlJlcXVpcmVkIHZhbHVlIiBlcnJvciBjb21lcyBlbnRpcmVseSBmcm9tIG91ciBvd24gQ2x1c3RlckNsYXNzIHNjaGVtYS4KCiMjIEZpeAoKQ2hhbmdlIGBwcm92aWRlcmAgZnJvbSBgU3RyaW5nYCB0byBgT3B0aW9uPFN0cmluZz5gIHdpdGggYCNbc2VyZGUoZGVmYXVsdCwgc2tpcF9zZXJpYWxpemluZ19pZiA9ICJPcHRpb246OmlzX25vbmUiKV1gLCBtYXRjaGluZyBDQVBPJ3MgdXBzdHJlYW0gdHlwZSBleGFjdGx5LiBObyBQeXRob24gY29kZSBjaGFuZ2VzIGFyZSBuZWVkZWQg4oCUIHRoZSBleGlzdGluZyBjb2RlIGFscmVhZHkgY29ycmVjdGx5IHNlbmRzIHByb3ZpZGVyIG9ubHkgd2hlbiB0aGUgYG9jdGF2aWFfcHJvdmlkZXJgIGxhYmVsIGlzIHNldC4KCiMjIENvbXBhcmlzb24gd2l0aCAjODk5Cgp8IHwgKipUaGlzIFBSKiogfCAqKiM4OTkqKiB8CnwtLS18LS0tfC0tLXwKfCAqKkFwcHJvYWNoKiogfCBGaXhlcyB0aGUgc2NoZW1hIChyb290IGNhdXNlKSB8IFdvcmtzIGFyb3VuZCBpdCBpbiBQeXRob24gfAp8ICoqUnVzdCBjaGFuZ2VzKiogfCBgU3RyaW5nYCDihpIgYE9wdGlvbjxTdHJpbmc+YCAoMSBmaWVsZCkgfCBOb25lIHwKfCAqKlB5dGhvbiBjaGFuZ2VzKiogfCBOb25lIG5lZWRlZCB8IEFkZHMgYGdldF9vcl9ub25lKClgIEs4cyBBUEkgY2FsbCwgcHJlY2VkZW5jZSBsb2dpYywgaGFyZGNvZGVkIHByb3ZpZGVyIGFsbG93bGlzdCB8CnwgKipSaXNrKiogfCBOb25lIOKAlCBhbGlnbnMgd2l0aCBDQVBPJ3Mgb3duIHR5cGUgfCBgZ2V0X29yX25vbmUoKWAgYWRkcyBuZXR3b3JrIGNhbGwgb24gZXZlcnkgY3JlYXRlL3VwZ3JhZGU7IGFsbG93bGlzdCBzaWxlbnRseSBkcm9wcyB2YWxpZCBwcm92aWRlcnMgfAp8ICoqSW1wYWN0IG9uIGV4aXN0aW5nIGNsdXN0ZXJzKiogfCBOb25lIOKAlCBvbWl0dGluZyBwcm92aWRlciBtZWFucyBDQVBPIGtlZXBzIHdoYXRldmVyIHdhcyBhbHJlYWR5IHNldCAocHJvdmlkZXIgaXMgaW1tdXRhYmxlIGluIENBUE8pIHwgQ29tcGxleCBwcmVjZWRlbmNlIGxvZ2ljIHRoYXQgY291bGQgbWlzZmlyZSB8CgojIyBUZXN0cwoKLSAqKlJ1c3QqKjogQWRkZWQgYHRlc3RfcGF0Y2hlc193aXRob3V0X3Byb3ZpZGVyYCBwcm92aW5nIHRoZSBmaWVsZCBpcyBleGNsdWRlZCBmcm9tIHRoZSBzY2hlbWEgd2hlbiBub3Qgc2V0LiBVcGRhdGVkIGV4aXN0aW5nIHRlc3RzIGZvciBgT3B0aW9uPFN0cmluZz5gIHR5cGUuIEFsbCAxMTggd29ya3NwYWNlIHRlc3RzIHBhc3MuCi0gKipQeXRob24qKjogQWRkZWQgYGNsdXN0ZXJfdG9wb2xvZ3lfdmFyaWFibGVgIGZpeHR1cmUgYW5kIHR3byB0ZXN0cyB2ZXJpZnlpbmc6IG5vIGxhYmVsIOKGkiBwcm92aWRlciBhYnNlbnQ7IGxhYmVsIHNldCDihpIgdmFsdWUgcGFzc2VkIHRocm91Z2guIEFsbCAxNSB1bml0IHRlc3RzIHBhc3MuCgpTdXBlcnNlZGVzICM4OTk=
      patchset: 91ebc70bc627dc6d219bf26c5f70607c6876e66a
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 9052b5a7781b3346e4cffd452a54448cbff54d8b
          trusted/project_1/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: c75fe6ef19c05b98349573c971950c51bbf24758
          trusted/project_2/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: a6e68243e02ef030ce5e75f8b67630880c475f33
          untrusted/project_0/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: c75fe6ef19c05b98349573c971950c51bbf24758
          untrusted/project_1/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 9052b5a7781b3346e4cffd452a54448cbff54d8b
          untrusted/project_2/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: a6e68243e02ef030ce5e75f8b67630880c475f33
          untrusted/project_3/github.com/vexxhost/magnum-cluster-api:
            canonical_name: github.com/vexxhost/magnum-cluster-api
            checkout: main
            commit: 91ebc70bc627dc6d219bf26c5f70607c6876e66a
        playbooks:
        - path: untrusted/project_0/opendev.org/zuul/zuul-jobs/playbooks/tox/run.yaml
          roles:
          - checkout: master
            checkout_description: playbook branch
            link_name: ansible/playbook_0/role_1/zuul-jobs
            link_target: untrusted/project_0/opendev.org/zuul/zuul-jobs
            role_path: ansible/playbook_0/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_2/zuul-jobs
            link_target: untrusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/playbook_0/role_2/zuul-jobs/roles
        post_playbooks:
        - path: untrusted/project_0/opendev.org/zuul/zuul-jobs/playbooks/tox/post.yaml
          roles:
          - checkout: master
            checkout_description: playbook branch
            link_name: ansible/post_playbook_0/role_1/zuul-jobs
            link_target: untrusted/project_0/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_0/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_0/role_2/zuul-jobs
            link_target: untrusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_0/role_2/zuul-jobs/roles
        - path: untrusted/project_0/opendev.org/zuul/zuul-jobs/playbooks/unittests/post.yaml
          roles:
          - checkout: master
            checkout_description: playbook branch
            link_name: ansible/post_playbook_1/role_1/zuul-jobs
            link_target: untrusted/project_0/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_1/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_1/role_2/zuul-jobs
            link_target: untrusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_1/role_2/zuul-jobs/roles
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/post.yaml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/post_playbook_2/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_2/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_2/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_2/role_2/zuul-jobs/roles
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/post-logs.yaml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/post_playbook_3/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_3/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_3/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_3/role_2/zuul-jobs/roles
        pre_playbooks:
        - path: trusted/project_0/github.com/vexxhost/zuul-config/playbooks/base/pre.yaml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/pre_playbook_0/role_1/zuul-jobs
            link_target: trusted/project_1/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_0/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_0/role_2/zuul-jobs
            link_target: trusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_0/role_2/zuul-jobs/roles
        - path: untrusted/project_0/opendev.org/zuul/zuul-jobs/playbooks/unittests/pre.yaml
          roles:
          - checkout: master
            checkout_description: playbook branch
            link_name: ansible/pre_playbook_1/role_1/zuul-jobs
            link_target: untrusted/project_0/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_1/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_1/role_2/zuul-jobs
            link_target: untrusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_1/role_2/zuul-jobs/roles
        - path: untrusted/project_0/opendev.org/zuul/zuul-jobs/playbooks/tox/pre.yaml
          roles:
          - checkout: master
            checkout_description: playbook branch
            link_name: ansible/pre_playbook_2/role_1/zuul-jobs
            link_target: untrusted/project_0/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_2/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_2/role_2/zuul-jobs
            link_target: untrusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_2/role_2/zuul-jobs/roles
        - path: untrusted/project_3/github.com/vexxhost/magnum-cluster-api/zuul.d/playbooks/tox/pre.yml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/pre_playbook_3/role_2/zuul-jobs
            link_target: untrusted/project_0/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_3/role_2/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_3/role_3/zuul-jobs
            link_target: untrusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_3/role_3/zuul-jobs/roles
        - path: untrusted/project_3/github.com/vexxhost/magnum-cluster-api/zuul.d/playbooks/unit/pre.yml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/pre_playbook_4/role_2/zuul-jobs
            link_target: untrusted/project_0/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_4/role_2/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_4/role_3/zuul-jobs
            link_target: untrusted/project_2/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_4/role_3/zuul-jobs/roles
      post_review: false
      post_timeout: null
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/vexxhost/magnum-cluster-api
        name: vexxhost/magnum-cluster-api
        short_name: magnum-cluster-api
        src_dir: src/github.com/vexxhost/magnum-cluster-api
      projects:
        github.com/vexxhost/magnum-cluster-api:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/magnum-cluster-api
          checkout: main
          checkout_description: zuul branch
          commit: 91ebc70bc627dc6d219bf26c5f70607c6876e66a
          name: vexxhost/magnum-cluster-api
          required: false
          short_name: magnum-cluster-api
          src_dir: src/github.com/vexxhost/magnum-cluster-api
      ref: refs/pull/924/head
      resources: {}
      tenant: oss
      timeout: 1800
      topic: null
      voting: true
