all:
  children:
    cephs:
      hosts:
        instance: null
    computes:
      hosts:
        instance: null
    controllers:
      hosts:
        instance: null
    zuul_unreachable:
      hosts: {}
  hosts:
    instance:
      ansible_connection: ssh
      ansible_host: 162.253.55.43
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      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
      cilium_ipv4_cidr: 172.24.0.0/16
      csi_driver: rbd
      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: 8c0ac12e-f96d-4957-b8a3-ff21b2b376d6
        host_id: 571d5e5ab8f99eb6066d22838dc03059a55de74ec327a875b342f73d
        interface_ip: 162.253.55.43
        label: ubuntu-jammy
        node_properties: {}
        private_ipv4: 162.253.55.43
        private_ipv6: null
        provider: yul1
        public_ipv4: 162.253.55.43
        public_ipv6: 2604:e100:1:0:f816:3eff:fe9b:fefd
        region: ca-ymq-1
        slot: null
      zuul_node:
        az: nova
        cloud: public
        external_id: 8c0ac12e-f96d-4957-b8a3-ff21b2b376d6
        host_id: 571d5e5ab8f99eb6066d22838dc03059a55de74ec327a875b342f73d
        interface_ip: 162.253.55.43
        label: ubuntu-jammy
        node_properties: {}
        private_ipv4: 162.253.55.43
        private_ipv6: null
        provider: yul1
        public_ipv4: 162.253.55.43
        public_ipv6: 2604:e100:1:0:f816:3eff:fe9b:fefd
        region: ca-ymq-1
        slot: null
        uuid: null
  vars:
    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
    cilium_ipv4_cidr: 172.24.0.0/16
    csi_driver: rbd
    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: 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#17>'
      - '<Job atmosphere-molecule-csi explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/atmosphere/.zuul.yaml@main#53>'
      - '<Job atmosphere-molecule-csi-rbd explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: vexxhost/atmosphere/.zuul.yaml@main#66>'
      - '<Job atmosphere-molecule-csi-rbd explicit: None implied: None source: vexxhost/atmosphere/.zuul.yaml@main#72>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: d5d9fcc33a874faea0154b14b6c5e571
      build_refs:
      - branch: main
        change: '3542'
        change_message: "fix(kube_prometheus_stack): fix Goldpinger alert unit tests\n\nFixes
          failing unit tests for Goldpinger alerts due to vector matching error and
          missing test expectations.\n\n## Vector Matching Fix\n\nThe `GoldpingerNodeUnreachable`
          alert expression failed in promtool unit tests because `count by (host_ip)(...)
          / count(goldpinger_cluster_health_total)` attempts to divide two vectors
          with incompatible label sets (`{host_ip=\"...\"}` vs `{}`). Prometheus binary
          operations between vectors require matching labels.\n\n```diff\n  (\n    count
          by (host_ip) (...)\n    /\n-   count(goldpinger_cluster_health_total)\n+
          \  scalar(count(goldpinger_cluster_health_total))\n  ) > 0.5\n```\n\nUsing
          `scalar()` converts the denominator to a scalar value, allowing the division
          to succeed.\n\n## Test Expectations\n\nAdded missing `description` annotations
          to test expectations for:\n- `GoldpingerNodeUnreachable` (expected: \"Node
          with IP 10.101.5.120 has a median ping latency above 1s from more than 50%
          (current: 100%)...\")\n- `GoldpingerHighPeerLatency` (expected: \"The 95th
          percentile of peer-to-peer latency is 975ms...\")\n- `GoldpingerHighErrorRate`
          (expected: \"More than 5% (current: 10%) of Goldpinger ping attempts are
          failing...\")\n\nPromtool requires all annotations present in the alert
          rule to be matched in test expectations.\n\n## Result\n\nAll 8 Goldpinger
          unit tests now pass (2 per alert: should fire / should not fire).\n\n<!--
          START COPILOT ORIGINAL PROMPT -->\n\n\n\n<details>\n\n<summary>Original
          prompt</summary>\n\n\n\n<analysis>\n1. **Chronological Review**:\n   - Phase
          1: User investigated recurring Goldpinger alerts in their Atmosphere (OpenStack
          on Kubernetes) deployment\n   - Phase 2: Diagnosed root cause (kvm5/kvm6
          with high disk I/O and network drops)\n   - Phase 3: Evaluated existing
          alert as noisy and not SRE-compliant\n   - Phase 4: Created 4 new SRE-compliant
          Goldpinger alerts in goldpinger.libsonnet\n   - Phase 5: Added runbook documentation,
          updated alerting instructions\n   - Phase 6: Verified PromQL expressions
          against live Prometheus\n   - Phase 7: Full audit pass - all checks green\n
          \  - Phase 8: Writing PromQL unit tests in tests.yml (CURRENT - actively
          debugging)\n\n2. **Intent Mapping**:\n   - User's final request: \"Can you
          look at how the promql unit tests are written in tests.yml and update the
          rules file to make sure that it creates alert rules for all the alerts that
          it creates to make sure that they are properly tested, and run CGO_ENABLED=0
          go test ./roles/kube_prometheus_stack to test it\"\n   - User's additional
          instruction during test writing: \"Get metrics from the current cloud and
          make queries to be able to get values and real labels\"\n   - User's tip:
          \"You could use this: kubectl -n monitoring exec -it svc/kube-prometheus-stack-prometheus
          -- promtool query\" for faster metric queries\n\n3. **Technical Inventory**:\n
          \  - Prometheus, Goldpinger, Jsonnet, Go testing, promtool\n   - Real le
          bucket values: 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10,
          30, +Inf\n   - Real labels: instance, goldpinger_instance, job=\"goldpinger\",
          call_type=\"ping\", host_ip, pod_ip, le, status, type, action, group\n   -
          Real host IPs from cluster (e.g., 10.101.5.115, 10.101.5.116, 10.101.5.120,
          etc.)\n   - 21 Goldpinger nodes: ctl1-3, kvm1-15, nvme1-3\n\n4. **Code Archaeology**:\n
          \  - `tests.yml` - main file being modified with 8 new test cases (2 per
          alert \xD7 4 alerts)\n   - `goldpinger.libsonnet` - the 4 alert definitions\n
          \  - `rules_test.go` - Go test harness that runs promtool against generated
          rules\n\n5. **Progress Assessment**:\n   - GoldpingerHighUnhealthyRatio:
          Both tests PASS \u2713\n   - GoldpingerNodeUnreachable: \"should NOT fire\"
          PASSES, \"should fire\" FAILS - vector matching issue with `count by (host_ip)
          / count(scalar)`\n   - GoldpingerHighPeerLatency: \"should NOT fire\" PASSES,
          \"should fire\" FAILS - just missing description annotation in expected
          output (expression itself works correctly, value=975ms)\n   - GoldpingerHighErrorRate:
          \"should NOT fire\" PASSES, \"should fire\" FAILS - just missing description
          annotation in expected output (expression itself works correctly, value=10%)\n\n6.
          **Context Validation**: The critical debugging context is that the GoldpingerNodeUnreachable
          alert expression has a vector matching problem in promtool unit tests. The
          `count by (host_ip)(...)` returns `{host_ip=\"10.101.5.120\"} 2` and `count(goldpinger_cluster_health_total)`
          returns `{} 2`, but dividing them returns nil because Prometheus vector
          matching requires matching label sets for binary operations between vectors.\n\n7.
          **Recent Commands Analysis**:\n   - Multiple debug promtool test runs confirming
          the vector matching issue\n   - The final debug test explicitly proved:
          `count by (host_ip)(...) / count(goldpinger_cluster_health_total)` returns
          nil even though both sides have valid values, because one has `{host_ip=\"10.101.5.120\"}`
          and the other has `{}` - they can't match\n   - This is the core bug being
          debugged when summarization triggered\n</analysis>\n\n<summary>\n1. Conversation
          Overview:\n   - Primary Objectives: User asked to investigate recurring
          Goldpinger alerts, diagnose root cause, replace noisy alerts with SRE-compliant
          ones, create runbook documentation, and write comprehensive PromQL unit
          tests. Latest request: \"Can you look at how the promql unit tests are written
          in /home/mnaser/src/github.com/vexxhost/atmosphere/roles/kube_prometheus_stack/files/jsonnet/tests.yml
          and update the rules file to make sure that it creates alert rules for all
          the alerts that it creates to make sure that they are properly tested, and
          run CGO_ENABLED=0 go test ./roles/kube_prometheus_stack to test it\"\n   -
          Session Context: Diagnosed kvm5/kvm6 as problematic nodes, replaced single
          noisy `GoldpingerNodesUnhealthy` alert with 4 SRE-compliant alerts, added
          documentation, and now writing/debugging unit tests. User additionally instructed:
          \"Get metrics from the current cloud and make queries to be able to get
          values and real labels\" and suggested using `kubectl -n monitoring exec
          svc/kube-prometheus-stack-prometheus -- promtool query instant http://localhost:9090`
          for faster queries.\n   - User Intent Evolution: Started with alert investigation
          \u2192 alert quality evaluation \u2192 new alert creation \u2192 documentation
          \u2192 testing with real data\n\n2. Technical Foundation:\n   - Atmosphere:
          OpenStack on Kubernetes deployment (VEXXHOST)\n   - Prometheus: Running
          in `monitoring` namespace as `svc/kube-prometheus-stack-prometheus` on port
          9090\n   - Goldpinger: Cluster mesh connectivi...\n\n</details>\n\n\n\n<!--
          START COPILOT CODING AGENT SUFFIX -->\n\nCreated from Copilot CLI via the
          copilot delegate command.\n\n<!-- START COPILOT CODING AGENT TIPS -->\n---\n\n\U0001F4AC
          We'd love your input! Share your thoughts on Copilot coding agent in our
          [2 minute survey](https://gh.io/copilot-coding-agent-survey).\n"
        change_url: https://github.com/vexxhost/atmosphere/pull/3542
        commit_id: 5f5a5d743570e53b3a1b0362d1f14a33093cb51c
        patchset: 5f5a5d743570e53b3a1b0362d1f14a33093cb51c
        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
      buildset: 191b986a3402478f926f0029e5f0e48e
      buildset_refs:
      - branch: main
        change: '3542'
        change_message: "fix(kube_prometheus_stack): fix Goldpinger alert unit tests\n\nFixes
          failing unit tests for Goldpinger alerts due to vector matching error and
          missing test expectations.\n\n## Vector Matching Fix\n\nThe `GoldpingerNodeUnreachable`
          alert expression failed in promtool unit tests because `count by (host_ip)(...)
          / count(goldpinger_cluster_health_total)` attempts to divide two vectors
          with incompatible label sets (`{host_ip=\"...\"}` vs `{}`). Prometheus binary
          operations between vectors require matching labels.\n\n```diff\n  (\n    count
          by (host_ip) (...)\n    /\n-   count(goldpinger_cluster_health_total)\n+
          \  scalar(count(goldpinger_cluster_health_total))\n  ) > 0.5\n```\n\nUsing
          `scalar()` converts the denominator to a scalar value, allowing the division
          to succeed.\n\n## Test Expectations\n\nAdded missing `description` annotations
          to test expectations for:\n- `GoldpingerNodeUnreachable` (expected: \"Node
          with IP 10.101.5.120 has a median ping latency above 1s from more than 50%
          (current: 100%)...\")\n- `GoldpingerHighPeerLatency` (expected: \"The 95th
          percentile of peer-to-peer latency is 975ms...\")\n- `GoldpingerHighErrorRate`
          (expected: \"More than 5% (current: 10%) of Goldpinger ping attempts are
          failing...\")\n\nPromtool requires all annotations present in the alert
          rule to be matched in test expectations.\n\n## Result\n\nAll 8 Goldpinger
          unit tests now pass (2 per alert: should fire / should not fire).\n\n<!--
          START COPILOT ORIGINAL PROMPT -->\n\n\n\n<details>\n\n<summary>Original
          prompt</summary>\n\n\n\n<analysis>\n1. **Chronological Review**:\n   - Phase
          1: User investigated recurring Goldpinger alerts in their Atmosphere (OpenStack
          on Kubernetes) deployment\n   - Phase 2: Diagnosed root cause (kvm5/kvm6
          with high disk I/O and network drops)\n   - Phase 3: Evaluated existing
          alert as noisy and not SRE-compliant\n   - Phase 4: Created 4 new SRE-compliant
          Goldpinger alerts in goldpinger.libsonnet\n   - Phase 5: Added runbook documentation,
          updated alerting instructions\n   - Phase 6: Verified PromQL expressions
          against live Prometheus\n   - Phase 7: Full audit pass - all checks green\n
          \  - Phase 8: Writing PromQL unit tests in tests.yml (CURRENT - actively
          debugging)\n\n2. **Intent Mapping**:\n   - User's final request: \"Can you
          look at how the promql unit tests are written in tests.yml and update the
          rules file to make sure that it creates alert rules for all the alerts that
          it creates to make sure that they are properly tested, and run CGO_ENABLED=0
          go test ./roles/kube_prometheus_stack to test it\"\n   - User's additional
          instruction during test writing: \"Get metrics from the current cloud and
          make queries to be able to get values and real labels\"\n   - User's tip:
          \"You could use this: kubectl -n monitoring exec -it svc/kube-prometheus-stack-prometheus
          -- promtool query\" for faster metric queries\n\n3. **Technical Inventory**:\n
          \  - Prometheus, Goldpinger, Jsonnet, Go testing, promtool\n   - Real le
          bucket values: 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10,
          30, +Inf\n   - Real labels: instance, goldpinger_instance, job=\"goldpinger\",
          call_type=\"ping\", host_ip, pod_ip, le, status, type, action, group\n   -
          Real host IPs from cluster (e.g., 10.101.5.115, 10.101.5.116, 10.101.5.120,
          etc.)\n   - 21 Goldpinger nodes: ctl1-3, kvm1-15, nvme1-3\n\n4. **Code Archaeology**:\n
          \  - `tests.yml` - main file being modified with 8 new test cases (2 per
          alert \xD7 4 alerts)\n   - `goldpinger.libsonnet` - the 4 alert definitions\n
          \  - `rules_test.go` - Go test harness that runs promtool against generated
          rules\n\n5. **Progress Assessment**:\n   - GoldpingerHighUnhealthyRatio:
          Both tests PASS \u2713\n   - GoldpingerNodeUnreachable: \"should NOT fire\"
          PASSES, \"should fire\" FAILS - vector matching issue with `count by (host_ip)
          / count(scalar)`\n   - GoldpingerHighPeerLatency: \"should NOT fire\" PASSES,
          \"should fire\" FAILS - just missing description annotation in expected
          output (expression itself works correctly, value=975ms)\n   - GoldpingerHighErrorRate:
          \"should NOT fire\" PASSES, \"should fire\" FAILS - just missing description
          annotation in expected output (expression itself works correctly, value=10%)\n\n6.
          **Context Validation**: The critical debugging context is that the GoldpingerNodeUnreachable
          alert expression has a vector matching problem in promtool unit tests. The
          `count by (host_ip)(...)` returns `{host_ip=\"10.101.5.120\"} 2` and `count(goldpinger_cluster_health_total)`
          returns `{} 2`, but dividing them returns nil because Prometheus vector
          matching requires matching label sets for binary operations between vectors.\n\n7.
          **Recent Commands Analysis**:\n   - Multiple debug promtool test runs confirming
          the vector matching issue\n   - The final debug test explicitly proved:
          `count by (host_ip)(...) / count(goldpinger_cluster_health_total)` returns
          nil even though both sides have valid values, because one has `{host_ip=\"10.101.5.120\"}`
          and the other has `{}` - they can't match\n   - This is the core bug being
          debugged when summarization triggered\n</analysis>\n\n<summary>\n1. Conversation
          Overview:\n   - Primary Objectives: User asked to investigate recurring
          Goldpinger alerts, diagnose root cause, replace noisy alerts with SRE-compliant
          ones, create runbook documentation, and write comprehensive PromQL unit
          tests. Latest request: \"Can you look at how the promql unit tests are written
          in /home/mnaser/src/github.com/vexxhost/atmosphere/roles/kube_prometheus_stack/files/jsonnet/tests.yml
          and update the rules file to make sure that it creates alert rules for all
          the alerts that it creates to make sure that they are properly tested, and
          run CGO_ENABLED=0 go test ./roles/kube_prometheus_stack to test it\"\n   -
          Session Context: Diagnosed kvm5/kvm6 as problematic nodes, replaced single
          noisy `GoldpingerNodesUnhealthy` alert with 4 SRE-compliant alerts, added
          documentation, and now writing/debugging unit tests. User additionally instructed:
          \"Get metrics from the current cloud and make queries to be able to get
          values and real labels\" and suggested using `kubectl -n monitoring exec
          svc/kube-prometheus-stack-prometheus -- promtool query instant http://localhost:9090`
          for faster queries.\n   - User Intent Evolution: Started with alert investigation
          \u2192 alert quality evaluation \u2192 new alert creation \u2192 documentation
          \u2192 testing with real data\n\n2. Technical Foundation:\n   - Atmosphere:
          OpenStack on Kubernetes deployment (VEXXHOST)\n   - Prometheus: Running
          in `monitoring` namespace as `svc/kube-prometheus-stack-prometheus` on port
          9090\n   - Goldpinger: Cluster mesh connectivi...\n\n</details>\n\n\n\n<!--
          START COPILOT CODING AGENT SUFFIX -->\n\nCreated from Copilot CLI via the
          copilot delegate command.\n\n<!-- START COPILOT CODING AGENT TIPS -->\n---\n\n\U0001F4AC
          We'd love your input! Share your thoughts on Copilot coding agent in our
          [2 minute survey](https://gh.io/copilot-coding-agent-survey).\n"
        change_url: https://github.com/vexxhost/atmosphere/pull/3542
        commit_id: 5f5a5d743570e53b3a1b0362d1f14a33093cb51c
        patchset: 5f5a5d743570e53b3a1b0362d1f14a33093cb51c
        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
      change: '3542'
      change_message: "fix(kube_prometheus_stack): fix Goldpinger alert unit tests\n\nFixes
        failing unit tests for Goldpinger alerts due to vector matching error and
        missing test expectations.\n\n## Vector Matching Fix\n\nThe `GoldpingerNodeUnreachable`
        alert expression failed in promtool unit tests because `count by (host_ip)(...)
        / count(goldpinger_cluster_health_total)` attempts to divide two vectors with
        incompatible label sets (`{host_ip=\"...\"}` vs `{}`). Prometheus binary operations
        between vectors require matching labels.\n\n```diff\n  (\n    count by (host_ip)
        (...)\n    /\n-   count(goldpinger_cluster_health_total)\n+   scalar(count(goldpinger_cluster_health_total))\n
        \ ) > 0.5\n```\n\nUsing `scalar()` converts the denominator to a scalar value,
        allowing the division to succeed.\n\n## Test Expectations\n\nAdded missing
        `description` annotations to test expectations for:\n- `GoldpingerNodeUnreachable`
        (expected: \"Node with IP 10.101.5.120 has a median ping latency above 1s
        from more than 50% (current: 100%)...\")\n- `GoldpingerHighPeerLatency` (expected:
        \"The 95th percentile of peer-to-peer latency is 975ms...\")\n- `GoldpingerHighErrorRate`
        (expected: \"More than 5% (current: 10%) of Goldpinger ping attempts are failing...\")\n\nPromtool
        requires all annotations present in the alert rule to be matched in test expectations.\n\n##
        Result\n\nAll 8 Goldpinger unit tests now pass (2 per alert: should fire /
        should not fire).\n\n<!-- START COPILOT ORIGINAL PROMPT -->\n\n\n\n<details>\n\n<summary>Original
        prompt</summary>\n\n\n\n<analysis>\n1. **Chronological Review**:\n   - Phase
        1: User investigated recurring Goldpinger alerts in their Atmosphere (OpenStack
        on Kubernetes) deployment\n   - Phase 2: Diagnosed root cause (kvm5/kvm6 with
        high disk I/O and network drops)\n   - Phase 3: Evaluated existing alert as
        noisy and not SRE-compliant\n   - Phase 4: Created 4 new SRE-compliant Goldpinger
        alerts in goldpinger.libsonnet\n   - Phase 5: Added runbook documentation,
        updated alerting instructions\n   - Phase 6: Verified PromQL expressions against
        live Prometheus\n   - Phase 7: Full audit pass - all checks green\n   - Phase
        8: Writing PromQL unit tests in tests.yml (CURRENT - actively debugging)\n\n2.
        **Intent Mapping**:\n   - User's final request: \"Can you look at how the
        promql unit tests are written in tests.yml and update the rules file to make
        sure that it creates alert rules for all the alerts that it creates to make
        sure that they are properly tested, and run CGO_ENABLED=0 go test ./roles/kube_prometheus_stack
        to test it\"\n   - User's additional instruction during test writing: \"Get
        metrics from the current cloud and make queries to be able to get values and
        real labels\"\n   - User's tip: \"You could use this: kubectl -n monitoring
        exec -it svc/kube-prometheus-stack-prometheus -- promtool query\" for faster
        metric queries\n\n3. **Technical Inventory**:\n   - Prometheus, Goldpinger,
        Jsonnet, Go testing, promtool\n   - Real le bucket values: 0.005, 0.01, 0.025,
        0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, 30, +Inf\n   - Real labels: instance,
        goldpinger_instance, job=\"goldpinger\", call_type=\"ping\", host_ip, pod_ip,
        le, status, type, action, group\n   - Real host IPs from cluster (e.g., 10.101.5.115,
        10.101.5.116, 10.101.5.120, etc.)\n   - 21 Goldpinger nodes: ctl1-3, kvm1-15,
        nvme1-3\n\n4. **Code Archaeology**:\n   - `tests.yml` - main file being modified
        with 8 new test cases (2 per alert \xD7 4 alerts)\n   - `goldpinger.libsonnet`
        - the 4 alert definitions\n   - `rules_test.go` - Go test harness that runs
        promtool against generated rules\n\n5. **Progress Assessment**:\n   - GoldpingerHighUnhealthyRatio:
        Both tests PASS \u2713\n   - GoldpingerNodeUnreachable: \"should NOT fire\"
        PASSES, \"should fire\" FAILS - vector matching issue with `count by (host_ip)
        / count(scalar)`\n   - GoldpingerHighPeerLatency: \"should NOT fire\" PASSES,
        \"should fire\" FAILS - just missing description annotation in expected output
        (expression itself works correctly, value=975ms)\n   - GoldpingerHighErrorRate:
        \"should NOT fire\" PASSES, \"should fire\" FAILS - just missing description
        annotation in expected output (expression itself works correctly, value=10%)\n\n6.
        **Context Validation**: The critical debugging context is that the GoldpingerNodeUnreachable
        alert expression has a vector matching problem in promtool unit tests. The
        `count by (host_ip)(...)` returns `{host_ip=\"10.101.5.120\"} 2` and `count(goldpinger_cluster_health_total)`
        returns `{} 2`, but dividing them returns nil because Prometheus vector matching
        requires matching label sets for binary operations between vectors.\n\n7.
        **Recent Commands Analysis**:\n   - Multiple debug promtool test runs confirming
        the vector matching issue\n   - The final debug test explicitly proved: `count
        by (host_ip)(...) / count(goldpinger_cluster_health_total)` returns nil even
        though both sides have valid values, because one has `{host_ip=\"10.101.5.120\"}`
        and the other has `{}` - they can't match\n   - This is the core bug being
        debugged when summarization triggered\n</analysis>\n\n<summary>\n1. Conversation
        Overview:\n   - Primary Objectives: User asked to investigate recurring Goldpinger
        alerts, diagnose root cause, replace noisy alerts with SRE-compliant ones,
        create runbook documentation, and write comprehensive PromQL unit tests. Latest
        request: \"Can you look at how the promql unit tests are written in /home/mnaser/src/github.com/vexxhost/atmosphere/roles/kube_prometheus_stack/files/jsonnet/tests.yml
        and update the rules file to make sure that it creates alert rules for all
        the alerts that it creates to make sure that they are properly tested, and
        run CGO_ENABLED=0 go test ./roles/kube_prometheus_stack to test it\"\n   -
        Session Context: Diagnosed kvm5/kvm6 as problematic nodes, replaced single
        noisy `GoldpingerNodesUnhealthy` alert with 4 SRE-compliant alerts, added
        documentation, and now writing/debugging unit tests. User additionally instructed:
        \"Get metrics from the current cloud and make queries to be able to get values
        and real labels\" and suggested using `kubectl -n monitoring exec svc/kube-prometheus-stack-prometheus
        -- promtool query instant http://localhost:9090` for faster queries.\n   -
        User Intent Evolution: Started with alert investigation \u2192 alert quality
        evaluation \u2192 new alert creation \u2192 documentation \u2192 testing with
        real data\n\n2. Technical Foundation:\n   - Atmosphere: OpenStack on Kubernetes
        deployment (VEXXHOST)\n   - Prometheus: Running in `monitoring` namespace
        as `svc/kube-prometheus-stack-prometheus` on port 9090\n   - Goldpinger: Cluster
        mesh connectivi...\n\n</details>\n\n\n\n<!-- START COPILOT CODING AGENT SUFFIX
        -->\n\nCreated from Copilot CLI via the copilot delegate command.\n\n<!--
        START COPILOT CODING AGENT TIPS -->\n---\n\n\U0001F4AC We'd love your input!
        Share your thoughts on Copilot coding agent in our [2 minute survey](https://gh.io/copilot-coding-agent-survey).\n"
      change_url: https://github.com/vexxhost/atmosphere/pull/3542
      child_jobs: []
      commit_id: 5f5a5d743570e53b3a1b0362d1f14a33093cb51c
      event_id: afd36230-03c6-11f1-9721-361ab07bfd39
      executor:
        hostname: 3a2793d2bd32
        inventory_file: /var/lib/zuul/builds/d5d9fcc33a874faea0154b14b6c5e571/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/d5d9fcc33a874faea0154b14b6c5e571/work/logs
        result_data_file: /var/lib/zuul/builds/d5d9fcc33a874faea0154b14b6c5e571/work/results.json
        src_root: /var/lib/zuul/builds/d5d9fcc33a874faea0154b14b6c5e571/work/src
        work_root: /var/lib/zuul/builds/d5d9fcc33a874faea0154b14b6c5e571/work
      include_vars: []
      items:
      - branch: main
        change: '3542'
        change_message: "fix(kube_prometheus_stack): fix Goldpinger alert unit tests\n\nFixes
          failing unit tests for Goldpinger alerts due to vector matching error and
          missing test expectations.\n\n## Vector Matching Fix\n\nThe `GoldpingerNodeUnreachable`
          alert expression failed in promtool unit tests because `count by (host_ip)(...)
          / count(goldpinger_cluster_health_total)` attempts to divide two vectors
          with incompatible label sets (`{host_ip=\"...\"}` vs `{}`). Prometheus binary
          operations between vectors require matching labels.\n\n```diff\n  (\n    count
          by (host_ip) (...)\n    /\n-   count(goldpinger_cluster_health_total)\n+
          \  scalar(count(goldpinger_cluster_health_total))\n  ) > 0.5\n```\n\nUsing
          `scalar()` converts the denominator to a scalar value, allowing the division
          to succeed.\n\n## Test Expectations\n\nAdded missing `description` annotations
          to test expectations for:\n- `GoldpingerNodeUnreachable` (expected: \"Node
          with IP 10.101.5.120 has a median ping latency above 1s from more than 50%
          (current: 100%)...\")\n- `GoldpingerHighPeerLatency` (expected: \"The 95th
          percentile of peer-to-peer latency is 975ms...\")\n- `GoldpingerHighErrorRate`
          (expected: \"More than 5% (current: 10%) of Goldpinger ping attempts are
          failing...\")\n\nPromtool requires all annotations present in the alert
          rule to be matched in test expectations.\n\n## Result\n\nAll 8 Goldpinger
          unit tests now pass (2 per alert: should fire / should not fire).\n\n<!--
          START COPILOT ORIGINAL PROMPT -->\n\n\n\n<details>\n\n<summary>Original
          prompt</summary>\n\n\n\n<analysis>\n1. **Chronological Review**:\n   - Phase
          1: User investigated recurring Goldpinger alerts in their Atmosphere (OpenStack
          on Kubernetes) deployment\n   - Phase 2: Diagnosed root cause (kvm5/kvm6
          with high disk I/O and network drops)\n   - Phase 3: Evaluated existing
          alert as noisy and not SRE-compliant\n   - Phase 4: Created 4 new SRE-compliant
          Goldpinger alerts in goldpinger.libsonnet\n   - Phase 5: Added runbook documentation,
          updated alerting instructions\n   - Phase 6: Verified PromQL expressions
          against live Prometheus\n   - Phase 7: Full audit pass - all checks green\n
          \  - Phase 8: Writing PromQL unit tests in tests.yml (CURRENT - actively
          debugging)\n\n2. **Intent Mapping**:\n   - User's final request: \"Can you
          look at how the promql unit tests are written in tests.yml and update the
          rules file to make sure that it creates alert rules for all the alerts that
          it creates to make sure that they are properly tested, and run CGO_ENABLED=0
          go test ./roles/kube_prometheus_stack to test it\"\n   - User's additional
          instruction during test writing: \"Get metrics from the current cloud and
          make queries to be able to get values and real labels\"\n   - User's tip:
          \"You could use this: kubectl -n monitoring exec -it svc/kube-prometheus-stack-prometheus
          -- promtool query\" for faster metric queries\n\n3. **Technical Inventory**:\n
          \  - Prometheus, Goldpinger, Jsonnet, Go testing, promtool\n   - Real le
          bucket values: 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10,
          30, +Inf\n   - Real labels: instance, goldpinger_instance, job=\"goldpinger\",
          call_type=\"ping\", host_ip, pod_ip, le, status, type, action, group\n   -
          Real host IPs from cluster (e.g., 10.101.5.115, 10.101.5.116, 10.101.5.120,
          etc.)\n   - 21 Goldpinger nodes: ctl1-3, kvm1-15, nvme1-3\n\n4. **Code Archaeology**:\n
          \  - `tests.yml` - main file being modified with 8 new test cases (2 per
          alert \xD7 4 alerts)\n   - `goldpinger.libsonnet` - the 4 alert definitions\n
          \  - `rules_test.go` - Go test harness that runs promtool against generated
          rules\n\n5. **Progress Assessment**:\n   - GoldpingerHighUnhealthyRatio:
          Both tests PASS \u2713\n   - GoldpingerNodeUnreachable: \"should NOT fire\"
          PASSES, \"should fire\" FAILS - vector matching issue with `count by (host_ip)
          / count(scalar)`\n   - GoldpingerHighPeerLatency: \"should NOT fire\" PASSES,
          \"should fire\" FAILS - just missing description annotation in expected
          output (expression itself works correctly, value=975ms)\n   - GoldpingerHighErrorRate:
          \"should NOT fire\" PASSES, \"should fire\" FAILS - just missing description
          annotation in expected output (expression itself works correctly, value=10%)\n\n6.
          **Context Validation**: The critical debugging context is that the GoldpingerNodeUnreachable
          alert expression has a vector matching problem in promtool unit tests. The
          `count by (host_ip)(...)` returns `{host_ip=\"10.101.5.120\"} 2` and `count(goldpinger_cluster_health_total)`
          returns `{} 2`, but dividing them returns nil because Prometheus vector
          matching requires matching label sets for binary operations between vectors.\n\n7.
          **Recent Commands Analysis**:\n   - Multiple debug promtool test runs confirming
          the vector matching issue\n   - The final debug test explicitly proved:
          `count by (host_ip)(...) / count(goldpinger_cluster_health_total)` returns
          nil even though both sides have valid values, because one has `{host_ip=\"10.101.5.120\"}`
          and the other has `{}` - they can't match\n   - This is the core bug being
          debugged when summarization triggered\n</analysis>\n\n<summary>\n1. Conversation
          Overview:\n   - Primary Objectives: User asked to investigate recurring
          Goldpinger alerts, diagnose root cause, replace noisy alerts with SRE-compliant
          ones, create runbook documentation, and write comprehensive PromQL unit
          tests. Latest request: \"Can you look at how the promql unit tests are written
          in /home/mnaser/src/github.com/vexxhost/atmosphere/roles/kube_prometheus_stack/files/jsonnet/tests.yml
          and update the rules file to make sure that it creates alert rules for all
          the alerts that it creates to make sure that they are properly tested, and
          run CGO_ENABLED=0 go test ./roles/kube_prometheus_stack to test it\"\n   -
          Session Context: Diagnosed kvm5/kvm6 as problematic nodes, replaced single
          noisy `GoldpingerNodesUnhealthy` alert with 4 SRE-compliant alerts, added
          documentation, and now writing/debugging unit tests. User additionally instructed:
          \"Get metrics from the current cloud and make queries to be able to get
          values and real labels\" and suggested using `kubectl -n monitoring exec
          svc/kube-prometheus-stack-prometheus -- promtool query instant http://localhost:9090`
          for faster queries.\n   - User Intent Evolution: Started with alert investigation
          \u2192 alert quality evaluation \u2192 new alert creation \u2192 documentation
          \u2192 testing with real data\n\n2. Technical Foundation:\n   - Atmosphere:
          OpenStack on Kubernetes deployment (VEXXHOST)\n   - Prometheus: Running
          in `monitoring` namespace as `svc/kube-prometheus-stack-prometheus` on port
          9090\n   - Goldpinger: Cluster mesh connectivi...\n\n</details>\n\n\n\n<!--
          START COPILOT CODING AGENT SUFFIX -->\n\nCreated from Copilot CLI via the
          copilot delegate command.\n\n<!-- START COPILOT CODING AGENT TIPS -->\n---\n\n\U0001F4AC
          We'd love your input! Share your thoughts on Copilot coding agent in our
          [2 minute survey](https://gh.io/copilot-coding-agent-survey).\n"
        change_url: https://github.com/vexxhost/atmosphere/pull/3542
        commit_id: 5f5a5d743570e53b3a1b0362d1f14a33093cb51c
        patchset: 5f5a5d743570e53b3a1b0362d1f14a33093cb51c
        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-rbd
      jobtags: []
      max_attempts: 3
      message: Zml4KGt1YmVfcHJvbWV0aGV1c19zdGFjayk6IGZpeCBHb2xkcGluZ2VyIGFsZXJ0IHVuaXQgdGVzdHMKCkZpeGVzIGZhaWxpbmcgdW5pdCB0ZXN0cyBmb3IgR29sZHBpbmdlciBhbGVydHMgZHVlIHRvIHZlY3RvciBtYXRjaGluZyBlcnJvciBhbmQgbWlzc2luZyB0ZXN0IGV4cGVjdGF0aW9ucy4KCiMjIFZlY3RvciBNYXRjaGluZyBGaXgKClRoZSBgR29sZHBpbmdlck5vZGVVbnJlYWNoYWJsZWAgYWxlcnQgZXhwcmVzc2lvbiBmYWlsZWQgaW4gcHJvbXRvb2wgdW5pdCB0ZXN0cyBiZWNhdXNlIGBjb3VudCBieSAoaG9zdF9pcCkoLi4uKSAvIGNvdW50KGdvbGRwaW5nZXJfY2x1c3Rlcl9oZWFsdGhfdG90YWwpYCBhdHRlbXB0cyB0byBkaXZpZGUgdHdvIHZlY3RvcnMgd2l0aCBpbmNvbXBhdGlibGUgbGFiZWwgc2V0cyAoYHtob3N0X2lwPSIuLi4ifWAgdnMgYHt9YCkuIFByb21ldGhldXMgYmluYXJ5IG9wZXJhdGlvbnMgYmV0d2VlbiB2ZWN0b3JzIHJlcXVpcmUgbWF0Y2hpbmcgbGFiZWxzLgoKYGBgZGlmZgogICgKICAgIGNvdW50IGJ5IChob3N0X2lwKSAoLi4uKQogICAgLwotICAgY291bnQoZ29sZHBpbmdlcl9jbHVzdGVyX2hlYWx0aF90b3RhbCkKKyAgIHNjYWxhcihjb3VudChnb2xkcGluZ2VyX2NsdXN0ZXJfaGVhbHRoX3RvdGFsKSkKICApID4gMC41CmBgYAoKVXNpbmcgYHNjYWxhcigpYCBjb252ZXJ0cyB0aGUgZGVub21pbmF0b3IgdG8gYSBzY2FsYXIgdmFsdWUsIGFsbG93aW5nIHRoZSBkaXZpc2lvbiB0byBzdWNjZWVkLgoKIyMgVGVzdCBFeHBlY3RhdGlvbnMKCkFkZGVkIG1pc3NpbmcgYGRlc2NyaXB0aW9uYCBhbm5vdGF0aW9ucyB0byB0ZXN0IGV4cGVjdGF0aW9ucyBmb3I6Ci0gYEdvbGRwaW5nZXJOb2RlVW5yZWFjaGFibGVgIChleHBlY3RlZDogIk5vZGUgd2l0aCBJUCAxMC4xMDEuNS4xMjAgaGFzIGEgbWVkaWFuIHBpbmcgbGF0ZW5jeSBhYm92ZSAxcyBmcm9tIG1vcmUgdGhhbiA1MCUgKGN1cnJlbnQ6IDEwMCUpLi4uIikKLSBgR29sZHBpbmdlckhpZ2hQZWVyTGF0ZW5jeWAgKGV4cGVjdGVkOiAiVGhlIDk1dGggcGVyY2VudGlsZSBvZiBwZWVyLXRvLXBlZXIgbGF0ZW5jeSBpcyA5NzVtcy4uLiIpCi0gYEdvbGRwaW5nZXJIaWdoRXJyb3JSYXRlYCAoZXhwZWN0ZWQ6ICJNb3JlIHRoYW4gNSUgKGN1cnJlbnQ6IDEwJSkgb2YgR29sZHBpbmdlciBwaW5nIGF0dGVtcHRzIGFyZSBmYWlsaW5nLi4uIikKClByb210b29sIHJlcXVpcmVzIGFsbCBhbm5vdGF0aW9ucyBwcmVzZW50IGluIHRoZSBhbGVydCBydWxlIHRvIGJlIG1hdGNoZWQgaW4gdGVzdCBleHBlY3RhdGlvbnMuCgojIyBSZXN1bHQKCkFsbCA4IEdvbGRwaW5nZXIgdW5pdCB0ZXN0cyBub3cgcGFzcyAoMiBwZXIgYWxlcnQ6IHNob3VsZCBmaXJlIC8gc2hvdWxkIG5vdCBmaXJlKS4KCjwhLS0gU1RBUlQgQ09QSUxPVCBPUklHSU5BTCBQUk9NUFQgLS0+CgoKCjxkZXRhaWxzPgoKPHN1bW1hcnk+T3JpZ2luYWwgcHJvbXB0PC9zdW1tYXJ5PgoKCgo8YW5hbHlzaXM+CjEuICoqQ2hyb25vbG9naWNhbCBSZXZpZXcqKjoKICAgLSBQaGFzZSAxOiBVc2VyIGludmVzdGlnYXRlZCByZWN1cnJpbmcgR29sZHBpbmdlciBhbGVydHMgaW4gdGhlaXIgQXRtb3NwaGVyZSAoT3BlblN0YWNrIG9uIEt1YmVybmV0ZXMpIGRlcGxveW1lbnQKICAgLSBQaGFzZSAyOiBEaWFnbm9zZWQgcm9vdCBjYXVzZSAoa3ZtNS9rdm02IHdpdGggaGlnaCBkaXNrIEkvTyBhbmQgbmV0d29yayBkcm9wcykKICAgLSBQaGFzZSAzOiBFdmFsdWF0ZWQgZXhpc3RpbmcgYWxlcnQgYXMgbm9pc3kgYW5kIG5vdCBTUkUtY29tcGxpYW50CiAgIC0gUGhhc2UgNDogQ3JlYXRlZCA0IG5ldyBTUkUtY29tcGxpYW50IEdvbGRwaW5nZXIgYWxlcnRzIGluIGdvbGRwaW5nZXIubGlic29ubmV0CiAgIC0gUGhhc2UgNTogQWRkZWQgcnVuYm9vayBkb2N1bWVudGF0aW9uLCB1cGRhdGVkIGFsZXJ0aW5nIGluc3RydWN0aW9ucwogICAtIFBoYXNlIDY6IFZlcmlmaWVkIFByb21RTCBleHByZXNzaW9ucyBhZ2FpbnN0IGxpdmUgUHJvbWV0aGV1cwogICAtIFBoYXNlIDc6IEZ1bGwgYXVkaXQgcGFzcyAtIGFsbCBjaGVja3MgZ3JlZW4KICAgLSBQaGFzZSA4OiBXcml0aW5nIFByb21RTCB1bml0IHRlc3RzIGluIHRlc3RzLnltbCAoQ1VSUkVOVCAtIGFjdGl2ZWx5IGRlYnVnZ2luZykKCjIuICoqSW50ZW50IE1hcHBpbmcqKjoKICAgLSBVc2VyJ3MgZmluYWwgcmVxdWVzdDogIkNhbiB5b3UgbG9vayBhdCBob3cgdGhlIHByb21xbCB1bml0IHRlc3RzIGFyZSB3cml0dGVuIGluIHRlc3RzLnltbCBhbmQgdXBkYXRlIHRoZSBydWxlcyBmaWxlIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGNyZWF0ZXMgYWxlcnQgcnVsZXMgZm9yIGFsbCB0aGUgYWxlcnRzIHRoYXQgaXQgY3JlYXRlcyB0byBtYWtlIHN1cmUgdGhhdCB0aGV5IGFyZSBwcm9wZXJseSB0ZXN0ZWQsIGFuZCBydW4gQ0dPX0VOQUJMRUQ9MCBnbyB0ZXN0IC4vcm9sZXMva3ViZV9wcm9tZXRoZXVzX3N0YWNrIHRvIHRlc3QgaXQiCiAgIC0gVXNlcidzIGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb24gZHVyaW5nIHRlc3Qgd3JpdGluZzogIkdldCBtZXRyaWNzIGZyb20gdGhlIGN1cnJlbnQgY2xvdWQgYW5kIG1ha2UgcXVlcmllcyB0byBiZSBhYmxlIHRvIGdldCB2YWx1ZXMgYW5kIHJlYWwgbGFiZWxzIgogICAtIFVzZXIncyB0aXA6ICJZb3UgY291bGQgdXNlIHRoaXM6IGt1YmVjdGwgLW4gbW9uaXRvcmluZyBleGVjIC1pdCBzdmMva3ViZS1wcm9tZXRoZXVzLXN0YWNrLXByb21ldGhldXMgLS0gcHJvbXRvb2wgcXVlcnkiIGZvciBmYXN0ZXIgbWV0cmljIHF1ZXJpZXMKCjMuICoqVGVjaG5pY2FsIEludmVudG9yeSoqOgogICAtIFByb21ldGhldXMsIEdvbGRwaW5nZXIsIEpzb25uZXQsIEdvIHRlc3RpbmcsIHByb210b29sCiAgIC0gUmVhbCBsZSBidWNrZXQgdmFsdWVzOiAwLjAwNSwgMC4wMSwgMC4wMjUsIDAuMDUsIDAuMSwgMC4yNSwgMC41LCAxLCAyLjUsIDUsIDEwLCAzMCwgK0luZgogICAtIFJlYWwgbGFiZWxzOiBpbnN0YW5jZSwgZ29sZHBpbmdlcl9pbnN0YW5jZSwgam9iPSJnb2xkcGluZ2VyIiwgY2FsbF90eXBlPSJwaW5nIiwgaG9zdF9pcCwgcG9kX2lwLCBsZSwgc3RhdHVzLCB0eXBlLCBhY3Rpb24sIGdyb3VwCiAgIC0gUmVhbCBob3N0IElQcyBmcm9tIGNsdXN0ZXIgKGUuZy4sIDEwLjEwMS41LjExNSwgMTAuMTAxLjUuMTE2LCAxMC4xMDEuNS4xMjAsIGV0Yy4pCiAgIC0gMjEgR29sZHBpbmdlciBub2RlczogY3RsMS0zLCBrdm0xLTE1LCBudm1lMS0zCgo0LiAqKkNvZGUgQXJjaGFlb2xvZ3kqKjoKICAgLSBgdGVzdHMueW1sYCAtIG1haW4gZmlsZSBiZWluZyBtb2RpZmllZCB3aXRoIDggbmV3IHRlc3QgY2FzZXMgKDIgcGVyIGFsZXJ0IMOXIDQgYWxlcnRzKQogICAtIGBnb2xkcGluZ2VyLmxpYnNvbm5ldGAgLSB0aGUgNCBhbGVydCBkZWZpbml0aW9ucwogICAtIGBydWxlc190ZXN0LmdvYCAtIEdvIHRlc3QgaGFybmVzcyB0aGF0IHJ1bnMgcHJvbXRvb2wgYWdhaW5zdCBnZW5lcmF0ZWQgcnVsZXMKCjUuICoqUHJvZ3Jlc3MgQXNzZXNzbWVudCoqOgogICAtIEdvbGRwaW5nZXJIaWdoVW5oZWFsdGh5UmF0aW86IEJvdGggdGVzdHMgUEFTUyDinJMKICAgLSBHb2xkcGluZ2VyTm9kZVVucmVhY2hhYmxlOiAic2hvdWxkIE5PVCBmaXJlIiBQQVNTRVMsICJzaG91bGQgZmlyZSIgRkFJTFMgLSB2ZWN0b3IgbWF0Y2hpbmcgaXNzdWUgd2l0aCBgY291bnQgYnkgKGhvc3RfaXApIC8gY291bnQoc2NhbGFyKWAKICAgLSBHb2xkcGluZ2VySGlnaFBlZXJMYXRlbmN5OiAic2hvdWxkIE5PVCBmaXJlIiBQQVNTRVMsICJzaG91bGQgZmlyZSIgRkFJTFMgLSBqdXN0IG1pc3NpbmcgZGVzY3JpcHRpb24gYW5ub3RhdGlvbiBpbiBleHBlY3RlZCBvdXRwdXQgKGV4cHJlc3Npb24gaXRzZWxmIHdvcmtzIGNvcnJlY3RseSwgdmFsdWU9OTc1bXMpCiAgIC0gR29sZHBpbmdlckhpZ2hFcnJvclJhdGU6ICJzaG91bGQgTk9UIGZpcmUiIFBBU1NFUywgInNob3VsZCBmaXJlIiBGQUlMUyAtIGp1c3QgbWlzc2luZyBkZXNjcmlwdGlvbiBhbm5vdGF0aW9uIGluIGV4cGVjdGVkIG91dHB1dCAoZXhwcmVzc2lvbiBpdHNlbGYgd29ya3MgY29ycmVjdGx5LCB2YWx1ZT0xMCUpCgo2LiAqKkNvbnRleHQgVmFsaWRhdGlvbioqOiBUaGUgY3JpdGljYWwgZGVidWdnaW5nIGNvbnRleHQgaXMgdGhhdCB0aGUgR29sZHBpbmdlck5vZGVVbnJlYWNoYWJsZSBhbGVydCBleHByZXNzaW9uIGhhcyBhIHZlY3RvciBtYXRjaGluZyBwcm9ibGVtIGluIHByb210b29sIHVuaXQgdGVzdHMuIFRoZSBgY291bnQgYnkgKGhvc3RfaXApKC4uLilgIHJldHVybnMgYHtob3N0X2lwPSIxMC4xMDEuNS4xMjAifSAyYCBhbmQgYGNvdW50KGdvbGRwaW5nZXJfY2x1c3Rlcl9oZWFsdGhfdG90YWwpYCByZXR1cm5zIGB7fSAyYCwgYnV0IGRpdmlkaW5nIHRoZW0gcmV0dXJucyBuaWwgYmVjYXVzZSBQcm9tZXRoZXVzIHZlY3RvciBtYXRjaGluZyByZXF1aXJlcyBtYXRjaGluZyBsYWJlbCBzZXRzIGZvciBiaW5hcnkgb3BlcmF0aW9ucyBiZXR3ZWVuIHZlY3RvcnMuCgo3LiAqKlJlY2VudCBDb21tYW5kcyBBbmFseXNpcyoqOgogICAtIE11bHRpcGxlIGRlYnVnIHByb210b29sIHRlc3QgcnVucyBjb25maXJtaW5nIHRoZSB2ZWN0b3IgbWF0Y2hpbmcgaXNzdWUKICAgLSBUaGUgZmluYWwgZGVidWcgdGVzdCBleHBsaWNpdGx5IHByb3ZlZDogYGNvdW50IGJ5IChob3N0X2lwKSguLi4pIC8gY291bnQoZ29sZHBpbmdlcl9jbHVzdGVyX2hlYWx0aF90b3RhbClgIHJldHVybnMgbmlsIGV2ZW4gdGhvdWdoIGJvdGggc2lkZXMgaGF2ZSB2YWxpZCB2YWx1ZXMsIGJlY2F1c2Ugb25lIGhhcyBge2hvc3RfaXA9IjEwLjEwMS41LjEyMCJ9YCBhbmQgdGhlIG90aGVyIGhhcyBge31gIC0gdGhleSBjYW4ndCBtYXRjaAogICAtIFRoaXMgaXMgdGhlIGNvcmUgYnVnIGJlaW5nIGRlYnVnZ2VkIHdoZW4gc3VtbWFyaXphdGlvbiB0cmlnZ2VyZWQKPC9hbmFseXNpcz4KCjxzdW1tYXJ5PgoxLiBDb252ZXJzYXRpb24gT3ZlcnZpZXc6CiAgIC0gUHJpbWFyeSBPYmplY3RpdmVzOiBVc2VyIGFza2VkIHRvIGludmVzdGlnYXRlIHJlY3VycmluZyBHb2xkcGluZ2VyIGFsZXJ0cywgZGlhZ25vc2Ugcm9vdCBjYXVzZSwgcmVwbGFjZSBub2lzeSBhbGVydHMgd2l0aCBTUkUtY29tcGxpYW50IG9uZXMsIGNyZWF0ZSBydW5ib29rIGRvY3VtZW50YXRpb24sIGFuZCB3cml0ZSBjb21wcmVoZW5zaXZlIFByb21RTCB1bml0IHRlc3RzLiBMYXRlc3QgcmVxdWVzdDogIkNhbiB5b3UgbG9vayBhdCBob3cgdGhlIHByb21xbCB1bml0IHRlc3RzIGFyZSB3cml0dGVuIGluIC9ob21lL21uYXNlci9zcmMvZ2l0aHViLmNvbS92ZXh4aG9zdC9hdG1vc3BoZXJlL3JvbGVzL2t1YmVfcHJvbWV0aGV1c19zdGFjay9maWxlcy9qc29ubmV0L3Rlc3RzLnltbCBhbmQgdXBkYXRlIHRoZSBydWxlcyBmaWxlIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGNyZWF0ZXMgYWxlcnQgcnVsZXMgZm9yIGFsbCB0aGUgYWxlcnRzIHRoYXQgaXQgY3JlYXRlcyB0byBtYWtlIHN1cmUgdGhhdCB0aGV5IGFyZSBwcm9wZXJseSB0ZXN0ZWQsIGFuZCBydW4gQ0dPX0VOQUJMRUQ9MCBnbyB0ZXN0IC4vcm9sZXMva3ViZV9wcm9tZXRoZXVzX3N0YWNrIHRvIHRlc3QgaXQiCiAgIC0gU2Vzc2lvbiBDb250ZXh0OiBEaWFnbm9zZWQga3ZtNS9rdm02IGFzIHByb2JsZW1hdGljIG5vZGVzLCByZXBsYWNlZCBzaW5nbGUgbm9pc3kgYEdvbGRwaW5nZXJOb2Rlc1VuaGVhbHRoeWAgYWxlcnQgd2l0aCA0IFNSRS1jb21wbGlhbnQgYWxlcnRzLCBhZGRlZCBkb2N1bWVudGF0aW9uLCBhbmQgbm93IHdyaXRpbmcvZGVidWdnaW5nIHVuaXQgdGVzdHMuIFVzZXIgYWRkaXRpb25hbGx5IGluc3RydWN0ZWQ6ICJHZXQgbWV0cmljcyBmcm9tIHRoZSBjdXJyZW50IGNsb3VkIGFuZCBtYWtlIHF1ZXJpZXMgdG8gYmUgYWJsZSB0byBnZXQgdmFsdWVzIGFuZCByZWFsIGxhYmVscyIgYW5kIHN1Z2dlc3RlZCB1c2luZyBga3ViZWN0bCAtbiBtb25pdG9yaW5nIGV4ZWMgc3ZjL2t1YmUtcHJvbWV0aGV1cy1zdGFjay1wcm9tZXRoZXVzIC0tIHByb210b29sIHF1ZXJ5IGluc3RhbnQgaHR0cDovL2xvY2FsaG9zdDo5MDkwYCBmb3IgZmFzdGVyIHF1ZXJpZXMuCiAgIC0gVXNlciBJbnRlbnQgRXZvbHV0aW9uOiBTdGFydGVkIHdpdGggYWxlcnQgaW52ZXN0aWdhdGlvbiDihpIgYWxlcnQgcXVhbGl0eSBldmFsdWF0aW9uIOKGkiBuZXcgYWxlcnQgY3JlYXRpb24g4oaSIGRvY3VtZW50YXRpb24g4oaSIHRlc3Rpbmcgd2l0aCByZWFsIGRhdGEKCjIuIFRlY2huaWNhbCBGb3VuZGF0aW9uOgogICAtIEF0bW9zcGhlcmU6IE9wZW5TdGFjayBvbiBLdWJlcm5ldGVzIGRlcGxveW1lbnQgKFZFWFhIT1NUKQogICAtIFByb21ldGhldXM6IFJ1bm5pbmcgaW4gYG1vbml0b3JpbmdgIG5hbWVzcGFjZSBhcyBgc3ZjL2t1YmUtcHJvbWV0aGV1cy1zdGFjay1wcm9tZXRoZXVzYCBvbiBwb3J0IDkwOTAKICAgLSBHb2xkcGluZ2VyOiBDbHVzdGVyIG1lc2ggY29ubmVjdGl2aS4uLgoKPC9kZXRhaWxzPgoKCgo8IS0tIFNUQVJUIENPUElMT1QgQ09ESU5HIEFHRU5UIFNVRkZJWCAtLT4KCkNyZWF0ZWQgZnJvbSBDb3BpbG90IENMSSB2aWEgdGhlIGNvcGlsb3QgZGVsZWdhdGUgY29tbWFuZC4KCjwhLS0gU1RBUlQgQ09QSUxPVCBDT0RJTkcgQUdFTlQgVElQUyAtLT4KLS0tCgrwn5KsIFdlJ2QgbG92ZSB5b3VyIGlucHV0ISBTaGFyZSB5b3VyIHRob3VnaHRzIG9uIENvcGlsb3QgY29kaW5nIGFnZW50IGluIG91ciBbMiBtaW51dGUgc3VydmV5XShodHRwczovL2doLmlvL2NvcGlsb3QtY29kaW5nLWFnZW50LXN1cnZleSkuCg==
      patchset: 5f5a5d743570e53b3a1b0362d1f14a33093cb51c
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/vexxhost.dev/zuul-config:
            canonical_name: vexxhost.dev/zuul-config
            checkout: main
            commit: 9052b5a7781b3346e4cffd452a54448cbff54d8b
          trusted/project_1/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: d73b78cc624f363c6b7fcfe833f2db4571e4e979
          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/vexxhost.dev/zuul-config:
            canonical_name: vexxhost.dev/zuul-config
            checkout: main
            commit: 9052b5a7781b3346e4cffd452a54448cbff54d8b
          untrusted/project_2/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: d73b78cc624f363c6b7fcfe833f2db4571e4e979
          untrusted/project_3/github.com/vexxhost/atmosphere:
            canonical_name: github.com/vexxhost/atmosphere
            checkout: main
            commit: 00d162f312334613cca02d5ed5a04b1c742e8250
          untrusted/project_4/opendev.org/openstack/openstack-helm:
            canonical_name: opendev.org/openstack/openstack-helm
            checkout: master
            commit: 3a57ef7049b4b76a5a29f8331975931464a14d51
        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_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: 00d162f312334613cca02d5ed5a04b1c742e8250
          name: vexxhost/atmosphere
          required: false
          short_name: atmosphere
          src_dir: src/github.com/vexxhost/atmosphere
      ref: refs/pull/3542/head
      resources: {}
      tenant: oss
      timeout: 1800
      topic: null
      voting: true
