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: '12**********89'
            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: '12**********89'
            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: '12**********89'
            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: '12**********89'
            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
        localhost:
            ansible_connection: local
    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: '12**********89'
        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


                    Remove autopep8 from pre-commit; it is redundant now that ruff
                    covers

                    the same PEP 8 formatting. Add ruff-format as the project formatter

                    with quote-style=preserve and space indentation (line-length inherited

                    from [tool.ruff] at 79).


                    Restrict hacking to H-prefix rules only (select=H) since ruff-check

                    already enforces E/W/F rules. Drop F405 and W504 from the [flake8]

                    ignore list — those rules are never reached when hacking only
                    sees H.


                    Update the contributor docs to name ruff-format as the formatter,

                    describe the three-tool toolchain (ruff-format, ruff-check, hacking),

                    and note that autopep8 has been removed.


                    Generated-By: claude-code sonnet 4.6

                    Change-Id: I121b826b248b3683db7d185bcb9b34a960f99f38

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

                    '
                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
                    → 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
