all:
  children:
    computes:
      hosts:
        compute-0: null
        compute-1: null
    ocps:
      hosts:
        crc: null
    zuul_unreachable:
      hosts: {}
  hosts:
    compute-0:
      ansible_connection: ssh
      ansible_host: 38.102.83.166
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      ca_cert_approver: true
      cifmw_artifacts_crc_sshkey: ~/.ssh/id_cifw
      cifmw_build_images_output: {}
      cifmw_dlrn_report_result: false
      cifmw_edpm_telemetry_enabled_exporters:
      - podman_exporter
      - openstack_network_exporter
      cifmw_extras:
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/ci-framework''].
        src_dir }}/scenarios/centos-9/multinode-ci.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/scenarios/edpm.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/tests/watcher-tempest.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/tests/watcher-tempest-nfs.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/scenarios/nfs.yml'
      cifmw_openshift_api: api.crc.testing:6443
      cifmw_openshift_kubeconfig: '{{ ansible_user_dir }}/.crc/machines/crc/kubeconfig'
      cifmw_openshift_password: '123456789'
      cifmw_openshift_skip_tls_verify: true
      cifmw_openshift_user: kubeadmin
      cifmw_operator_build_output:
        operators:
          openstack-operator:
            git_commit_hash: d10499aaf62589e5766553be12c3784f51142e20
            git_src_dir: /home/zuul-worker/src/github.com/openstack-k8s-operators/openstack-operator
            image: 38.102.83.110:5001/openstack-k8s-operators/openstack-operator:d10499aaf62589e5766553be12c3784f51142e20
            image_bundle: 38.102.83.110:5001/openstack-k8s-operators/openstack-operator-bundle:d10499aaf62589e5766553be12c3784f51142e20
            image_catalog: 38.102.83.110:5001/openstack-k8s-operators/openstack-operator-index:d10499aaf62589e5766553be12c3784f51142e20
          watcher-operator:
            git_commit_hash: d9d7f10ace025d42d066d7d36b1c37277ef9b85e
            git_src_dir: /home/zuul-worker/src/github.com/openstack-k8s-operators/watcher-operator
            image: 38.102.83.110:5001/openstack-k8s-operators/watcher-operator:d9d7f10ace025d42d066d7d36b1c37277ef9b85e
            image_bundle: 38.102.83.110:5001/openstack-k8s-operators/watcher-operator-bundle:d9d7f10ace025d42d066d7d36b1c37277ef9b85e
            image_catalog: 38.102.83.110:5001/openstack-k8s-operators/watcher-operator-index:d9d7f10ace025d42d066d7d36b1c37277ef9b85e
      cifmw_repo_setup_branch: master
      cifmw_test_operator_tempest_image_tag: watcher_latest
      cifmw_update_containers_openstack: true
      cifmw_update_containers_org: podified-master-centos10
      cifmw_update_containers_watcher: true
      cifmw_use_libvirt: false
      cifmw_zuul_target_host: controller
      content_provider_dlrn_md5_hash: ''
      content_provider_gating_repo_available: true
      content_provider_gating_repo_url: http://38.102.83.110:8766
      content_provider_os_registry_namespace: podified-master-centos10
      content_provider_os_registry_url: 38.102.83.110:5001/podified-master-centos10
      content_provider_registry_available: true
      content_provider_registry_ip: 38.102.83.110
      content_provider_registry_ip_port: 38.102.83.110:5001
      crc_ci_bootstrap_cloud_name: '{{ nodepool.cloud | replace(''-nodepool-tripleo'','''')
        }}'
      crc_ci_bootstrap_networking:
        instances:
          compute-0:
            networks:
              default:
                ip: 192.168.122.100
              internal-api:
                config_nm: false
                ip: 172.17.0.100
              storage:
                config_nm: false
                ip: 172.18.0.100
              tenant:
                config_nm: false
                ip: 172.19.0.100
          compute-1:
            networks:
              default:
                ip: 192.168.122.101
              internal-api:
                config_nm: false
                ip: 172.17.0.101
              storage:
                config_nm: false
                ip: 172.18.0.101
              tenant:
                config_nm: false
                ip: 172.19.0.101
          controller:
            networks:
              default:
                ip: 192.168.122.11
          crc:
            networks:
              default:
                ip: 192.168.122.10
              internal-api:
                ip: 172.17.0.5
              storage:
                ip: 172.18.0.5
              tenant:
                ip: 172.19.0.5
        networks:
          default:
            mtu: '{{ (''ibm'' in nodepool.cloud) | ternary(''1440'', ''1500'') }}'
            range: 192.168.122.0/24
            router_net: ''
            transparent: true
          internal-api:
            range: 172.17.0.0/24
            vlan: 20
          storage:
            range: 172.18.0.0/24
            vlan: 21
          tenant:
            range: 172.19.0.0/24
            vlan: 22
      enable_ramdisk: true
      fetch_dlrn_hash: false
      max_retries: 60
      nodepool:
        az: nova
        cloud: vexxhost-nodepool-tripleo
        external_id: 09f91200-221a-4873-b616-154b32c6106d
        host_id: 5519e7a0ee5dc826795d295efc9c908d171b61deb9bf71b1016f861f
        interface_ip: 38.102.83.166
        label: cloud-centos-9-stream-tripleo-vexxhost
        private_ipv4: 38.102.83.166
        private_ipv6: null
        provider: vexxhost-nodepool-tripleo
        public_ipv4: 38.102.83.166
        public_ipv6: ''
        region: RegionOne
        slot: null
      push_registry: quay.rdoproject.org
      quay_login_secret_name: quay_nextgen_zuulgithubci
      registry_login_enabled: true
      retry_delay: 15
      watcher_registry_url: '{{ content_provider_os_registry_url }}'
      watcher_scenario: edpm
      watcher_services_tag: watcher_latest
      zuul_log_collection: false
    compute-1:
      ansible_connection: ssh
      ansible_host: 38.102.83.223
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      ca_cert_approver: true
      cifmw_artifacts_crc_sshkey: ~/.ssh/id_cifw
      cifmw_build_images_output: {}
      cifmw_dlrn_report_result: false
      cifmw_edpm_telemetry_enabled_exporters:
      - podman_exporter
      - openstack_network_exporter
      cifmw_extras:
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/ci-framework''].
        src_dir }}/scenarios/centos-9/multinode-ci.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/scenarios/edpm.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/tests/watcher-tempest.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/tests/watcher-tempest-nfs.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/scenarios/nfs.yml'
      cifmw_openshift_api: api.crc.testing:6443
      cifmw_openshift_kubeconfig: '{{ ansible_user_dir }}/.crc/machines/crc/kubeconfig'
      cifmw_openshift_password: '123456789'
      cifmw_openshift_skip_tls_verify: true
      cifmw_openshift_user: kubeadmin
      cifmw_operator_build_output:
        operators:
          openstack-operator:
            git_commit_hash: d10499aaf62589e5766553be12c3784f51142e20
            git_src_dir: /home/zuul-worker/src/github.com/openstack-k8s-operators/openstack-operator
            image: 38.102.83.110:5001/openstack-k8s-operators/openstack-operator:d10499aaf62589e5766553be12c3784f51142e20
            image_bundle: 38.102.83.110:5001/openstack-k8s-operators/openstack-operator-bundle:d10499aaf62589e5766553be12c3784f51142e20
            image_catalog: 38.102.83.110:5001/openstack-k8s-operators/openstack-operator-index:d10499aaf62589e5766553be12c3784f51142e20
          watcher-operator:
            git_commit_hash: d9d7f10ace025d42d066d7d36b1c37277ef9b85e
            git_src_dir: /home/zuul-worker/src/github.com/openstack-k8s-operators/watcher-operator
            image: 38.102.83.110:5001/openstack-k8s-operators/watcher-operator:d9d7f10ace025d42d066d7d36b1c37277ef9b85e
            image_bundle: 38.102.83.110:5001/openstack-k8s-operators/watcher-operator-bundle:d9d7f10ace025d42d066d7d36b1c37277ef9b85e
            image_catalog: 38.102.83.110:5001/openstack-k8s-operators/watcher-operator-index:d9d7f10ace025d42d066d7d36b1c37277ef9b85e
      cifmw_repo_setup_branch: master
      cifmw_test_operator_tempest_image_tag: watcher_latest
      cifmw_update_containers_openstack: true
      cifmw_update_containers_org: podified-master-centos10
      cifmw_update_containers_watcher: true
      cifmw_use_libvirt: false
      cifmw_zuul_target_host: controller
      content_provider_dlrn_md5_hash: ''
      content_provider_gating_repo_available: true
      content_provider_gating_repo_url: http://38.102.83.110:8766
      content_provider_os_registry_namespace: podified-master-centos10
      content_provider_os_registry_url: 38.102.83.110:5001/podified-master-centos10
      content_provider_registry_available: true
      content_provider_registry_ip: 38.102.83.110
      content_provider_registry_ip_port: 38.102.83.110:5001
      crc_ci_bootstrap_cloud_name: '{{ nodepool.cloud | replace(''-nodepool-tripleo'','''')
        }}'
      crc_ci_bootstrap_networking:
        instances:
          compute-0:
            networks:
              default:
                ip: 192.168.122.100
              internal-api:
                config_nm: false
                ip: 172.17.0.100
              storage:
                config_nm: false
                ip: 172.18.0.100
              tenant:
                config_nm: false
                ip: 172.19.0.100
          compute-1:
            networks:
              default:
                ip: 192.168.122.101
              internal-api:
                config_nm: false
                ip: 172.17.0.101
              storage:
                config_nm: false
                ip: 172.18.0.101
              tenant:
                config_nm: false
                ip: 172.19.0.101
          controller:
            networks:
              default:
                ip: 192.168.122.11
          crc:
            networks:
              default:
                ip: 192.168.122.10
              internal-api:
                ip: 172.17.0.5
              storage:
                ip: 172.18.0.5
              tenant:
                ip: 172.19.0.5
        networks:
          default:
            mtu: '{{ (''ibm'' in nodepool.cloud) | ternary(''1440'', ''1500'') }}'
            range: 192.168.122.0/24
            router_net: ''
            transparent: true
          internal-api:
            range: 172.17.0.0/24
            vlan: 20
          storage:
            range: 172.18.0.0/24
            vlan: 21
          tenant:
            range: 172.19.0.0/24
            vlan: 22
      enable_ramdisk: true
      fetch_dlrn_hash: false
      max_retries: 60
      nodepool:
        az: nova
        cloud: vexxhost-nodepool-tripleo
        external_id: 10472232-682b-4b1f-93de-58ed162187b0
        host_id: 5519e7a0ee5dc826795d295efc9c908d171b61deb9bf71b1016f861f
        interface_ip: 38.102.83.223
        label: cloud-centos-9-stream-tripleo-vexxhost
        private_ipv4: 38.102.83.223
        private_ipv6: null
        provider: vexxhost-nodepool-tripleo
        public_ipv4: 38.102.83.223
        public_ipv6: ''
        region: RegionOne
        slot: null
      push_registry: quay.rdoproject.org
      quay_login_secret_name: quay_nextgen_zuulgithubci
      registry_login_enabled: true
      retry_delay: 15
      watcher_registry_url: '{{ content_provider_os_registry_url }}'
      watcher_scenario: edpm
      watcher_services_tag: watcher_latest
      zuul_log_collection: false
    controller:
      ansible_connection: ssh
      ansible_host: 38.102.83.146
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      ca_cert_approver: true
      cifmw_artifacts_crc_sshkey: ~/.ssh/id_cifw
      cifmw_build_images_output: {}
      cifmw_dlrn_report_result: false
      cifmw_edpm_telemetry_enabled_exporters:
      - podman_exporter
      - openstack_network_exporter
      cifmw_extras:
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/ci-framework''].
        src_dir }}/scenarios/centos-9/multinode-ci.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/scenarios/edpm.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/tests/watcher-tempest.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/tests/watcher-tempest-nfs.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/scenarios/nfs.yml'
      cifmw_openshift_api: api.crc.testing:6443
      cifmw_openshift_kubeconfig: '{{ ansible_user_dir }}/.crc/machines/crc/kubeconfig'
      cifmw_openshift_password: '123456789'
      cifmw_openshift_skip_tls_verify: true
      cifmw_openshift_user: kubeadmin
      cifmw_operator_build_output:
        operators:
          openstack-operator:
            git_commit_hash: d10499aaf62589e5766553be12c3784f51142e20
            git_src_dir: /home/zuul-worker/src/github.com/openstack-k8s-operators/openstack-operator
            image: 38.102.83.110:5001/openstack-k8s-operators/openstack-operator:d10499aaf62589e5766553be12c3784f51142e20
            image_bundle: 38.102.83.110:5001/openstack-k8s-operators/openstack-operator-bundle:d10499aaf62589e5766553be12c3784f51142e20
            image_catalog: 38.102.83.110:5001/openstack-k8s-operators/openstack-operator-index:d10499aaf62589e5766553be12c3784f51142e20
          watcher-operator:
            git_commit_hash: d9d7f10ace025d42d066d7d36b1c37277ef9b85e
            git_src_dir: /home/zuul-worker/src/github.com/openstack-k8s-operators/watcher-operator
            image: 38.102.83.110:5001/openstack-k8s-operators/watcher-operator:d9d7f10ace025d42d066d7d36b1c37277ef9b85e
            image_bundle: 38.102.83.110:5001/openstack-k8s-operators/watcher-operator-bundle:d9d7f10ace025d42d066d7d36b1c37277ef9b85e
            image_catalog: 38.102.83.110:5001/openstack-k8s-operators/watcher-operator-index:d9d7f10ace025d42d066d7d36b1c37277ef9b85e
      cifmw_repo_setup_branch: master
      cifmw_test_operator_tempest_image_tag: watcher_latest
      cifmw_update_containers_openstack: true
      cifmw_update_containers_org: podified-master-centos10
      cifmw_update_containers_watcher: true
      cifmw_use_libvirt: false
      cifmw_zuul_target_host: controller
      content_provider_dlrn_md5_hash: ''
      content_provider_gating_repo_available: true
      content_provider_gating_repo_url: http://38.102.83.110:8766
      content_provider_os_registry_namespace: podified-master-centos10
      content_provider_os_registry_url: 38.102.83.110:5001/podified-master-centos10
      content_provider_registry_available: true
      content_provider_registry_ip: 38.102.83.110
      content_provider_registry_ip_port: 38.102.83.110:5001
      crc_ci_bootstrap_cloud_name: '{{ nodepool.cloud | replace(''-nodepool-tripleo'','''')
        }}'
      crc_ci_bootstrap_networking:
        instances:
          compute-0:
            networks:
              default:
                ip: 192.168.122.100
              internal-api:
                config_nm: false
                ip: 172.17.0.100
              storage:
                config_nm: false
                ip: 172.18.0.100
              tenant:
                config_nm: false
                ip: 172.19.0.100
          compute-1:
            networks:
              default:
                ip: 192.168.122.101
              internal-api:
                config_nm: false
                ip: 172.17.0.101
              storage:
                config_nm: false
                ip: 172.18.0.101
              tenant:
                config_nm: false
                ip: 172.19.0.101
          controller:
            networks:
              default:
                ip: 192.168.122.11
          crc:
            networks:
              default:
                ip: 192.168.122.10
              internal-api:
                ip: 172.17.0.5
              storage:
                ip: 172.18.0.5
              tenant:
                ip: 172.19.0.5
        networks:
          default:
            mtu: '{{ (''ibm'' in nodepool.cloud) | ternary(''1440'', ''1500'') }}'
            range: 192.168.122.0/24
            router_net: ''
            transparent: true
          internal-api:
            range: 172.17.0.0/24
            vlan: 20
          storage:
            range: 172.18.0.0/24
            vlan: 21
          tenant:
            range: 172.19.0.0/24
            vlan: 22
      enable_ramdisk: true
      fetch_dlrn_hash: false
      max_retries: 60
      nodepool:
        az: nova
        cloud: vexxhost-nodepool-tripleo
        external_id: 1c918908-4e5d-4607-bfc8-b0131fa17795
        host_id: d19710e37f7b2620eb9f1bc9cfdfc06732b1f0c31221781941dd4533
        interface_ip: 38.102.83.146
        label: cloud-centos-9-stream-tripleo-vexxhost-medium
        private_ipv4: 38.102.83.146
        private_ipv6: null
        provider: vexxhost-nodepool-tripleo
        public_ipv4: 38.102.83.146
        public_ipv6: ''
        region: RegionOne
        slot: null
      push_registry: quay.rdoproject.org
      quay_login_secret_name: quay_nextgen_zuulgithubci
      registry_login_enabled: true
      retry_delay: 15
      watcher_registry_url: '{{ content_provider_os_registry_url }}'
      watcher_scenario: edpm
      watcher_services_tag: watcher_latest
      zuul_log_collection: false
    crc:
      ansible_connection: ssh
      ansible_host: 38.129.56.71
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: core
      ca_cert_approver: true
      cifmw_artifacts_crc_sshkey: ~/.ssh/id_cifw
      cifmw_build_images_output: {}
      cifmw_dlrn_report_result: false
      cifmw_edpm_telemetry_enabled_exporters:
      - podman_exporter
      - openstack_network_exporter
      cifmw_extras:
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/ci-framework''].
        src_dir }}/scenarios/centos-9/multinode-ci.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/scenarios/edpm.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/tests/watcher-tempest.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/tests/watcher-tempest-nfs.yml'
      - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
        src_dir }}/ci/scenarios/nfs.yml'
      cifmw_openshift_api: api.crc.testing:6443
      cifmw_openshift_kubeconfig: '{{ ansible_user_dir }}/.crc/machines/crc/kubeconfig'
      cifmw_openshift_password: '123456789'
      cifmw_openshift_skip_tls_verify: true
      cifmw_openshift_user: kubeadmin
      cifmw_operator_build_output:
        operators:
          openstack-operator:
            git_commit_hash: d10499aaf62589e5766553be12c3784f51142e20
            git_src_dir: /home/zuul-worker/src/github.com/openstack-k8s-operators/openstack-operator
            image: 38.102.83.110:5001/openstack-k8s-operators/openstack-operator:d10499aaf62589e5766553be12c3784f51142e20
            image_bundle: 38.102.83.110:5001/openstack-k8s-operators/openstack-operator-bundle:d10499aaf62589e5766553be12c3784f51142e20
            image_catalog: 38.102.83.110:5001/openstack-k8s-operators/openstack-operator-index:d10499aaf62589e5766553be12c3784f51142e20
          watcher-operator:
            git_commit_hash: d9d7f10ace025d42d066d7d36b1c37277ef9b85e
            git_src_dir: /home/zuul-worker/src/github.com/openstack-k8s-operators/watcher-operator
            image: 38.102.83.110:5001/openstack-k8s-operators/watcher-operator:d9d7f10ace025d42d066d7d36b1c37277ef9b85e
            image_bundle: 38.102.83.110:5001/openstack-k8s-operators/watcher-operator-bundle:d9d7f10ace025d42d066d7d36b1c37277ef9b85e
            image_catalog: 38.102.83.110:5001/openstack-k8s-operators/watcher-operator-index:d9d7f10ace025d42d066d7d36b1c37277ef9b85e
      cifmw_repo_setup_branch: master
      cifmw_test_operator_tempest_image_tag: watcher_latest
      cifmw_update_containers_openstack: true
      cifmw_update_containers_org: podified-master-centos10
      cifmw_update_containers_watcher: true
      cifmw_use_libvirt: false
      cifmw_zuul_target_host: controller
      content_provider_dlrn_md5_hash: ''
      content_provider_gating_repo_available: true
      content_provider_gating_repo_url: http://38.102.83.110:8766
      content_provider_os_registry_namespace: podified-master-centos10
      content_provider_os_registry_url: 38.102.83.110:5001/podified-master-centos10
      content_provider_registry_available: true
      content_provider_registry_ip: 38.102.83.110
      content_provider_registry_ip_port: 38.102.83.110:5001
      crc_ci_bootstrap_cloud_name: '{{ nodepool.cloud | replace(''-nodepool-tripleo'','''')
        }}'
      crc_ci_bootstrap_networking:
        instances:
          compute-0:
            networks:
              default:
                ip: 192.168.122.100
              internal-api:
                config_nm: false
                ip: 172.17.0.100
              storage:
                config_nm: false
                ip: 172.18.0.100
              tenant:
                config_nm: false
                ip: 172.19.0.100
          compute-1:
            networks:
              default:
                ip: 192.168.122.101
              internal-api:
                config_nm: false
                ip: 172.17.0.101
              storage:
                config_nm: false
                ip: 172.18.0.101
              tenant:
                config_nm: false
                ip: 172.19.0.101
          controller:
            networks:
              default:
                ip: 192.168.122.11
          crc:
            networks:
              default:
                ip: 192.168.122.10
              internal-api:
                ip: 172.17.0.5
              storage:
                ip: 172.18.0.5
              tenant:
                ip: 172.19.0.5
        networks:
          default:
            mtu: '{{ (''ibm'' in nodepool.cloud) | ternary(''1440'', ''1500'') }}'
            range: 192.168.122.0/24
            router_net: ''
            transparent: true
          internal-api:
            range: 172.17.0.0/24
            vlan: 20
          storage:
            range: 172.18.0.0/24
            vlan: 21
          tenant:
            range: 172.19.0.0/24
            vlan: 22
      enable_ramdisk: true
      fetch_dlrn_hash: false
      max_retries: 60
      nodepool:
        az: nova
        cloud: vexxhost-nodepool-tripleo
        external_id: 4891c636-dd7d-42bd-b5a2-f8934586e626
        host_id: b012578aee5370fae73eb6c92c4679617335173cccca05390470f411
        interface_ip: 38.129.56.71
        label: crc-cloud-ocp-4-18-1-3xl
        private_ipv4: 38.129.56.71
        private_ipv6: null
        provider: vexxhost-nodepool-tripleo
        public_ipv4: 38.129.56.71
        public_ipv6: ''
        region: RegionOne
        slot: null
      push_registry: quay.rdoproject.org
      quay_login_secret_name: quay_nextgen_zuulgithubci
      registry_login_enabled: true
      retry_delay: 15
      watcher_registry_url: '{{ content_provider_os_registry_url }}'
      watcher_scenario: edpm
      watcher_services_tag: watcher_latest
      zuul_log_collection: false
  vars:
    ca_cert_approver: true
    cifmw_artifacts_crc_sshkey: ~/.ssh/id_cifw
    cifmw_build_images_output: {}
    cifmw_dlrn_report_result: false
    cifmw_edpm_telemetry_enabled_exporters:
    - podman_exporter
    - openstack_network_exporter
    cifmw_extras:
    - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/ci-framework''].
      src_dir }}/scenarios/centos-9/multinode-ci.yml'
    - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
      src_dir }}/ci/scenarios/edpm.yml'
    - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
      src_dir }}/ci/tests/watcher-tempest.yml'
    - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
      src_dir }}/ci/tests/watcher-tempest-nfs.yml'
    - '@{{ ansible_user_dir }}/{{ zuul.projects[''github.com/openstack-k8s-operators/watcher-operator''].
      src_dir }}/ci/scenarios/nfs.yml'
    cifmw_openshift_api: api.crc.testing:6443
    cifmw_openshift_kubeconfig: '{{ ansible_user_dir }}/.crc/machines/crc/kubeconfig'
    cifmw_openshift_password: '123456789'
    cifmw_openshift_skip_tls_verify: true
    cifmw_openshift_user: kubeadmin
    cifmw_operator_build_output:
      operators:
        openstack-operator:
          git_commit_hash: d10499aaf62589e5766553be12c3784f51142e20
          git_src_dir: /home/zuul-worker/src/github.com/openstack-k8s-operators/openstack-operator
          image: 38.102.83.110:5001/openstack-k8s-operators/openstack-operator:d10499aaf62589e5766553be12c3784f51142e20
          image_bundle: 38.102.83.110:5001/openstack-k8s-operators/openstack-operator-bundle:d10499aaf62589e5766553be12c3784f51142e20
          image_catalog: 38.102.83.110:5001/openstack-k8s-operators/openstack-operator-index:d10499aaf62589e5766553be12c3784f51142e20
        watcher-operator:
          git_commit_hash: d9d7f10ace025d42d066d7d36b1c37277ef9b85e
          git_src_dir: /home/zuul-worker/src/github.com/openstack-k8s-operators/watcher-operator
          image: 38.102.83.110:5001/openstack-k8s-operators/watcher-operator:d9d7f10ace025d42d066d7d36b1c37277ef9b85e
          image_bundle: 38.102.83.110:5001/openstack-k8s-operators/watcher-operator-bundle:d9d7f10ace025d42d066d7d36b1c37277ef9b85e
          image_catalog: 38.102.83.110:5001/openstack-k8s-operators/watcher-operator-index:d9d7f10ace025d42d066d7d36b1c37277ef9b85e
    cifmw_repo_setup_branch: master
    cifmw_test_operator_tempest_image_tag: watcher_latest
    cifmw_update_containers_openstack: true
    cifmw_update_containers_org: podified-master-centos10
    cifmw_update_containers_watcher: true
    cifmw_use_libvirt: false
    cifmw_zuul_target_host: controller
    content_provider_dlrn_md5_hash: ''
    content_provider_gating_repo_available: true
    content_provider_gating_repo_url: http://38.102.83.110:8766
    content_provider_os_registry_namespace: podified-master-centos10
    content_provider_os_registry_url: 38.102.83.110:5001/podified-master-centos10
    content_provider_registry_available: true
    content_provider_registry_ip: 38.102.83.110
    content_provider_registry_ip_port: 38.102.83.110:5001
    crc_ci_bootstrap_cloud_name: '{{ nodepool.cloud | replace(''-nodepool-tripleo'','''')
      }}'
    crc_ci_bootstrap_networking:
      instances:
        compute-0:
          networks:
            default:
              ip: 192.168.122.100
            internal-api:
              config_nm: false
              ip: 172.17.0.100
            storage:
              config_nm: false
              ip: 172.18.0.100
            tenant:
              config_nm: false
              ip: 172.19.0.100
        compute-1:
          networks:
            default:
              ip: 192.168.122.101
            internal-api:
              config_nm: false
              ip: 172.17.0.101
            storage:
              config_nm: false
              ip: 172.18.0.101
            tenant:
              config_nm: false
              ip: 172.19.0.101
        controller:
          networks:
            default:
              ip: 192.168.122.11
        crc:
          networks:
            default:
              ip: 192.168.122.10
            internal-api:
              ip: 172.17.0.5
            storage:
              ip: 172.18.0.5
            tenant:
              ip: 172.19.0.5
      networks:
        default:
          mtu: '{{ (''ibm'' in nodepool.cloud) | ternary(''1440'', ''1500'') }}'
          range: 192.168.122.0/24
          router_net: ''
          transparent: true
        internal-api:
          range: 172.17.0.0/24
          vlan: 20
        storage:
          range: 172.18.0.0/24
          vlan: 21
        tenant:
          range: 172.19.0.0/24
          vlan: 22
    enable_ramdisk: true
    fetch_dlrn_hash: false
    max_retries: 60
    push_registry: quay.rdoproject.org
    quay_login_secret_name: quay_nextgen_zuulgithubci
    registry_login_enabled: true
    retry_delay: 15
    watcher_registry_url: '{{ content_provider_os_registry_url }}'
    watcher_scenario: edpm
    watcher_services_tag: watcher_latest
    zuul:
      _inheritance_path:
      - '<Job base-minimal branches: None source: config/zuul.d/jobs.yaml@master#24>'
      - '<Job base-crc-cloud branches: None source: config/zuul.d/_jobs-crc.yaml@master#239>'
      - '<Job cifmw-podified-multinode-edpm-base-crc branches: None source: openstack-k8s-operators/ci-framework/zuul.d/base.yaml@main#125>'
      - '<Job podified-multinode-edpm-deployment-crc branches: None source: openstack-k8s-operators/ci-framework/zuul.d/edpm_multinode.yaml@main#317>'
      - '<Job podified-multinode-edpm-deployment-crc-2comp branches: None source:
        openstack-k8s-operators/ci-framework/zuul.d/edpm_multinode.yaml@main#2>'
      - '<Job watcher-operator-base branches: {MatchAny:{BranchMatcher:master},{BranchMatcher:main}}
        source: openstack-k8s-operators/watcher-operator/.zuul.yaml@main#15>'
      - '<Job watcher-operator-validation-base branches: {MatchAny:{BranchMatcher:master},{BranchMatcher:main}}
        source: openstack-k8s-operators/watcher-operator/.zuul.yaml@main#73>'
      - '<Job watcher-operator-validation-master branches: {MatchAny:{BranchMatcher:master},{BranchMatcher:main}}
        source: openstack-k8s-operators/watcher-operator/.zuul.yaml@main#245>'
      - '<Job watcher-operator-validation-master branches: {MatchAny:{BranchMatcher:master}}
        source: openstack-k8s-operators/watcher-operator/.zuul.yaml@main#319>'
      ansible_version: '8'
      attempts: 1
      branch: master
      build: 8595b66670db48918ef5885805cb4fcf
      build_refs:
      - branch: master
        change: '978309'
        change_message: "test: improve coverage to 100% on api, client, errors, exceptions\n\nAdd
          tests covering previously uncovered paths:\n\n- test_errors.py (new): handle_errors
          RuntimeError (no request arg),\n  explicit request_arg, _error_handle=False
          bypass, exception handler\n  body with horizon.exceptions.handle call and
          error_default return,\n  and _error_message/_error_redirect override kwargs.\n-
          test_watcher.py: Action.get, Action.delete, EfficacyIndicator.__init__\n
          \ (both populated and empty-dict variants), insert_watcher_policy_file\n
          \ (absent and already-registered branches), and id property on all six\n
          \ wrapper classes (Audit, AuditTemplate, ActionPlan, Action, Goal, Strategy).\n-
          test_client.py: WatcherClientFunctionTests exercises the real\n  watcherclient()
          body with all dependencies patched (default microversion\n  and explicit
          api_version); WatcherGetClientTests covers get_client()\n  with normal and
          SSL-overridden configs; WatcherExceptionsModuleTests\n  imports common.exceptions
          to exercise module-level constant bindings.\n\nCoverage on targeted modules:\n
          \ api/watcher.py        87% -> 100%\n  common/client.py      71% -> 100%\n
          \ common/exceptions.py   0% -> 100%\n  utils/errors.py       78% -> 100%\n
          \ Overall               79% -> 82%\n\nGenerated-By: claude-code sonnet 4.6\nChange-Id:
          Ie3a30ee0b4d3591a7bdad3f5f7bb744ceb559370\nSigned-off-by: Sean Mooney <work@seanmooney.info>\n"
        change_url: https://review.opendev.org/c/openstack/watcher-dashboard/+/978309
        commit_id: 1dd5fbf425bc742fb11a1c948cb6cbd0e0554340
        patchset: '3'
        project:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/watcher-dashboard
          name: openstack/watcher-dashboard
          short_name: watcher-dashboard
        src_dir: src/opendev.org/openstack/watcher-dashboard
        topic: service-layer-refactor
      buildset: 7744ab39ac064556a7e779f8c2219610
      buildset_refs:
      - branch: master
        change: '978309'
        change_message: "test: improve coverage to 100% on api, client, errors, exceptions\n\nAdd
          tests covering previously uncovered paths:\n\n- test_errors.py (new): handle_errors
          RuntimeError (no request arg),\n  explicit request_arg, _error_handle=False
          bypass, exception handler\n  body with horizon.exceptions.handle call and
          error_default return,\n  and _error_message/_error_redirect override kwargs.\n-
          test_watcher.py: Action.get, Action.delete, EfficacyIndicator.__init__\n
          \ (both populated and empty-dict variants), insert_watcher_policy_file\n
          \ (absent and already-registered branches), and id property on all six\n
          \ wrapper classes (Audit, AuditTemplate, ActionPlan, Action, Goal, Strategy).\n-
          test_client.py: WatcherClientFunctionTests exercises the real\n  watcherclient()
          body with all dependencies patched (default microversion\n  and explicit
          api_version); WatcherGetClientTests covers get_client()\n  with normal and
          SSL-overridden configs; WatcherExceptionsModuleTests\n  imports common.exceptions
          to exercise module-level constant bindings.\n\nCoverage on targeted modules:\n
          \ api/watcher.py        87% -> 100%\n  common/client.py      71% -> 100%\n
          \ common/exceptions.py   0% -> 100%\n  utils/errors.py       78% -> 100%\n
          \ Overall               79% -> 82%\n\nGenerated-By: claude-code sonnet 4.6\nChange-Id:
          Ie3a30ee0b4d3591a7bdad3f5f7bb744ceb559370\nSigned-off-by: Sean Mooney <work@seanmooney.info>\n"
        change_url: https://review.opendev.org/c/openstack/watcher-dashboard/+/978309
        commit_id: 1dd5fbf425bc742fb11a1c948cb6cbd0e0554340
        patchset: '3'
        project:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/watcher-dashboard
          name: openstack/watcher-dashboard
          short_name: watcher-dashboard
        src_dir: src/opendev.org/openstack/watcher-dashboard
        topic: service-layer-refactor
      change: '978309'
      change_message: "test: improve coverage to 100% on api, client, errors, exceptions\n\nAdd
        tests covering previously uncovered paths:\n\n- test_errors.py (new): handle_errors
        RuntimeError (no request arg),\n  explicit request_arg, _error_handle=False
        bypass, exception handler\n  body with horizon.exceptions.handle call and
        error_default return,\n  and _error_message/_error_redirect override kwargs.\n-
        test_watcher.py: Action.get, Action.delete, EfficacyIndicator.__init__\n  (both
        populated and empty-dict variants), insert_watcher_policy_file\n  (absent
        and already-registered branches), and id property on all six\n  wrapper classes
        (Audit, AuditTemplate, ActionPlan, Action, Goal, Strategy).\n- test_client.py:
        WatcherClientFunctionTests exercises the real\n  watcherclient() body with
        all dependencies patched (default microversion\n  and explicit api_version);
        WatcherGetClientTests covers get_client()\n  with normal and SSL-overridden
        configs; WatcherExceptionsModuleTests\n  imports common.exceptions to exercise
        module-level constant bindings.\n\nCoverage on targeted modules:\n  api/watcher.py
        \       87% -> 100%\n  common/client.py      71% -> 100%\n  common/exceptions.py
        \  0% -> 100%\n  utils/errors.py       78% -> 100%\n  Overall               79%
        -> 82%\n\nGenerated-By: claude-code sonnet 4.6\nChange-Id: Ie3a30ee0b4d3591a7bdad3f5f7bb744ceb559370\nSigned-off-by:
        Sean Mooney <work@seanmooney.info>\n"
      change_url: https://review.opendev.org/c/openstack/watcher-dashboard/+/978309
      child_jobs: []
      commit_id: 1dd5fbf425bc742fb11a1c948cb6cbd0e0554340
      event_id: 591725fb1c5f432dbab9591d7131a973
      executor:
        hostname: ze04.softwarefactory-project.io
        inventory_file: /var/lib/zuul/builds/8595b66670db48918ef5885805cb4fcf/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/8595b66670db48918ef5885805cb4fcf/work/logs
        result_data_file: /var/lib/zuul/builds/8595b66670db48918ef5885805cb4fcf/work/results.json
        src_root: /var/lib/zuul/builds/8595b66670db48918ef5885805cb4fcf/work/src
        work_root: /var/lib/zuul/builds/8595b66670db48918ef5885805cb4fcf/work
      items:
      - branch: master
        change: '978256'
        change_message: "ruff: Add isort config and fix per-file-ignores\n\nEnables
          ruff I-rules (import sorting) in pyproject.toml with:\n- section-order placing
          openstack-third-party between third-party and\n  first-party sections\n-
          force-single-line = true enforcing one import per line (H301)\n- force-sort-within-sections
          = true for H306-compatible ordering\n- known-first-party = [\"watcher_dashboard\"]\n\nAlso
          fixes two pre-existing linter config issues:\n- per-file-ignores path was
          watcher_dashboard/tests/* (directory does\n  not exist); corrected to watcher_dashboard/test/*\n-
          Add explicit F403/F405 ignore for test/settings.py which uses star\n  imports
          inherited from openstack_dashboard.test.settings\n\nAdds H306 to flake8
          ignore list: ruff I-rules now enforce import order\nwith correct handling
          of mixed import styles; flake8 H306 conflicts with\nruff when both from-style
          and bare-style imports of the same package are\npresent in the same file.\n\nActivating
          I-rules caused ruff --fix to auto-apply import ordering\nacross 37 files.
          All 50 unit tests pass; tox -e pep8 passes.\n\nAssisted-By: claude-code
          sonnet 4.6\nChange-Id: I086456f627c4d03af62ed0504a4ec61acb55a6d5\nSigned-off-by:
          Sean Mooney <work@seanmooney.info>\n"
        change_url: https://review.opendev.org/c/openstack/watcher-dashboard/+/978256
        commit_id: a37091dc88feecd16f9e3ea10b10e1c9474219f2
        patchset: '5'
        project:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/watcher-dashboard
          name: openstack/watcher-dashboard
          short_name: watcher-dashboard
          src_dir: src/opendev.org/openstack/watcher-dashboard
        topic: service-layer-refactor
      - branch: master
        change: '978258'
        change_message: "style: replace autopep8 with ruff-format; restrict hacking
          to H-rules\n\nRemove autopep8 from pre-commit; it is redundant now that
          ruff covers\nthe same PEP 8 formatting. Add ruff-format as the project formatter\nwith
          quote-style=preserve and space indentation (line-length inherited\nfrom
          [tool.ruff] at 79).\n\nRestrict hacking to H-prefix rules only (select=H)
          since ruff-check\nalready enforces E/W/F rules. Drop F405 and W504 from
          the [flake8]\nignore list \u2014 those rules are never reached when hacking
          only sees H.\n\nUpdate the contributor docs to name ruff-format as the formatter,\ndescribe
          the three-tool toolchain (ruff-format, ruff-check, hacking),\nand note that
          autopep8 has been removed.\n\nGenerated-By: claude-code sonnet 4.6\nChange-Id:
          I121b826b248b3683db7d185bcb9b34a960f99f38\nSigned-off-by: Sean Mooney <work@seanmooney.info>\n"
        change_url: https://review.opendev.org/c/openstack/watcher-dashboard/+/978258
        commit_id: 2442c365140114098fdc30a377529105014ec973
        patchset: '6'
        project:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/watcher-dashboard
          name: openstack/watcher-dashboard
          short_name: watcher-dashboard
          src_dir: src/opendev.org/openstack/watcher-dashboard
        topic: service-layer-refactor
      - branch: master
        change: '978257'
        change_message: 'test: Restructure test directory with unit/ and local_fixtures/


          Create test/unit/ subdirectory and move api_tests/ into it, establishing

          the layout required for Phase A3 unit tests. Add test/local_fixtures/

          package with ConfigMemoizedCache mixin to clear lru_cache state between

          tests, preventing cross-test pollution when config.py is introduced.


          Generated-By: claude-code sonnet 4.6

          Change-Id: I4c50e9c0ebe6d81f112a49d69fc7a66ddd04ed8a

          Signed-off-by: Sean Mooney <work@seanmooney.info>

          '
        change_url: https://review.opendev.org/c/openstack/watcher-dashboard/+/978257
        commit_id: 6971cd7afab1bdbaef4de5b272d6e5b0a194714b
        patchset: '5'
        project:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/watcher-dashboard
          name: openstack/watcher-dashboard
          short_name: watcher-dashboard
          src_dir: src/opendev.org/openstack/watcher-dashboard
        topic: service-layer-refactor
      - branch: master
        change: '978304'
        change_message: 'test: remove Selenium and integration tests


          Selenium''s deprecated API (removed in Selenium 4) caused SyntaxWarning

          noise on every test run. The integration tests require a live OpenStack

          environment and real browser, are excluded from CI via --exclude-tag

          integration, and were effectively dead weight.


          Remove watcher_dashboard/test/selenium.py,

          watcher_dashboard/test/integration_tests/, the selenium/xvfbwrapper

          deps from test-requirements.txt, the warnings.filterwarnings() shim

          from test settings, and all Selenium option handling from run_tests.sh

          and installation docs.


          Generated-By: claude-code sonnet 4.6

          Change-Id: I90f0e4cd849a06dc3c19649281cd56a58d751df0

          Signed-off-by: Sean Mooney <work@seanmooney.info>

          '
        change_url: https://review.opendev.org/c/openstack/watcher-dashboard/+/978304
        commit_id: fda67923d3bf463212c470060803ebeda521a094
        patchset: '4'
        project:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/watcher-dashboard
          name: openstack/watcher-dashboard
          short_name: watcher-dashboard
          src_dir: src/opendev.org/openstack/watcher-dashboard
        topic: service-layer-refactor
      - branch: master
        change: '978303'
        change_message: "test: strengthen error-path tests and suppress log noise\n\n-
          Wrap error-path HTTP calls with assertLogs() so the test both\n  suppresses
          the ERROR output and asserts the log was emitted\n- Add assertEqual(status_code,
          200) to list-unavailable tests to\n  confirm the page still renders after
          the exception is handled\n- Fix goals IndexView.get_data() missing LOG.exception()
          before\n  horizon.exceptions.handle() (inconsistent with audit_templates\n
          \ and strategies; also required for assertLogs to fire)\n- Fix goals DetailView.get_efficacy_specification_data()
          typo:\n  efficacy_specification \u2192 efficacy_specifications (attribute
          name\n  on Goal._attrs), silencing a spurious ERROR log in test_details\n-
          Remove stale LOG.info(self.kwargs) debug line from\n  audit_templates DetailView._get_data()\n-
          Suppress root-logger WARNING from openstack_dashboard's\n  update_dashboards()
          deprecation notice by setting root logger\n  level to ERROR before the star
          imports in test/settings.py\n\nGenerated-By: claude-code sonnet 4.6\nChange-Id:
          I4c15259683e4fcefb67c2ae6fc778530f972e40a\nSigned-off-by: Sean Mooney <work@seanmooney.info>\n"
        change_url: https://review.opendev.org/c/openstack/watcher-dashboard/+/978303
        commit_id: 40f34ec36476dfcc1ba82ad388b2eea6f702c1af
        patchset: '4'
        project:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/watcher-dashboard
          name: openstack/watcher-dashboard
          short_name: watcher-dashboard
          src_dir: src/opendev.org/openstack/watcher-dashboard
        topic: service-layer-refactor
      - branch: master
        change: '978305'
        change_message: 'test: fix efficacy_specifications fixture to be a list


          The goal fixture stored a bare EfficacyIndicatorSpec object under

          efficacy_specifications. The view iterates over it, which triggers

          APIDictWrapper.__getitem__ with integer indices and logs a spurious

          ERROR on every detail-view test run. Wrap each spec in a list to match

          the real Watcher API shape.


          Generated-By: claude-code sonnet 4.6

          Change-Id: I6fbab1bf2fa0cc4d99133b350dc112b1bfb59655

          Signed-off-by: Sean Mooney <work@seanmooney.info>

          '
        change_url: https://review.opendev.org/c/openstack/watcher-dashboard/+/978305
        commit_id: cf41e8fc29fee44875218b4407d3ca19672c7705
        patchset: '4'
        project:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/watcher-dashboard
          name: openstack/watcher-dashboard
          short_name: watcher-dashboard
          src_dir: src/opendev.org/openstack/watcher-dashboard
        topic: service-layer-refactor
      - branch: master
        change: '978301'
        change_message: 'refactor: centralise Django settings access in config.py


          Replace scattered getattr/setattr reflection on Django settings with a

          dedicated watcher_dashboard/config module. Four public functions cover

          the two SSL settings (get_ssl_no_verify, get_ssl_cacert) and policy

          file registration (get_policy_files, set_policy_file).


          functools.cache on the read helpers means settings are looked up once

          per process. set_policy_file clears the policy cache after each write.

          get_policy_files returns a dict copy to prevent caller mutation of the

          cached value. insert_watcher_policy_file guards with an existence check

          so set_policy_file (and its cache_clear) is only called once, avoiding

          per-request cache churn.


          Generated-By: claude-code sonnet 4.6

          Change-Id: Id89d6add9c4b5b370e5c213544df577284dea7a2

          Signed-off-by: Sean Mooney <work@seanmooney.info>

          '
        change_url: https://review.opendev.org/c/openstack/watcher-dashboard/+/978301
        commit_id: 6bf0ac6676d604ccf12478788382a9e9a33ae116
        patchset: '3'
        project:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/watcher-dashboard
          name: openstack/watcher-dashboard
          short_name: watcher-dashboard
          src_dir: src/opendev.org/openstack/watcher-dashboard
        topic: service-layer-refactor
      - branch: master
        change: '978302'
        change_message: "refactor: replace/annotate reflection helpers (A2-1)\n\nReplace
          getattr calls where the attribute is declared in the wrapper\nclass _attrs
          tuple with direct attribute access:\n\n  audit_templates/views.py, audit_templates/forms.py:\n
          \   getattr(strategy, 'display_name', None) or getattr(strategy, 'name',
          '')\n    -> strategy.display_name or strategy.name\n\n  action_plans/tables.py:\n
          \   getattr(datum, \"audit_uuid\", None) -> datum.audit_uuid\n\n  actions/tables.py:\n
          \   getattr(datum, \"action_plan_uuid\", None) -> datum.action_plan_uuid\n\nAnnotate
          intentional reflection with inline comments so project-wide\ngrep finds
          zero uncommented getattr/hasattr/setattr outside tests:\n\n  strategies/views.py:
          parameters_spec optional API field\n  audits/views.py: parameters optional
          field; hasattr guard for\n    parameters_spec extracted to named variable\n
          \ audits/forms.py: http_status watcherclient exception attribute\n  audit_templates/forms.py:
          hasattr unbound form guard\n  utils/utils.py: getattr calls extracted to
          val variables with\n    dynamic attr comments; indexing function converted
          to dict\n    comprehension\n\nGenerated-By: claude-code sonnet 4.6\nChange-Id:
          Id55f3388931f4e848be3965def93234c11f5059f\nSigned-off-by: Sean Mooney <work@seanmooney.info>\n"
        change_url: https://review.opendev.org/c/openstack/watcher-dashboard/+/978302
        commit_id: 343dfb82b7c1a4840c4b4c7c5839e254dc99f85f
        patchset: '3'
        project:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/watcher-dashboard
          name: openstack/watcher-dashboard
          short_name: watcher-dashboard
          src_dir: src/opendev.org/openstack/watcher-dashboard
        topic: service-layer-refactor
      - branch: master
        change: '978306'
        change_message: "feat(A5-1): add PEP 484 type annotations to api/watcher.py
          and errors.py\n\n- Create watcher_dashboard/py.typed marker (PEP 561)\n-
          Add typed public signature to utils/errors.handle_errors: TypeVar T,\n  Callable
          return type, str/int parameter types\n- Add TYPE_CHECKING guard for django.http.HttpRequest
          (string-literal\n  annotations throughout for runtime safety on Python 3.10+)\n-
          Annotate all classmethods in Audit, AuditTemplate, ActionPlan, Action,\n
          \ Goal, Strategy: HttpRequest params, typed filters **kwargs, typed returns\n-
          Use cast() at every watcherclient chain return to bridge untyped library\n
          \ results to typed wrapper classes\n- Annotate __init__, id property, and
          EfficacyIndicator/__init__\n- Remove implicit returns from delete/cancel
          (now -> None)\n\nGenerated-By: claude-code sonnet 4.6\nChange-Id: Iebcb20cb415822d46391dd73d6b1aaeac386857d\nSigned-off-by:
          Sean Mooney <work@seanmooney.info>\n"
        change_url: https://review.opendev.org/c/openstack/watcher-dashboard/+/978306
        commit_id: 1835bd0304c604ff3783f9b0ec6f7d1435cb555a
        patchset: '3'
        project:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/watcher-dashboard
          name: openstack/watcher-dashboard
          short_name: watcher-dashboard
          src_dir: src/opendev.org/openstack/watcher-dashboard
        topic: service-layer-refactor
      - branch: master
        change: '978307'
        change_message: "feat(A5-2): add mypy strict configuration and tox target\n\n-
          Add [tool.mypy] section: strict=true, disable_error_code=[\"import-untyped\"],\n
          \ exclude doc/releasenotes\n- Suppress untyped modules (content, utils,
          common, local, test) via\n  ignore_errors=true overrides\n- Add disallow_subclassing_any=false
          for api.* (APIDictWrapper base is untyped)\n- Add [testenv:mypy] to tox.ini
          using -p watcher_dashboard package syntax\n- Add \"Typing :: Typed\" classifier
          to pyproject.toml\n- Add \"future\" to ruff isort section-order so from
          __future__ imports sort first\n- Fix config.get_policy_files() return type:
          dict -> dict[str, str]\n- Suppress no-untyped-call for wv.get_client() (common.*
          is not yet typed)\n\nGenerated-By: claude-code sonnet 4.6\nChange-Id: Ib2e6df60d9427e914d0f30ec4e296b0254b6ef22\nSigned-off-by:
          Sean Mooney <work@seanmooney.info>\n"
        change_url: https://review.opendev.org/c/openstack/watcher-dashboard/+/978307
        commit_id: 97b556b078ec9abf8434fac2ec39be57b49af8b6
        patchset: '3'
        project:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/watcher-dashboard
          name: openstack/watcher-dashboard
          short_name: watcher-dashboard
          src_dir: src/opendev.org/openstack/watcher-dashboard
        topic: service-layer-refactor
      - branch: master
        change: '978309'
        change_message: "test: improve coverage to 100% on api, client, errors, exceptions\n\nAdd
          tests covering previously uncovered paths:\n\n- test_errors.py (new): handle_errors
          RuntimeError (no request arg),\n  explicit request_arg, _error_handle=False
          bypass, exception handler\n  body with horizon.exceptions.handle call and
          error_default return,\n  and _error_message/_error_redirect override kwargs.\n-
          test_watcher.py: Action.get, Action.delete, EfficacyIndicator.__init__\n
          \ (both populated and empty-dict variants), insert_watcher_policy_file\n
          \ (absent and already-registered branches), and id property on all six\n
          \ wrapper classes (Audit, AuditTemplate, ActionPlan, Action, Goal, Strategy).\n-
          test_client.py: WatcherClientFunctionTests exercises the real\n  watcherclient()
          body with all dependencies patched (default microversion\n  and explicit
          api_version); WatcherGetClientTests covers get_client()\n  with normal and
          SSL-overridden configs; WatcherExceptionsModuleTests\n  imports common.exceptions
          to exercise module-level constant bindings.\n\nCoverage on targeted modules:\n
          \ api/watcher.py        87% -> 100%\n  common/client.py      71% -> 100%\n
          \ common/exceptions.py   0% -> 100%\n  utils/errors.py       78% -> 100%\n
          \ Overall               79% -> 82%\n\nGenerated-By: claude-code sonnet 4.6\nChange-Id:
          Ie3a30ee0b4d3591a7bdad3f5f7bb744ceb559370\nSigned-off-by: Sean Mooney <work@seanmooney.info>\n"
        change_url: https://review.opendev.org/c/openstack/watcher-dashboard/+/978309
        commit_id: 1dd5fbf425bc742fb11a1c948cb6cbd0e0554340
        patchset: '3'
        project:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/watcher-dashboard
          name: openstack/watcher-dashboard
          short_name: watcher-dashboard
          src_dir: src/opendev.org/openstack/watcher-dashboard
        topic: service-layer-refactor
      job: watcher-operator-validation-master
      jobtags: []
      max_attempts: 1
      message: dGVzdDogaW1wcm92ZSBjb3ZlcmFnZSB0byAxMDAlIG9uIGFwaSwgY2xpZW50LCBlcnJvcnMsIGV4Y2VwdGlvbnMKCkFkZCB0ZXN0cyBjb3ZlcmluZyBwcmV2aW91c2x5IHVuY292ZXJlZCBwYXRoczoKCi0gdGVzdF9lcnJvcnMucHkgKG5ldyk6IGhhbmRsZV9lcnJvcnMgUnVudGltZUVycm9yIChubyByZXF1ZXN0IGFyZyksCiAgZXhwbGljaXQgcmVxdWVzdF9hcmcsIF9lcnJvcl9oYW5kbGU9RmFsc2UgYnlwYXNzLCBleGNlcHRpb24gaGFuZGxlcgogIGJvZHkgd2l0aCBob3Jpem9uLmV4Y2VwdGlvbnMuaGFuZGxlIGNhbGwgYW5kIGVycm9yX2RlZmF1bHQgcmV0dXJuLAogIGFuZCBfZXJyb3JfbWVzc2FnZS9fZXJyb3JfcmVkaXJlY3Qgb3ZlcnJpZGUga3dhcmdzLgotIHRlc3Rfd2F0Y2hlci5weTogQWN0aW9uLmdldCwgQWN0aW9uLmRlbGV0ZSwgRWZmaWNhY3lJbmRpY2F0b3IuX19pbml0X18KICAoYm90aCBwb3B1bGF0ZWQgYW5kIGVtcHR5LWRpY3QgdmFyaWFudHMpLCBpbnNlcnRfd2F0Y2hlcl9wb2xpY3lfZmlsZQogIChhYnNlbnQgYW5kIGFscmVhZHktcmVnaXN0ZXJlZCBicmFuY2hlcyksIGFuZCBpZCBwcm9wZXJ0eSBvbiBhbGwgc2l4CiAgd3JhcHBlciBjbGFzc2VzIChBdWRpdCwgQXVkaXRUZW1wbGF0ZSwgQWN0aW9uUGxhbiwgQWN0aW9uLCBHb2FsLCBTdHJhdGVneSkuCi0gdGVzdF9jbGllbnQucHk6IFdhdGNoZXJDbGllbnRGdW5jdGlvblRlc3RzIGV4ZXJjaXNlcyB0aGUgcmVhbAogIHdhdGNoZXJjbGllbnQoKSBib2R5IHdpdGggYWxsIGRlcGVuZGVuY2llcyBwYXRjaGVkIChkZWZhdWx0IG1pY3JvdmVyc2lvbgogIGFuZCBleHBsaWNpdCBhcGlfdmVyc2lvbik7IFdhdGNoZXJHZXRDbGllbnRUZXN0cyBjb3ZlcnMgZ2V0X2NsaWVudCgpCiAgd2l0aCBub3JtYWwgYW5kIFNTTC1vdmVycmlkZGVuIGNvbmZpZ3M7IFdhdGNoZXJFeGNlcHRpb25zTW9kdWxlVGVzdHMKICBpbXBvcnRzIGNvbW1vbi5leGNlcHRpb25zIHRvIGV4ZXJjaXNlIG1vZHVsZS1sZXZlbCBjb25zdGFudCBiaW5kaW5ncy4KCkNvdmVyYWdlIG9uIHRhcmdldGVkIG1vZHVsZXM6CiAgYXBpL3dhdGNoZXIucHkgICAgICAgIDg3JSAtPiAxMDAlCiAgY29tbW9uL2NsaWVudC5weSAgICAgIDcxJSAtPiAxMDAlCiAgY29tbW9uL2V4Y2VwdGlvbnMucHkgICAwJSAtPiAxMDAlCiAgdXRpbHMvZXJyb3JzLnB5ICAgICAgIDc4JSAtPiAxMDAlCiAgT3ZlcmFsbCAgICAgICAgICAgICAgIDc5JSAtPiA4MiUKCkdlbmVyYXRlZC1CeTogY2xhdWRlLWNvZGUgc29ubmV0IDQuNgpDaGFuZ2UtSWQ6IEllM2EzMGVlMGI0ZDM1OTFhN2JkYWQzZjVmN2JiNzQ0Y2ViNTU5MzcwClNpZ25lZC1vZmYtYnk6IFNlYW4gTW9vbmV5IDx3b3JrQHNlYW5tb29uZXkuaW5mbz4K
      override_checkout: main
      patchset: '3'
      pipeline: openstack-check
      playbook_context:
        playbook_projects:
          trusted/project_0/review.rdoproject.org/config:
            canonical_name: review.rdoproject.org/config
            checkout: master
            commit: c202bacbbd704bba004cd445bb4ac8759cd71603
          trusted/project_1/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: c75fe6ef19c05b98349573c971950c51bbf24758
          trusted/project_2/review.rdoproject.org/rdo-jobs:
            canonical_name: review.rdoproject.org/rdo-jobs
            checkout: master
            commit: 42833c2800465195063199e35051e028e7483685
          trusted/project_3/github.com/openstack-k8s-operators/ci-framework:
            canonical_name: github.com/openstack-k8s-operators/ci-framework
            checkout: main
            commit: dc72a2c3e9d875a69f66e63ddaec9eba9e308326
          untrusted/project_0/github.com/openstack-k8s-operators/ci-framework:
            canonical_name: github.com/openstack-k8s-operators/ci-framework
            checkout: main
            commit: dc72a2c3e9d875a69f66e63ddaec9eba9e308326
          untrusted/project_1/review.rdoproject.org/config:
            canonical_name: review.rdoproject.org/config
            checkout: master
            commit: c202bacbbd704bba004cd445bb4ac8759cd71603
          untrusted/project_2/opendev.org/zuul/zuul-jobs:
            canonical_name: opendev.org/zuul/zuul-jobs
            checkout: master
            commit: c75fe6ef19c05b98349573c971950c51bbf24758
          untrusted/project_3/review.rdoproject.org/rdo-jobs:
            canonical_name: review.rdoproject.org/rdo-jobs
            checkout: master
            commit: 42833c2800465195063199e35051e028e7483685
        playbooks:
        - path: untrusted/project_0/github.com/openstack-k8s-operators/ci-framework/ci/playbooks/edpm/run.yml
          roles:
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/playbook_0/role_0/ci-framework
            link_target: untrusted/project_0/github.com/openstack-k8s-operators/ci-framework
            role_path: ansible/playbook_0/role_0/ci-framework/roles
          - checkout: master
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_1/config
            link_target: untrusted/project_1/review.rdoproject.org/config
            role_path: ansible/playbook_0/role_1/config/roles
          - checkout: master
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_2/zuul-jobs
            link_target: untrusted/project_2/opendev.org/zuul/zuul-jobs
            role_path: ansible/playbook_0/role_2/zuul-jobs/roles
          - checkout: master
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_3/rdo-jobs
            link_target: untrusted/project_3/review.rdoproject.org/rdo-jobs
            role_path: ansible/playbook_0/role_3/rdo-jobs/roles
      post_review: false
      project:
        canonical_hostname: opendev.org
        canonical_name: opendev.org/openstack/watcher-dashboard
        name: openstack/watcher-dashboard
        short_name: watcher-dashboard
        src_dir: src/opendev.org/openstack/watcher-dashboard
      projects:
        github.com/crc-org/crc-cloud:
          canonical_hostname: github.com
          canonical_name: github.com/crc-org/crc-cloud
          checkout: main
          checkout_description: project override ref
          commit: 7db2fd7048647a142b2118458ab76b07aed5a494
          name: crc-org/crc-cloud
          required: true
          short_name: crc-cloud
          src_dir: src/github.com/crc-org/crc-cloud
        github.com/openstack-k8s-operators/ci-framework:
          canonical_hostname: github.com
          canonical_name: github.com/openstack-k8s-operators/ci-framework
          checkout: main
          checkout_description: job override ref
          commit: dc72a2c3e9d875a69f66e63ddaec9eba9e308326
          name: openstack-k8s-operators/ci-framework
          required: true
          short_name: ci-framework
          src_dir: src/github.com/openstack-k8s-operators/ci-framework
        github.com/openstack-k8s-operators/edpm-ansible:
          canonical_hostname: github.com
          canonical_name: github.com/openstack-k8s-operators/edpm-ansible
          checkout: main
          checkout_description: job override ref
          commit: 421976f4c9028d1e48d3bb8e55cef87067a21e6d
          name: openstack-k8s-operators/edpm-ansible
          required: true
          short_name: edpm-ansible
          src_dir: src/github.com/openstack-k8s-operators/edpm-ansible
        github.com/openstack-k8s-operators/infra-operator:
          canonical_hostname: github.com
          canonical_name: github.com/openstack-k8s-operators/infra-operator
          checkout: main
          checkout_description: job override ref
          commit: e06fc1a33511f730de3a6215d05eee570cd9d7b1
          name: openstack-k8s-operators/infra-operator
          required: true
          short_name: infra-operator
          src_dir: src/github.com/openstack-k8s-operators/infra-operator
        github.com/openstack-k8s-operators/install_yamls:
          canonical_hostname: github.com
          canonical_name: github.com/openstack-k8s-operators/install_yamls
          checkout: main
          checkout_description: job override ref
          commit: bc3777043145e3918ead69759c09f17ef365070c
          name: openstack-k8s-operators/install_yamls
          required: true
          short_name: install_yamls
          src_dir: src/github.com/openstack-k8s-operators/install_yamls
        github.com/openstack-k8s-operators/openstack-baremetal-operator:
          canonical_hostname: github.com
          canonical_name: github.com/openstack-k8s-operators/openstack-baremetal-operator
          checkout: main
          checkout_description: job override ref
          commit: ddfcabd7b3424c2ce5e2e1a26b13216c0ee41578
          name: openstack-k8s-operators/openstack-baremetal-operator
          required: true
          short_name: openstack-baremetal-operator
          src_dir: src/github.com/openstack-k8s-operators/openstack-baremetal-operator
        github.com/openstack-k8s-operators/openstack-must-gather:
          canonical_hostname: github.com
          canonical_name: github.com/openstack-k8s-operators/openstack-must-gather
          checkout: main
          checkout_description: job override ref
          commit: 36543956b2d3bf32aecd29e68abe94294f97f8a0
          name: openstack-k8s-operators/openstack-must-gather
          required: true
          short_name: openstack-must-gather
          src_dir: src/github.com/openstack-k8s-operators/openstack-must-gather
        github.com/openstack-k8s-operators/openstack-operator:
          canonical_hostname: github.com
          canonical_name: github.com/openstack-k8s-operators/openstack-operator
          checkout: main
          checkout_description: job override ref
          commit: d10499aaf62589e5766553be12c3784f51142e20
          name: openstack-k8s-operators/openstack-operator
          required: true
          short_name: openstack-operator
          src_dir: src/github.com/openstack-k8s-operators/openstack-operator
        github.com/openstack-k8s-operators/repo-setup:
          canonical_hostname: github.com
          canonical_name: github.com/openstack-k8s-operators/repo-setup
          checkout: main
          checkout_description: job override ref
          commit: 85321f7e0af502d7f06f845886058daf09da34f6
          name: openstack-k8s-operators/repo-setup
          required: true
          short_name: repo-setup
          src_dir: src/github.com/openstack-k8s-operators/repo-setup
        github.com/openstack-k8s-operators/watcher-operator:
          canonical_hostname: github.com
          canonical_name: github.com/openstack-k8s-operators/watcher-operator
          checkout: main
          checkout_description: job override ref
          commit: d9d7f10ace025d42d066d7d36b1c37277ef9b85e
          name: openstack-k8s-operators/watcher-operator
          required: true
          short_name: watcher-operator
          src_dir: src/github.com/openstack-k8s-operators/watcher-operator
        opendev.org/openstack/watcher-dashboard:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/openstack/watcher-dashboard
          checkout: master
          checkout_description: zuul branch
          commit: 1dd5fbf425bc742fb11a1c948cb6cbd0e0554340
          name: openstack/watcher-dashboard
          required: false
          short_name: watcher-dashboard
          src_dir: src/opendev.org/openstack/watcher-dashboard
        opendev.org/zuul/zuul-jobs:
          canonical_hostname: opendev.org
          canonical_name: opendev.org/zuul/zuul-jobs
          checkout: master
          checkout_description: zuul branch
          commit: c75fe6ef19c05b98349573c971950c51bbf24758
          name: zuul/zuul-jobs
          required: true
          short_name: zuul-jobs
          src_dir: src/opendev.org/zuul/zuul-jobs
        review.rdoproject.org/config:
          canonical_hostname: review.rdoproject.org
          canonical_name: review.rdoproject.org/config
          checkout: master
          checkout_description: zuul branch
          commit: c202bacbbd704bba004cd445bb4ac8759cd71603
          name: config
          required: true
          short_name: config
          src_dir: src/review.rdoproject.org/config
      ref: refs/changes/09/978309/3
      resources: {}
      tenant: rdoproject.org
      timeout: 10800
      topic: service-layer-refactor
      voting: true
    zuul_log_collection: false
