all:
  children:
    cephs:
      hosts:
        instance: null
    computes:
      hosts:
        instance: null
    controllers:
      hosts:
        instance: null
    zuul_unreachable:
      hosts: {}
  hosts:
    instance:
      ansible_connection: ssh
      ansible_host: 199.19.213.231
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      atmosphere_image_prefix: harbor.atmosphere.dev/
      ceph_conf_overrides:
      - option: mon allow pool size one
        section: global
        value: true
      - option: osd crush chooseleaf type
        section: global
        value: 0
      - option: auth allow insecure global id reclaim
        section: mon
        value: false
      ceph_csi_rbd_helm_values:
        provisioner:
          replicaCount: 1
      ceph_fsid: 4837cbf8-4f90-4300-b3f6-726c9b9f89b4
      ceph_osd_devices:
      - /dev/ceph-{{ inventory_hostname_short }}-osd0/data
      - /dev/ceph-{{ inventory_hostname_short }}-osd1/data
      - /dev/ceph-{{ inventory_hostname_short }}-osd2/data
      cilium_helm_values:
        operator:
          replicas: 1
      csi_driver: local-path-provisioner
      kube_vip_address: 172.17.0.100
      kube_vip_interface: '{{ ansible_facts[''default_ipv4''].interface }}'
      kubernetes_hostname: '{{ ansible_facts[''default_ipv4''].address }}'
      molecule_scenario: csi
      nodepool:
        az: nova
        cloud: public
        external_id: b0c295d9-996c-401f-89b5-89cd991df7a7
        host_id: b3056f425dc12eb7c2b177d04ce92ce8e9d8895ce2af8682a7cd0f26
        interface_ip: 199.19.213.231
        label: ubuntu-jammy
        node_properties: {}
        private_ipv4: 199.19.213.231
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.19.213.231
        public_ipv6: 2604:e100:1:0:f816:3eff:fe2a:45e3
        region: ca-ymq-1
        slot: null
      zuul_node:
        az: nova
        cloud: public
        external_id: b0c295d9-996c-401f-89b5-89cd991df7a7
        host_id: b3056f425dc12eb7c2b177d04ce92ce8e9d8895ce2af8682a7cd0f26
        interface_ip: 199.19.213.231
        label: ubuntu-jammy
        node_properties: {}
        private_ipv4: 199.19.213.231
        private_ipv6: null
        provider: yul1
        public_ipv4: 199.19.213.231
        public_ipv6: 2604:e100:1:0:f816:3eff:fe2a:45e3
        region: ca-ymq-1
        slot: null
        uuid: null
  vars:
    atmosphere_image_prefix: harbor.atmosphere.dev/
    ceph_conf_overrides:
    - option: mon allow pool size one
      section: global
      value: true
    - option: osd crush chooseleaf type
      section: global
      value: 0
    - option: auth allow insecure global id reclaim
      section: mon
      value: false
    ceph_csi_rbd_helm_values:
      provisioner:
        replicaCount: 1
    ceph_fsid: 4837cbf8-4f90-4300-b3f6-726c9b9f89b4
    ceph_osd_devices:
    - /dev/ceph-{{ inventory_hostname_short }}-osd0/data
    - /dev/ceph-{{ inventory_hostname_short }}-osd1/data
    - /dev/ceph-{{ inventory_hostname_short }}-osd2/data
    cilium_helm_values:
      operator:
        replicas: 1
    csi_driver: local-path-provisioner
    kube_vip_address: 172.17.0.100
    kube_vip_interface: '{{ ansible_facts[''default_ipv4''].interface }}'
    kubernetes_hostname: '{{ ansible_facts[''default_ipv4''].address }}'
    molecule_scenario: csi
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-config/zuul.d/jobs.yaml@main#1>'
      - '<Job molecule explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/zuul-jobs/zuul.d/ansible-jobs.yaml@main#1>'
      - '<Job atmosphere-molecule explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/atmosphere/.zuul.yaml@main#24>'
      - '<Job atmosphere-molecule-csi explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/atmosphere/.zuul.yaml@main#60>'
      - '<Job atmosphere-molecule-csi-local-path-provisioner explicit: None implied:
        {MatchAny:{ImpliedBranchMatcher:main}} source: vexxhost/atmosphere/.zuul.yaml@main#67>'
      - '<Job atmosphere-molecule-csi-local-path-provisioner explicit: None implied:
        None source: vexxhost/atmosphere/.zuul.yaml@main#295>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 1fcd2e7f80c045a1b3006fbfb809dc64
      build_refs:
      - branch: main
        change: '3772'
        change_message: "feat(monitoring): add smartctl exporter for disk health monitoring\n\n##
          Summary\n\nAdd a new `smartctl_exporter` Ansible role that deploys the prometheus\nsmartctl_exporter
          as a DaemonSet on bare-metal nodes, plus a set of\nPrometheus alerting rules
          covering SMART/NVMe/SAS disk health. This\nenables early-warning monitoring
          of disk wearout, sector errors, NVMe\ncontroller warnings, SAS uncorrected
          errors, and overall SMART status.\n\n## Components\n\n- **`roles/smartctl_exporter/`**:
          DaemonSet deployment (privileged,\n  scheduled onto bare-metal nodes only).\n-
          **ServiceMonitor**: registered in `kube_prometheus_stack` vars; the\n  scrape
          config relabels `__meta_kubernetes_pod_node_name` to\n  `instance` so every
          series is keyed by node, and drops the\n  `pod`/`namespace`/`container`/`node`/`service`
          labels for\n  cardinality.\n- **Alert rules** in `roles/kube_prometheus_stack/files/jsonnet/smartctl.libsonnet`\n
          \ (14 alerts, all with `runbook_url` and severity-aligned `for` durations):\n\n
          \ Health / firmware-declared failure:\n  - `SmartctlDiskUnhealthy` (P2)
          \u2014 `smartctl_device_smart_status == 0`\n  - `SmartctlDiskCriticalWarning`
          (P2) \u2014 NVMe critical_warning bitmap non-zero\n  - `SmartctlDiskAvailableSpareLow`
          (P2) \u2014 NVMe available_spare \u2264 threshold\n  - `SmartctlDiskAttributeFailing`
          (P2) \u2014 any SATA attribute's normalized\n    `value` \u2264 per-drive
          `thresh` reported by firmware (covers any\n    vendor-specific prefailure
          indicator without magic IDs)\n\n  Wear and media errors:\n  - `SmartctlDiskWearoutCritical`
          (P3) \u2014 NVMe `percentage_used > 90`\n  - `SmartctlDiskWearoutWarning`
          (P4) \u2014 NVMe `percentage_used > 75`\n  - `SmartctlDiskMediaErrorsGrowing`
          (P3) \u2014 NVMe `media_errors` increasing\n  - `SmartctlDiskScsiUncorrectedErrors`
          (P3) \u2014 SAS read/write uncorrected\n    error counters increasing\n
          \ - `SmartctlDiskScsiGrownDefectsGrowing` (P4) \u2014 SAS grown defect list\n
          \   increasing\n\n  SATA sector errors:\n  - `SmartctlDiskPendingSectors`
          (P3) \u2014 `Current_Pending_Sector` raw > 0\n  - `SmartctlDiskUncorrectableSectors`
          (P3) \u2014 `Offline_Uncorrectable` raw > 0\n  - `SmartctlDiskReallocatedSectorsGrowing`
          (P4) \u2014 rate-based, fires only\n    on growth (not on a stable historical
          count)\n\n  Operational:\n  - `SmartctlDiskTemperatureHigh` (P4) \u2014
          `temperature > 60\xB0C`\n  - `SmartctlDiskSelfTestFailed` (P4) \u2014 self-test
          error log non-zero\n\n  Note: there is no per-exporter \"down\" alert. The
          default\n  kube-prometheus-stack `TargetDown` rule covers scrape-target
          outages\n  uniformly across all exporters.\n\n- **Alertmanager inhibitions**
          (`roles/kube_prometheus_stack/vars/main.yml`):\n  - `SmartctlDiskUnhealthy`
          suppresses every other smartctl alert on the\n    same `(instance, device)`.\n
          \ - `SmartctlDiskCriticalWarning` and `SmartctlDiskAvailableSpareLow`\n
          \   suppress the lower-severity NVMe-specific alerts on the same disk.\n
          \ - `SmartctlDiskWearoutCritical` suppresses\n    `SmartctlDiskWearoutWarning`.\n\n-
          **Documentation**: per-alert runbook entries added under\n  `doc/source/admin/monitoring.rst`.\n\n-
          **Tests**: positive and negative `promtool` test cases for every\n  alert
          in `roles/kube_prometheus_stack/files/jsonnet/tests.yml`.\n\n- Wired into
          `playbooks/monitoring.yml`.\n"
        change_url: https://github.com/vexxhost/atmosphere/pull/3772
        commit_id: c9fcb499a3021fb478a991ecbc860e03a4abfc88
        patchset: c9fcb499a3021fb478a991ecbc860e03a4abfc88
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere
          name: vexxhost/atmosphere
          short_name: atmosphere
          src_dir: src/github.com/vexxhost/atmosphere
        src_dir: src/github.com/vexxhost/atmosphere
        topic: null
      buildset: a1d53116d4804286a9a981ae3900d91e
      buildset_refs:
      - branch: main
        change: '3772'
        change_message: "feat(monitoring): add smartctl exporter for disk health monitoring\n\n##
          Summary\n\nAdd a new `smartctl_exporter` Ansible role that deploys the prometheus\nsmartctl_exporter
          as a DaemonSet on bare-metal nodes, plus a set of\nPrometheus alerting rules
          covering SMART/NVMe/SAS disk health. This\nenables early-warning monitoring
          of disk wearout, sector errors, NVMe\ncontroller warnings, SAS uncorrected
          errors, and overall SMART status.\n\n## Components\n\n- **`roles/smartctl_exporter/`**:
          DaemonSet deployment (privileged,\n  scheduled onto bare-metal nodes only).\n-
          **ServiceMonitor**: registered in `kube_prometheus_stack` vars; the\n  scrape
          config relabels `__meta_kubernetes_pod_node_name` to\n  `instance` so every
          series is keyed by node, and drops the\n  `pod`/`namespace`/`container`/`node`/`service`
          labels for\n  cardinality.\n- **Alert rules** in `roles/kube_prometheus_stack/files/jsonnet/smartctl.libsonnet`\n
          \ (14 alerts, all with `runbook_url` and severity-aligned `for` durations):\n\n
          \ Health / firmware-declared failure:\n  - `SmartctlDiskUnhealthy` (P2)
          \u2014 `smartctl_device_smart_status == 0`\n  - `SmartctlDiskCriticalWarning`
          (P2) \u2014 NVMe critical_warning bitmap non-zero\n  - `SmartctlDiskAvailableSpareLow`
          (P2) \u2014 NVMe available_spare \u2264 threshold\n  - `SmartctlDiskAttributeFailing`
          (P2) \u2014 any SATA attribute's normalized\n    `value` \u2264 per-drive
          `thresh` reported by firmware (covers any\n    vendor-specific prefailure
          indicator without magic IDs)\n\n  Wear and media errors:\n  - `SmartctlDiskWearoutCritical`
          (P3) \u2014 NVMe `percentage_used > 90`\n  - `SmartctlDiskWearoutWarning`
          (P4) \u2014 NVMe `percentage_used > 75`\n  - `SmartctlDiskMediaErrorsGrowing`
          (P3) \u2014 NVMe `media_errors` increasing\n  - `SmartctlDiskScsiUncorrectedErrors`
          (P3) \u2014 SAS read/write uncorrected\n    error counters increasing\n
          \ - `SmartctlDiskScsiGrownDefectsGrowing` (P4) \u2014 SAS grown defect list\n
          \   increasing\n\n  SATA sector errors:\n  - `SmartctlDiskPendingSectors`
          (P3) \u2014 `Current_Pending_Sector` raw > 0\n  - `SmartctlDiskUncorrectableSectors`
          (P3) \u2014 `Offline_Uncorrectable` raw > 0\n  - `SmartctlDiskReallocatedSectorsGrowing`
          (P4) \u2014 rate-based, fires only\n    on growth (not on a stable historical
          count)\n\n  Operational:\n  - `SmartctlDiskTemperatureHigh` (P4) \u2014
          `temperature > 60\xB0C`\n  - `SmartctlDiskSelfTestFailed` (P4) \u2014 self-test
          error log non-zero\n\n  Note: there is no per-exporter \"down\" alert. The
          default\n  kube-prometheus-stack `TargetDown` rule covers scrape-target
          outages\n  uniformly across all exporters.\n\n- **Alertmanager inhibitions**
          (`roles/kube_prometheus_stack/vars/main.yml`):\n  - `SmartctlDiskUnhealthy`
          suppresses every other smartctl alert on the\n    same `(instance, device)`.\n
          \ - `SmartctlDiskCriticalWarning` and `SmartctlDiskAvailableSpareLow`\n
          \   suppress the lower-severity NVMe-specific alerts on the same disk.\n
          \ - `SmartctlDiskWearoutCritical` suppresses\n    `SmartctlDiskWearoutWarning`.\n\n-
          **Documentation**: per-alert runbook entries added under\n  `doc/source/admin/monitoring.rst`.\n\n-
          **Tests**: positive and negative `promtool` test cases for every\n  alert
          in `roles/kube_prometheus_stack/files/jsonnet/tests.yml`.\n\n- Wired into
          `playbooks/monitoring.yml`.\n"
        change_url: https://github.com/vexxhost/atmosphere/pull/3772
        commit_id: c9fcb499a3021fb478a991ecbc860e03a4abfc88
        patchset: c9fcb499a3021fb478a991ecbc860e03a4abfc88
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere
          name: vexxhost/atmosphere
          short_name: atmosphere
          src_dir: src/github.com/vexxhost/atmosphere
        src_dir: src/github.com/vexxhost/atmosphere
        topic: null
      change: '3772'
      change_message: "feat(monitoring): add smartctl exporter for disk health monitoring\n\n##
        Summary\n\nAdd a new `smartctl_exporter` Ansible role that deploys the prometheus\nsmartctl_exporter
        as a DaemonSet on bare-metal nodes, plus a set of\nPrometheus alerting rules
        covering SMART/NVMe/SAS disk health. This\nenables early-warning monitoring
        of disk wearout, sector errors, NVMe\ncontroller warnings, SAS uncorrected
        errors, and overall SMART status.\n\n## Components\n\n- **`roles/smartctl_exporter/`**:
        DaemonSet deployment (privileged,\n  scheduled onto bare-metal nodes only).\n-
        **ServiceMonitor**: registered in `kube_prometheus_stack` vars; the\n  scrape
        config relabels `__meta_kubernetes_pod_node_name` to\n  `instance` so every
        series is keyed by node, and drops the\n  `pod`/`namespace`/`container`/`node`/`service`
        labels for\n  cardinality.\n- **Alert rules** in `roles/kube_prometheus_stack/files/jsonnet/smartctl.libsonnet`\n
        \ (14 alerts, all with `runbook_url` and severity-aligned `for` durations):\n\n
        \ Health / firmware-declared failure:\n  - `SmartctlDiskUnhealthy` (P2) \u2014
        `smartctl_device_smart_status == 0`\n  - `SmartctlDiskCriticalWarning` (P2)
        \u2014 NVMe critical_warning bitmap non-zero\n  - `SmartctlDiskAvailableSpareLow`
        (P2) \u2014 NVMe available_spare \u2264 threshold\n  - `SmartctlDiskAttributeFailing`
        (P2) \u2014 any SATA attribute's normalized\n    `value` \u2264 per-drive
        `thresh` reported by firmware (covers any\n    vendor-specific prefailure
        indicator without magic IDs)\n\n  Wear and media errors:\n  - `SmartctlDiskWearoutCritical`
        (P3) \u2014 NVMe `percentage_used > 90`\n  - `SmartctlDiskWearoutWarning`
        (P4) \u2014 NVMe `percentage_used > 75`\n  - `SmartctlDiskMediaErrorsGrowing`
        (P3) \u2014 NVMe `media_errors` increasing\n  - `SmartctlDiskScsiUncorrectedErrors`
        (P3) \u2014 SAS read/write uncorrected\n    error counters increasing\n  -
        `SmartctlDiskScsiGrownDefectsGrowing` (P4) \u2014 SAS grown defect list\n
        \   increasing\n\n  SATA sector errors:\n  - `SmartctlDiskPendingSectors`
        (P3) \u2014 `Current_Pending_Sector` raw > 0\n  - `SmartctlDiskUncorrectableSectors`
        (P3) \u2014 `Offline_Uncorrectable` raw > 0\n  - `SmartctlDiskReallocatedSectorsGrowing`
        (P4) \u2014 rate-based, fires only\n    on growth (not on a stable historical
        count)\n\n  Operational:\n  - `SmartctlDiskTemperatureHigh` (P4) \u2014 `temperature
        > 60\xB0C`\n  - `SmartctlDiskSelfTestFailed` (P4) \u2014 self-test error log
        non-zero\n\n  Note: there is no per-exporter \"down\" alert. The default\n
        \ kube-prometheus-stack `TargetDown` rule covers scrape-target outages\n  uniformly
        across all exporters.\n\n- **Alertmanager inhibitions** (`roles/kube_prometheus_stack/vars/main.yml`):\n
        \ - `SmartctlDiskUnhealthy` suppresses every other smartctl alert on the\n
        \   same `(instance, device)`.\n  - `SmartctlDiskCriticalWarning` and `SmartctlDiskAvailableSpareLow`\n
        \   suppress the lower-severity NVMe-specific alerts on the same disk.\n  -
        `SmartctlDiskWearoutCritical` suppresses\n    `SmartctlDiskWearoutWarning`.\n\n-
        **Documentation**: per-alert runbook entries added under\n  `doc/source/admin/monitoring.rst`.\n\n-
        **Tests**: positive and negative `promtool` test cases for every\n  alert
        in `roles/kube_prometheus_stack/files/jsonnet/tests.yml`.\n\n- Wired into
        `playbooks/monitoring.yml`.\n"
      change_url: https://github.com/vexxhost/atmosphere/pull/3772
      child_jobs: []
      commit_id: c9fcb499a3021fb478a991ecbc860e03a4abfc88
      event_id: ff47c750-4761-11f1-9194-37cd055b08a2
      executor:
        hostname: 2d72f0692154
        inventory_file: /var/lib/zuul/builds/1fcd2e7f80c045a1b3006fbfb809dc64/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/1fcd2e7f80c045a1b3006fbfb809dc64/work/logs
        result_data_file: /var/lib/zuul/builds/1fcd2e7f80c045a1b3006fbfb809dc64/work/results.json
        src_root: /var/lib/zuul/builds/1fcd2e7f80c045a1b3006fbfb809dc64/work/src
        work_root: /var/lib/zuul/builds/1fcd2e7f80c045a1b3006fbfb809dc64/work
      include_vars: []
      items:
      - branch: main
        change: '3772'
        change_message: "feat(monitoring): add smartctl exporter for disk health monitoring\n\n##
          Summary\n\nAdd a new `smartctl_exporter` Ansible role that deploys the prometheus\nsmartctl_exporter
          as a DaemonSet on bare-metal nodes, plus a set of\nPrometheus alerting rules
          covering SMART/NVMe/SAS disk health. This\nenables early-warning monitoring
          of disk wearout, sector errors, NVMe\ncontroller warnings, SAS uncorrected
          errors, and overall SMART status.\n\n## Components\n\n- **`roles/smartctl_exporter/`**:
          DaemonSet deployment (privileged,\n  scheduled onto bare-metal nodes only).\n-
          **ServiceMonitor**: registered in `kube_prometheus_stack` vars; the\n  scrape
          config relabels `__meta_kubernetes_pod_node_name` to\n  `instance` so every
          series is keyed by node, and drops the\n  `pod`/`namespace`/`container`/`node`/`service`
          labels for\n  cardinality.\n- **Alert rules** in `roles/kube_prometheus_stack/files/jsonnet/smartctl.libsonnet`\n
          \ (14 alerts, all with `runbook_url` and severity-aligned `for` durations):\n\n
          \ Health / firmware-declared failure:\n  - `SmartctlDiskUnhealthy` (P2)
          \u2014 `smartctl_device_smart_status == 0`\n  - `SmartctlDiskCriticalWarning`
          (P2) \u2014 NVMe critical_warning bitmap non-zero\n  - `SmartctlDiskAvailableSpareLow`
          (P2) \u2014 NVMe available_spare \u2264 threshold\n  - `SmartctlDiskAttributeFailing`
          (P2) \u2014 any SATA attribute's normalized\n    `value` \u2264 per-drive
          `thresh` reported by firmware (covers any\n    vendor-specific prefailure
          indicator without magic IDs)\n\n  Wear and media errors:\n  - `SmartctlDiskWearoutCritical`
          (P3) \u2014 NVMe `percentage_used > 90`\n  - `SmartctlDiskWearoutWarning`
          (P4) \u2014 NVMe `percentage_used > 75`\n  - `SmartctlDiskMediaErrorsGrowing`
          (P3) \u2014 NVMe `media_errors` increasing\n  - `SmartctlDiskScsiUncorrectedErrors`
          (P3) \u2014 SAS read/write uncorrected\n    error counters increasing\n
          \ - `SmartctlDiskScsiGrownDefectsGrowing` (P4) \u2014 SAS grown defect list\n
          \   increasing\n\n  SATA sector errors:\n  - `SmartctlDiskPendingSectors`
          (P3) \u2014 `Current_Pending_Sector` raw > 0\n  - `SmartctlDiskUncorrectableSectors`
          (P3) \u2014 `Offline_Uncorrectable` raw > 0\n  - `SmartctlDiskReallocatedSectorsGrowing`
          (P4) \u2014 rate-based, fires only\n    on growth (not on a stable historical
          count)\n\n  Operational:\n  - `SmartctlDiskTemperatureHigh` (P4) \u2014
          `temperature > 60\xB0C`\n  - `SmartctlDiskSelfTestFailed` (P4) \u2014 self-test
          error log non-zero\n\n  Note: there is no per-exporter \"down\" alert. The
          default\n  kube-prometheus-stack `TargetDown` rule covers scrape-target
          outages\n  uniformly across all exporters.\n\n- **Alertmanager inhibitions**
          (`roles/kube_prometheus_stack/vars/main.yml`):\n  - `SmartctlDiskUnhealthy`
          suppresses every other smartctl alert on the\n    same `(instance, device)`.\n
          \ - `SmartctlDiskCriticalWarning` and `SmartctlDiskAvailableSpareLow`\n
          \   suppress the lower-severity NVMe-specific alerts on the same disk.\n
          \ - `SmartctlDiskWearoutCritical` suppresses\n    `SmartctlDiskWearoutWarning`.\n\n-
          **Documentation**: per-alert runbook entries added under\n  `doc/source/admin/monitoring.rst`.\n\n-
          **Tests**: positive and negative `promtool` test cases for every\n  alert
          in `roles/kube_prometheus_stack/files/jsonnet/tests.yml`.\n\n- Wired into
          `playbooks/monitoring.yml`.\n"
        change_url: https://github.com/vexxhost/atmosphere/pull/3772
        commit_id: c9fcb499a3021fb478a991ecbc860e03a4abfc88
        patchset: c9fcb499a3021fb478a991ecbc860e03a4abfc88
        project:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere
          name: vexxhost/atmosphere
          short_name: atmosphere
          src_dir: src/github.com/vexxhost/atmosphere
        topic: null
      job: atmosphere-molecule-csi-local-path-provisioner
      jobtags: []
      max_attempts: 3
      message: ZmVhdChtb25pdG9yaW5nKTogYWRkIHNtYXJ0Y3RsIGV4cG9ydGVyIGZvciBkaXNrIGhlYWx0aCBtb25pdG9yaW5nCgojIyBTdW1tYXJ5CgpBZGQgYSBuZXcgYHNtYXJ0Y3RsX2V4cG9ydGVyYCBBbnNpYmxlIHJvbGUgdGhhdCBkZXBsb3lzIHRoZSBwcm9tZXRoZXVzCnNtYXJ0Y3RsX2V4cG9ydGVyIGFzIGEgRGFlbW9uU2V0IG9uIGJhcmUtbWV0YWwgbm9kZXMsIHBsdXMgYSBzZXQgb2YKUHJvbWV0aGV1cyBhbGVydGluZyBydWxlcyBjb3ZlcmluZyBTTUFSVC9OVk1lL1NBUyBkaXNrIGhlYWx0aC4gVGhpcwplbmFibGVzIGVhcmx5LXdhcm5pbmcgbW9uaXRvcmluZyBvZiBkaXNrIHdlYXJvdXQsIHNlY3RvciBlcnJvcnMsIE5WTWUKY29udHJvbGxlciB3YXJuaW5ncywgU0FTIHVuY29ycmVjdGVkIGVycm9ycywgYW5kIG92ZXJhbGwgU01BUlQgc3RhdHVzLgoKIyMgQ29tcG9uZW50cwoKLSAqKmByb2xlcy9zbWFydGN0bF9leHBvcnRlci9gKio6IERhZW1vblNldCBkZXBsb3ltZW50IChwcml2aWxlZ2VkLAogIHNjaGVkdWxlZCBvbnRvIGJhcmUtbWV0YWwgbm9kZXMgb25seSkuCi0gKipTZXJ2aWNlTW9uaXRvcioqOiByZWdpc3RlcmVkIGluIGBrdWJlX3Byb21ldGhldXNfc3RhY2tgIHZhcnM7IHRoZQogIHNjcmFwZSBjb25maWcgcmVsYWJlbHMgYF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9ub2RlX25hbWVgIHRvCiAgYGluc3RhbmNlYCBzbyBldmVyeSBzZXJpZXMgaXMga2V5ZWQgYnkgbm9kZSwgYW5kIGRyb3BzIHRoZQogIGBwb2RgL2BuYW1lc3BhY2VgL2Bjb250YWluZXJgL2Bub2RlYC9gc2VydmljZWAgbGFiZWxzIGZvcgogIGNhcmRpbmFsaXR5LgotICoqQWxlcnQgcnVsZXMqKiBpbiBgcm9sZXMva3ViZV9wcm9tZXRoZXVzX3N0YWNrL2ZpbGVzL2pzb25uZXQvc21hcnRjdGwubGlic29ubmV0YAogICgxNCBhbGVydHMsIGFsbCB3aXRoIGBydW5ib29rX3VybGAgYW5kIHNldmVyaXR5LWFsaWduZWQgYGZvcmAgZHVyYXRpb25zKToKCiAgSGVhbHRoIC8gZmlybXdhcmUtZGVjbGFyZWQgZmFpbHVyZToKICAtIGBTbWFydGN0bERpc2tVbmhlYWx0aHlgIChQMikg4oCUIGBzbWFydGN0bF9kZXZpY2Vfc21hcnRfc3RhdHVzID09IDBgCiAgLSBgU21hcnRjdGxEaXNrQ3JpdGljYWxXYXJuaW5nYCAoUDIpIOKAlCBOVk1lIGNyaXRpY2FsX3dhcm5pbmcgYml0bWFwIG5vbi16ZXJvCiAgLSBgU21hcnRjdGxEaXNrQXZhaWxhYmxlU3BhcmVMb3dgIChQMikg4oCUIE5WTWUgYXZhaWxhYmxlX3NwYXJlIOKJpCB0aHJlc2hvbGQKICAtIGBTbWFydGN0bERpc2tBdHRyaWJ1dGVGYWlsaW5nYCAoUDIpIOKAlCBhbnkgU0FUQSBhdHRyaWJ1dGUncyBub3JtYWxpemVkCiAgICBgdmFsdWVgIOKJpCBwZXItZHJpdmUgYHRocmVzaGAgcmVwb3J0ZWQgYnkgZmlybXdhcmUgKGNvdmVycyBhbnkKICAgIHZlbmRvci1zcGVjaWZpYyBwcmVmYWlsdXJlIGluZGljYXRvciB3aXRob3V0IG1hZ2ljIElEcykKCiAgV2VhciBhbmQgbWVkaWEgZXJyb3JzOgogIC0gYFNtYXJ0Y3RsRGlza1dlYXJvdXRDcml0aWNhbGAgKFAzKSDigJQgTlZNZSBgcGVyY2VudGFnZV91c2VkID4gOTBgCiAgLSBgU21hcnRjdGxEaXNrV2Vhcm91dFdhcm5pbmdgIChQNCkg4oCUIE5WTWUgYHBlcmNlbnRhZ2VfdXNlZCA+IDc1YAogIC0gYFNtYXJ0Y3RsRGlza01lZGlhRXJyb3JzR3Jvd2luZ2AgKFAzKSDigJQgTlZNZSBgbWVkaWFfZXJyb3JzYCBpbmNyZWFzaW5nCiAgLSBgU21hcnRjdGxEaXNrU2NzaVVuY29ycmVjdGVkRXJyb3JzYCAoUDMpIOKAlCBTQVMgcmVhZC93cml0ZSB1bmNvcnJlY3RlZAogICAgZXJyb3IgY291bnRlcnMgaW5jcmVhc2luZwogIC0gYFNtYXJ0Y3RsRGlza1Njc2lHcm93bkRlZmVjdHNHcm93aW5nYCAoUDQpIOKAlCBTQVMgZ3Jvd24gZGVmZWN0IGxpc3QKICAgIGluY3JlYXNpbmcKCiAgU0FUQSBzZWN0b3IgZXJyb3JzOgogIC0gYFNtYXJ0Y3RsRGlza1BlbmRpbmdTZWN0b3JzYCAoUDMpIOKAlCBgQ3VycmVudF9QZW5kaW5nX1NlY3RvcmAgcmF3ID4gMAogIC0gYFNtYXJ0Y3RsRGlza1VuY29ycmVjdGFibGVTZWN0b3JzYCAoUDMpIOKAlCBgT2ZmbGluZV9VbmNvcnJlY3RhYmxlYCByYXcgPiAwCiAgLSBgU21hcnRjdGxEaXNrUmVhbGxvY2F0ZWRTZWN0b3JzR3Jvd2luZ2AgKFA0KSDigJQgcmF0ZS1iYXNlZCwgZmlyZXMgb25seQogICAgb24gZ3Jvd3RoIChub3Qgb24gYSBzdGFibGUgaGlzdG9yaWNhbCBjb3VudCkKCiAgT3BlcmF0aW9uYWw6CiAgLSBgU21hcnRjdGxEaXNrVGVtcGVyYXR1cmVIaWdoYCAoUDQpIOKAlCBgdGVtcGVyYXR1cmUgPiA2MMKwQ2AKICAtIGBTbWFydGN0bERpc2tTZWxmVGVzdEZhaWxlZGAgKFA0KSDigJQgc2VsZi10ZXN0IGVycm9yIGxvZyBub24temVybwoKICBOb3RlOiB0aGVyZSBpcyBubyBwZXItZXhwb3J0ZXIgImRvd24iIGFsZXJ0LiBUaGUgZGVmYXVsdAogIGt1YmUtcHJvbWV0aGV1cy1zdGFjayBgVGFyZ2V0RG93bmAgcnVsZSBjb3ZlcnMgc2NyYXBlLXRhcmdldCBvdXRhZ2VzCiAgdW5pZm9ybWx5IGFjcm9zcyBhbGwgZXhwb3J0ZXJzLgoKLSAqKkFsZXJ0bWFuYWdlciBpbmhpYml0aW9ucyoqIChgcm9sZXMva3ViZV9wcm9tZXRoZXVzX3N0YWNrL3ZhcnMvbWFpbi55bWxgKToKICAtIGBTbWFydGN0bERpc2tVbmhlYWx0aHlgIHN1cHByZXNzZXMgZXZlcnkgb3RoZXIgc21hcnRjdGwgYWxlcnQgb24gdGhlCiAgICBzYW1lIGAoaW5zdGFuY2UsIGRldmljZSlgLgogIC0gYFNtYXJ0Y3RsRGlza0NyaXRpY2FsV2FybmluZ2AgYW5kIGBTbWFydGN0bERpc2tBdmFpbGFibGVTcGFyZUxvd2AKICAgIHN1cHByZXNzIHRoZSBsb3dlci1zZXZlcml0eSBOVk1lLXNwZWNpZmljIGFsZXJ0cyBvbiB0aGUgc2FtZSBkaXNrLgogIC0gYFNtYXJ0Y3RsRGlza1dlYXJvdXRDcml0aWNhbGAgc3VwcHJlc3NlcwogICAgYFNtYXJ0Y3RsRGlza1dlYXJvdXRXYXJuaW5nYC4KCi0gKipEb2N1bWVudGF0aW9uKio6IHBlci1hbGVydCBydW5ib29rIGVudHJpZXMgYWRkZWQgdW5kZXIKICBgZG9jL3NvdXJjZS9hZG1pbi9tb25pdG9yaW5nLnJzdGAuCgotICoqVGVzdHMqKjogcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGBwcm9tdG9vbGAgdGVzdCBjYXNlcyBmb3IgZXZlcnkKICBhbGVydCBpbiBgcm9sZXMva3ViZV9wcm9tZXRoZXVzX3N0YWNrL2ZpbGVzL2pzb25uZXQvdGVzdHMueW1sYC4KCi0gV2lyZWQgaW50byBgcGxheWJvb2tzL21vbml0b3JpbmcueW1sYC4K
      patchset: c9fcb499a3021fb478a991ecbc860e03a4abfc88
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 298983cd1253e6833abdb49d87d912527e0e6597
          trusted/project_1/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: 9f5c1d680d573485f0ccdb18d2184d4f1d446419
          trusted/project_2/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: a6e68243e02ef030ce5e75f8b67630880c475f33
          untrusted/project_0/github.com/vexxhost/zuul-jobs:
            canonical_name: github.com/vexxhost/zuul-jobs
            checkout: main
            commit: a6e68243e02ef030ce5e75f8b67630880c475f33
          untrusted/project_1/github.com/vexxhost/zuul-config:
            canonical_name: github.com/vexxhost/zuul-config
            checkout: main
            commit: 298983cd1253e6833abdb49d87d912527e0e6597
          untrusted/project_2/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: 9f5c1d680d573485f0ccdb18d2184d4f1d446419
          untrusted/project_3/github.com/vexxhost/atmosphere:
            canonical_name: github.com/vexxhost/atmosphere
            checkout: main
            commit: c9fcb499a3021fb478a991ecbc860e03a4abfc88
          untrusted/project_4/opendev.org/openstack/openstack-helm:
            canonical_name: opendev.org/openstack/openstack-helm
            checkout: master
            commit: 3b4100171145e303162564dd02fce8ccacfdbffa
        playbooks:
        - path: untrusted/project_0/github.com/vexxhost/zuul-jobs/playbooks/molecule/run.yaml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/playbook_0/role_1/zuul-jobs
            link_target: untrusted/project_2/opendev.org/zuul/zuul-jobs
            role_path: ansible/playbook_0/role_1/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/vexxhost/zuul-jobs
            role_path: ansible/playbook_0/role_2/zuul-jobs/roles
        post_playbooks:
        - path: untrusted/project_3/github.com/vexxhost/atmosphere/test-playbooks/molecule/post.yml
          roles:
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/post_playbook_0/role_0/atmosphere
            link_target: untrusted/project_3/github.com/vexxhost/atmosphere
            role_path: ansible/post_playbook_0/role_0/atmosphere/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/post_playbook_0/role_1/openstack-helm
            link_target: untrusted/project_4/opendev.org/openstack/openstack-helm
            role_path: ansible/post_playbook_0/role_1/openstack-helm/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/post_playbook_0/role_3/zuul-jobs
            link_target: untrusted/project_2/opendev.org/zuul/zuul-jobs
            role_path: ansible/post_playbook_0/role_3/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/post_playbook_0/role_4/zuul-jobs
            link_target: untrusted/project_0/github.com/vexxhost/zuul-jobs
            role_path: ansible/post_playbook_0/role_4/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_1/role_1/zuul-jobs
            link_target: trusted/project_1/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: trusted/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-logs.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
        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/github.com/vexxhost/zuul-jobs/playbooks/molecule/pre.yaml
          roles:
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/pre_playbook_1/role_1/zuul-jobs
            link_target: untrusted/project_2/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_1/role_1/zuul-jobs/roles
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/pre_playbook_1/role_2/zuul-jobs
            link_target: untrusted/project_0/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_1/role_2/zuul-jobs/roles
        - path: untrusted/project_3/github.com/vexxhost/atmosphere/test-playbooks/molecule/pre.yml
          roles:
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/pre_playbook_2/role_0/atmosphere
            link_target: untrusted/project_3/github.com/vexxhost/atmosphere
            role_path: ansible/pre_playbook_2/role_0/atmosphere/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/pre_playbook_2/role_1/openstack-helm
            link_target: untrusted/project_4/opendev.org/openstack/openstack-helm
            role_path: ansible/pre_playbook_2/role_1/openstack-helm/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/pre_playbook_2/role_3/zuul-jobs
            link_target: untrusted/project_2/opendev.org/zuul/zuul-jobs
            role_path: ansible/pre_playbook_2/role_3/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/pre_playbook_2/role_4/zuul-jobs
            link_target: untrusted/project_0/github.com/vexxhost/zuul-jobs
            role_path: ansible/pre_playbook_2/role_4/zuul-jobs/roles
      post_review: false
      post_timeout: null
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/vexxhost/atmosphere
        name: vexxhost/atmosphere
        short_name: atmosphere
        src_dir: src/github.com/vexxhost/atmosphere
      projects:
        github.com/vexxhost/atmosphere:
          canonical_hostname: github.com
          canonical_name: github.com/vexxhost/atmosphere
          checkout: main
          checkout_description: zuul branch
          commit: c9fcb499a3021fb478a991ecbc860e03a4abfc88
          name: vexxhost/atmosphere
          required: false
          short_name: atmosphere
          src_dir: src/github.com/vexxhost/atmosphere
      ref: refs/pull/3772/head
      resources: {}
      tenant: oss
      timeout: 1800
      topic: null
      voting: true
