- nodeset:
    name: openstack-single-node-jammy
    nodes:
      - name: controller
        label: ubuntu-jammy
    groups:
      - name: tempest
        nodes:
          - controller

- nodeset:
    name: openstack-single-node-noble
    nodes:
      - name: controller
        label: ubuntu-noble
    groups:
      - name: tempest
        nodes:
          - controller

- nodeset:
    name: openstack-single-node-focal
    nodes:
      - name: controller
        label: ubuntu-focal
    groups:
      - name: tempest
        nodes:
          - controller

- nodeset:
    name: openstack-single-node-bionic
    nodes:
      - name: controller
        label: ubuntu-bionic
    groups:
      - name: tempest
        nodes:
          - controller

- nodeset:
    name: devstack-single-node-centos-9-stream
    nodes:
      - name: controller
        label: centos-9-stream
    groups:
      - name: tempest
        nodes:
          - controller

- nodeset:
    name: devstack-single-node-opensuse-15
    nodes:
      - name: controller
        label: opensuse-15
    groups:
      - name: tempest
        nodes:
          - controller

- nodeset:
    name: devstack-single-node-debian-bookworm
    nodes:
      - name: controller
        label: debian-bookworm
    groups:
      - name: tempest
        nodes:
          - controller

# Note(sean-k-mooney): this is still used by horizon for
# horizon-integration-tests, horizon-integration-pytest and
# horizon-ui-pytest, remove when horizon is updated.
- nodeset:
    name: devstack-single-node-debian-bullseye
    nodes:
      - name: controller
        label: debian-bullseye
    groups:
      - name: tempest
        nodes:
          - controller

- nodeset:
    name: devstack-single-node-rockylinux-9
    nodes:
      - name: controller
        label: rockylinux-9
    groups:
      - name: tempest
        nodes:
          - controller

- nodeset:
    name: openstack-two-node-centos-9-stream
    nodes:
      - name: controller
        label: centos-9-stream
      - name: compute1
        label: centos-9-stream
    groups:
      # Node where tests are executed and test results collected
      - name: tempest
        nodes:
          - controller
      # Nodes running the compute service
      - name: compute
        nodes:
          - controller
          - compute1
      # Nodes that are not the controller
      - name: subnode
        nodes:
          - compute1
      # Switch node for multinode networking setup
      - name: switch
        nodes:
          - controller
      # Peer nodes for multinode networking setup
      - name: peers
        nodes:
          - compute1

- nodeset:
    name: openstack-two-node-jammy
    nodes:
      - name: controller
        label: ubuntu-jammy
      - name: compute1
        label: ubuntu-jammy
    groups:
      # Node where tests are executed and test results collected
      - name: tempest
        nodes:
          - controller
      # Nodes running the compute service
      - name: compute
        nodes:
          - controller
          - compute1
      # Nodes that are not the controller
      - name: subnode
        nodes:
          - compute1
      # Switch node for multinode networking setup
      - name: switch
        nodes:
          - controller
      # Peer nodes for multinode networking setup
      - name: peers
        nodes:
          - compute1

- nodeset:
    name: openstack-two-node-noble
    nodes:
      - name: controller
        label: ubuntu-noble
      - name: compute1
        label: ubuntu-noble
    groups:
      # Node where tests are executed and test results collected
      - name: tempest
        nodes:
          - controller
      # Nodes running the compute service
      - name: compute
        nodes:
          - controller
          - compute1
      # Nodes that are not the controller
      - name: subnode
        nodes:
          - compute1
      # Switch node for multinode networking setup
      - name: switch
        nodes:
          - controller
      # Peer nodes for multinode networking setup
      - name: peers
        nodes:
          - compute1

- nodeset:
    name: openstack-two-node-focal
    nodes:
      - name: controller
        label: ubuntu-focal
      - name: compute1
        label: ubuntu-focal
    groups:
      # Node where tests are executed and test results collected
      - name: tempest
        nodes:
          - controller
      # Nodes running the compute service
      - name: compute
        nodes:
          - controller
          - compute1
      # Nodes that are not the controller
      - name: subnode
        nodes:
          - compute1
      # Switch node for multinode networking setup
      - name: switch
        nodes:
          - controller
      # Peer nodes for multinode networking setup
      - name: peers
        nodes:
          - compute1

- nodeset:
    name: openstack-two-node-bionic
    nodes:
      - name: controller
        label: ubuntu-bionic
      - name: compute1
        label: ubuntu-bionic
    groups:
      # Node where tests are executed and test results collected
      - name: tempest
        nodes:
          - controller
      # Nodes running the compute service
      - name: compute
        nodes:
          - controller
          - compute1
      # Nodes that are not the controller
      - name: subnode
        nodes:
          - compute1
      # Switch node for multinode networking setup
      - name: switch
        nodes:
          - controller
      # Peer nodes for multinode networking setup
      - name: peers
        nodes:
          - compute1

- nodeset:
    name: openstack-three-node-focal
    nodes:
      - name: controller
        label: ubuntu-focal
      - name: compute1
        label: ubuntu-focal
      - name: compute2
        label: ubuntu-focal
    groups:
      # Node where tests are executed and test results collected
      - name: tempest
        nodes:
          - controller
      # Nodes running the compute service
      - name: compute
        nodes:
          - controller
          - compute1
          - compute2
      # Nodes that are not the controller
      - name: subnode
        nodes:
          - compute1
          - compute2
      # Switch node for multinode networking setup
      - name: switch
        nodes:
          - controller
      # Peer nodes for multinode networking setup
      - name: peers
        nodes:
          - compute1
          - compute2

- nodeset:
    name: openstack-three-node-bionic
    nodes:
      - name: controller
        label: ubuntu-bionic
      - name: compute1
        label: ubuntu-bionic
      - name: compute2
        label: ubuntu-bionic
    groups:
      # Node where tests are executed and test results collected
      - name: tempest
        nodes:
          - controller
      # Nodes running the compute service
      - name: compute
        nodes:
          - controller
          - compute1
          - compute2
      # Nodes that are not the controller
      - name: subnode
        nodes:
          - compute1
          - compute2
      # Switch node for multinode networking setup
      - name: switch
        nodes:
          - controller
      # Peer nodes for multinode networking setup
      - name: peers
        nodes:
          - compute1
          - compute2

- job:
    name: devstack-base
    parent: openstack-multinode-fips
    abstract: true
    description: |
      Base abstract Devstack job.

      Defines plays and base variables, but it does not include any project
      and it does not run any service by default. This is a common base for
      all single Devstack jobs, single or multinode.
      Variables are defined in job.vars, which is what is then used by single
      node jobs and by multi node jobs for the controller, as well as in
      job.group-vars.peers, which is what is used by multi node jobs for subnode
      nodes (everything but the controller).
    required-projects:
      - opendev.org/openstack/devstack
    roles:
      - zuul: opendev.org/openstack/openstack-zuul-jobs
    vars:
      devstack_localrc:
        DATABASE_PASSWORD: secretdatabase
        RABBIT_PASSWORD: secretrabbit
        ADMIN_PASSWORD: secretadmin
        SERVICE_PASSWORD: secretservice
        NETWORK_GATEWAY: 10.1.0.1
        FIXED_RANGE: 10.1.0.0/20
        IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
        FLOATING_RANGE: 172.24.5.0/24
        PUBLIC_NETWORK_GATEWAY: 172.24.5.1
        LOGFILE: /opt/stack/logs/devstacklog.txt
        LOG_COLOR: false
        VERBOSE: true
        VERBOSE_NO_TIMESTAMP: true
        NOVNC_FROM_PACKAGE: true
        ERROR_ON_CLONE: true
        # Gate jobs can't deal with nested virt. Disable it by default.
        LIBVIRT_TYPE: '{{ devstack_libvirt_type | default("qemu") }}'
      devstack_services:
        # Ignore any default set by devstack. Emit a "disable_all_services".
        base: false
      zuul_copy_output:
        '{{ devstack_conf_dir }}/local.conf': logs
        '{{ devstack_conf_dir }}/localrc': logs
        '{{ devstack_conf_dir }}/.localrc.auto': logs
        '{{ devstack_conf_dir }}/.stackenv': logs
        '{{ devstack_log_dir }}/dstat-csv.log': logs
        '{{ devstack_log_dir }}/devstacklog.txt': logs
        '{{ devstack_log_dir }}/devstacklog.txt.summary': logs
        '{{ devstack_log_dir }}/tcpdump.pcap': logs
        '{{ devstack_log_dir }}/worlddump-latest.txt': logs
        '{{ devstack_log_dir }}/qemu.coredump': logs
        '{{ devstack_full_log}}': logs
        '{{ stage_dir }}/verify_tempest_conf.log': logs
        '{{ stage_dir }}/performance.json': logs
        '{{ stage_dir }}/apache': logs
        '{{ stage_dir }}/apache_config': logs
        '{{ stage_dir }}/etc': logs
        /var/log/rabbitmq: logs
        /var/log/postgresql: logs
        /var/log/mysql: logs
        /var/log/libvirt: logs
        /etc/libvirt: logs
        /etc/lvm: logs
        /etc/sudoers: logs
        /etc/sudoers.d: logs
        '{{ stage_dir }}/iptables.txt': logs
        '{{ stage_dir }}/df.txt': logs
        '{{ stage_dir }}/pip2-freeze.txt': logs
        '{{ stage_dir }}/pip3-freeze.txt': logs
        '{{ stage_dir }}/dpkg-l.txt': logs
        '{{ stage_dir }}/rpm-qa.txt': logs
        '{{ stage_dir }}/core': logs
        '{{ stage_dir }}/listen53.txt': logs
        '{{ stage_dir }}/services.txt': logs
        '{{ stage_dir }}/deprecations.log': logs
        '{{ stage_dir }}/audit.log': logs
        /etc/ceph: logs
        /var/log/ceph: logs
        /var/log/openvswitch: logs
        /var/log/glusterfs: logs
        /etc/glusterfs/glusterd.vol: logs
        /etc/resolv.conf: logs
        /var/log/unbound.log: logs
      extensions_to_txt:
        conf: true
        log: true
        localrc: true
        stackenv: true
        auto: true
    group-vars:
      subnode:
        devstack_localrc:
          DATABASE_PASSWORD: secretdatabase
          RABBIT_PASSWORD: secretrabbit
          ADMIN_PASSWORD: secretadmin
          SERVICE_PASSWORD: secretservice
          NETWORK_GATEWAY: 10.1.0.1
          FIXED_RANGE: 10.1.0.0/20
          IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
          FLOATING_RANGE: 172.24.5.0/24
          PUBLIC_NETWORK_GATEWAY: 172.24.5.1
          LOGFILE: /opt/stack/logs/devstacklog.txt
          LOG_COLOR: false
          VERBOSE: true
          VERBOSE_NO_TIMESTAMP: true
          NOVNC_FROM_PACKAGE: true
          ERROR_ON_CLONE: true
          LIBVIRT_TYPE: qemu
        devstack_services:
          base: false
    pre-run: playbooks/pre.yaml
    run: playbooks/devstack.yaml
    post-run: playbooks/post.yaml
    irrelevant-files:
      # Documentation related
      - ^.*\.rst$
      - ^api-ref/.*$
      - ^doc/.*$
      - ^releasenotes/.*$
      # Translations
      - ^.*/locale/.*po$

- job:
    name: devstack-minimal
    parent: devstack-base
    description: |
      Minimal devstack base job, intended for use by jobs that need
      less than the normal minimum set of required-projects.
    nodeset: openstack-single-node-jammy
    required-projects:
      - opendev.org/openstack/requirements
    vars:
      devstack_localrc:
        # Multinode specific settings
        SERVICE_HOST: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
        HOST_IP: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
        PUBLIC_BRIDGE_MTU: '{{ external_bridge_mtu }}'
      devstack_services:
        # Shared services
        dstat: false
        etcd3: true
        memory_tracker: true
        file_tracker: true
        mysql: true
        rabbit: true
        openstack-cli-server: true
    group-vars:
      subnode:
        devstack_services:
          # Shared services
          dstat: false
          memory_tracker: true
          file_tracker: true
          openstack-cli-server: true
        devstack_localrc:
          # Multinode specific settings
          HOST_IP: "{{ hostvars[inventory_hostname]['nodepool']['private_ipv4'] }}"
          SERVICE_HOST: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
          PUBLIC_BRIDGE_MTU: '{{ external_bridge_mtu }}'
          # Subnode specific settings
          DATABASE_TYPE: mysql
          RABBIT_HOST: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
          DATABASE_HOST: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"


- job:
    name: devstack
    parent: devstack-minimal
    description: |
      Base devstack job for integration gate.

      This base job can be used for single node and multinode devstack jobs.

      With a single node nodeset, this job sets up an "all-in-one" (aio)
      devstack with the seven OpenStack services included in the devstack tree:
      keystone, glance, cinder, neutron, nova, placement, and swift.

      With a two node nodeset, this job sets up an aio + compute node.
      The controller can be customised using host-vars.controller, the
      sub-nodes can be customised using group-vars.subnode.

      Descendent jobs can enable / disable services, add devstack configuration
      options, enable devstack plugins, configure log files or directories to be
      transferred to the log server.

      The job assumes that there is only one controller node. The number of
      subnodes can be scaled up seamlessly by setting a custom nodeset in
      job.nodeset.

      The run playbook consists of a single role, so it can be easily rewritten
      and extended.
    required-projects:
      - opendev.org/openstack/cinder
      - opendev.org/openstack/glance
      - opendev.org/openstack/keystone
      - opendev.org/openstack/neutron
      - opendev.org/openstack/nova
      - opendev.org/openstack/placement
      - opendev.org/openstack/swift
    timeout: 7200
    vars:
      # based on observation of the integrated gate
      # tempest-integrated-compute was only using ~1.7GB of swap
      # when zswap and the host turning are enabled that increase
      # slightly to ~2GB. we are setting the swap size to 8GB to
      # be safe and account for more complex scenarios.
      # we should revisit this value after some time to see if we
      # can reduce it.
      configure_swap_size: 8192
      devstack_localrc:
        # Common OpenStack services settings
        SWIFT_REPLICAS: 1
        SWIFT_START_ALL_SERVICES: false
        SWIFT_HASH: 1234123412341234
        DEBUG_LIBVIRT_COREDUMPS: true
        NOVA_VNC_ENABLED: true
        OVN_DBS_LOG_LEVEL: dbg
        # tune the host to optimize memory usage and hide io latency
        # these setting will configure the kernel to treat the host page
        # cache and swap with equal priority, and prefer deferring writes
        # changing the default swappiness, dirty_ratio and
        # the vfs_cache_pressure
        ENABLE_SYSCTL_MEM_TUNING: true
        # the net tuning optimizes ipv4 tcp fast open and config the default
        # qdisk policy to pfifo_fast which effectively disable all qos.
        # this minimizes the cpu load of the host network stack
        ENABLE_SYSCTL_NET_TUNING: true
        # zswap allows the kernel to compress pages in memory before swapping
        # them to disk. this can reduce the amount of swap used and improve
        # performance. effectively this trades a small amount of cpu for an
        # increase in swap performance by reducing the amount of data
        # written to disk. the overall speedup is proportional to the
        # compression ratio and the speed of the swap device.
        # NOTE: this option is ignored when not using nova with the libvirt
        # virt driver.
        NOVA_LIBVIRT_TB_CACHE_SIZE: 128
        ENABLE_ZSWAP: true
      devstack_local_conf:
        post-config:
          $NEUTRON_CONF:
            DEFAULT:
              global_physnet_mtu: '{{ external_bridge_mtu }}'
      devstack_services:
        # Core services enabled for this branch.
        # This list replaces the test-matrix.
        # Shared services
        dstat: false
        etcd3: true
        memory_tracker: true
        file_tracker: true
        mysql: true
        rabbit: true
        tls-proxy: true
        # Keystone services
        key: true
        # Glance services
        g-api: true
        # Nova services
        n-api: true
        n-api-meta: true
        n-cond: true
        n-cpu: true
        n-novnc: true
        n-sch: true
        # Placement service
        placement-api: true
        # OVN services
        ovn-controller: true
        ovn-northd: true
        ovs-vswitchd: true
        ovsdb-server: true
        # Neutron services
        q-svc: true
        q-ovn-metadata-agent: true
        # Swift services
        s-account: true
        s-container: true
        s-object: true
        s-proxy: true
        # Cinder services
        c-api: true
        c-bak: true
        c-sch: true
        c-vol: true
        # Services we don't need.
        # This section is not really needed, it's for readability.
        horizon: false
        tempest: false
        # Test matrix emits ceilometer but ceilomenter is not installed in the
        # integrated gate, so specifying the services has not effect.
        # ceilometer-*: false
    group-vars:
      subnode:
        devstack_services:
          # Core services enabled for this branch.
          # This list replaces the test-matrix.
          # Shared services
          dstat: false
          memory_tracker: true
          file_tracker: true
          tls-proxy: true
          # Nova services
          n-cpu: true
          # Placement services
          placement-client: true
          # OVN services
          ovn-controller: true
          ovs-vswitchd: true
          ovsdb-server: true
          # Neutron services
          q-ovn-metadata-agent: true
          # Cinder services
          c-bak: true
          c-vol: true
          # Services we don't run at all on subnode.
          # This section is not really needed, it's for readability.
          # keystone: false
          # s-*: false
          horizon: false
          tempest: false
          # Test matrix emits ceilometer but ceilometer is not installed in the
          # integrated gate, so specifying the services has not effect.
          # ceilometer-*: false
        devstack_localrc:
          # Subnode specific settings
          GLANCE_HOSTPORT: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}:9292"
          Q_HOST: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
          NOVA_VNC_ENABLED: true
          ENABLE_CHASSIS_AS_GW: false
          # tune the host to optimize memory usage and hide io latency
          # these setting will configure the kernel to treat the host page
          # cache and swap with equal priority, and prefer deferring writes
          # changing the default swappiness, dirty_ratio and
          # the vfs_cache_pressure
          ENABLE_SYSCTL_MEM_TUNING: true
          # the net tuning optimizes ipv4 tcp fast open and config the default
          # qdisk policy to pfifo_fast which effectively disable all qos.
          # this minimizes the cpu load of the host network stack
          ENABLE_SYSCTL_NET_TUNING: true
          # zswap allows the kernel to compress pages in memory before swapping
          # them to disk. this can reduce the amount of swap used and improve
          # performance. effectivly this trades a small amount of cpu for an
          # increase in swap performance by reducing the amount of data
          # written to disk. the overall speedup is porportional to the
          # compression ratio and the speed of the swap device.
          ENABLE_ZSWAP: true
          # NOTE: this option is ignored when not using nova with the libvirt
          # virt driver.
          NOVA_LIBVIRT_TB_CACHE_SIZE: 128

- job:
    name: devstack-ipv6
    parent: devstack
    description: |
      Devstack single node job for integration gate with IPv6,
      all services and tunnels using IPv6 addresses.
    vars:
      devstack_localrc:
        SERVICE_IP_VERSION: 6
        SERVICE_HOST: ""
        TUNNEL_IP_VERSION: 6

- job:
    name: devstack-enforce-scope
    parent: devstack
    description: |
      This job runs the devstack with scope checks enabled.
    vars:
      devstack_localrc:
        ENFORCE_SCOPE: true

- job:
    name: devstack-multinode
    parent: devstack
    nodeset: openstack-two-node-jammy
    description: |
      Simple multinode test to verify multinode functionality on devstack side.
      This is not meant to be used as a parent job.

# NOTE(ianw) Platform tests have traditionally been non-voting because
# we often have to rush things through devstack to stabilise the gate,
# and these platforms don't have the round-the-clock support to avoid
# becoming blockers in that situation.
- job:
    name: devstack-platform-centos-9-stream
    parent: tempest-full-py3
    description: CentOS 9 Stream platform test
    nodeset: devstack-single-node-centos-9-stream
    timeout: 9000
    voting: false

- job:
    name: devstack-platform-debian-bookworm
    parent: tempest-full-py3
    description: Debian Bookworm platform test
    nodeset: devstack-single-node-debian-bookworm
    timeout: 9000
    vars:
      configure_swap_size: 4096

- job:
    name: devstack-platform-rocky-blue-onyx
    parent: tempest-full-py3
    description: Rocky Linux 9 Blue Onyx platform test
    nodeset: devstack-single-node-rockylinux-9
    timeout: 9000
    # NOTE(danms): This has been failing lately with some repository metadata
    # errors. We're marking this as non-voting until it appears to have
    # stabilized:
    # https://zuul.openstack.org/builds?job_name=devstack-platform-rocky-blue-onyx&skip=0
    voting: false
    vars:
      configure_swap_size: 4096


- job:
    name: devstack-platform-ubuntu-noble
    parent: tempest-full-py3
    description: Ubuntu 24.04 LTS (noble) platform test
    nodeset: openstack-single-node-noble
    timeout: 9000
    voting: false
    vars:
      configure_swap_size: 8192

- job:
    name: devstack-platform-ubuntu-jammy-ovn-source
    parent: devstack-platform-ubuntu-jammy
    description: Ubuntu 22.04 LTS (jammy) platform test (OVN from source)
    voting: false
    vars:
      devstack_localrc:
        OVN_BUILD_FROM_SOURCE: True
        OVN_BRANCH: "v21.06.0"
        OVS_BRANCH: "a4b04276ab5934d087669ff2d191a23931335c87"
        OVS_SYSCONFDIR: "/usr/local/etc/openvswitch"

- job:
    name: devstack-platform-ubuntu-jammy-ovs
    parent: tempest-full-py3
    description: Ubuntu 22.04 LTS (jammy) platform test (OVS)
    nodeset: openstack-single-node-jammy
    voting: false
    timeout: 9000
    vars:
      configure_swap_size: 8192
      devstack_localrc:
        Q_AGENT: openvswitch
        Q_ML2_PLUGIN_MECHANISM_DRIVERS: openvswitch
        Q_ML2_TENANT_NETWORK_TYPE: vxlan
      devstack_services:
        # Disable OVN services
        ovn-northd: false
        ovn-controller: false
        ovs-vswitchd: false
        ovsdb-server: false
        # Disable Neutron ML2/OVN services
        q-ovn-metadata-agent: false
        # Enable Neutron ML2/OVS services
        q-agt: true
        q-dhcp: true
        q-l3: true
        q-meta: true
        q-metering: true
    group-vars:
      subnode:
        devstack_services:
          # Disable OVN services
          ovn-controller: false
          ovs-vswitchd: false
          ovsdb-server: false
          # Disable Neutron ML2/OVN services
          q-ovn-metadata-agent: false
          # Enable Neutron ML2/OVS services
          q-agt: true

- job:
    name: devstack-no-tls-proxy
    parent: tempest-full-py3
    description: |
      Tempest job with tls-proxy off.

      Some gates run devstack like this and it follows different code paths.
    vars:
      devstack_services:
        tls-proxy: false

- job:
    name: devstack-tox-base
    parent: devstack
    description: |
      Base job for devstack-based functional tests that use tox.

      This job is not intended to be run directly. It's just here
      for organizational purposes for devstack-tox-functional and
      devstack-tox-functional-consumer.
    post-run: playbooks/tox/post.yaml
    vars:
      tox_envlist: functional
      tox_install_siblings: false

- job:
    name: devstack-tox-functional
    parent: devstack-tox-base
    description: |
      Base job for devstack-based functional tests that use tox.

      Runs devstack, then runs the tox ``functional`` environment,
      then collects tox/testr build output like normal tox jobs.

      Turns off tox sibling installation. Projects may be involved
      in the devstack deployment and so may be in the required-projects
      list, but may not want to test against master of the other
      projects in their tox env. Child jobs can set tox_install_siblings
      to True to re-enable sibling processing.
    run: playbooks/tox/run-both.yaml

- job:
    name: devstack-tox-functional-consumer
    parent: devstack
    description: |
      Base job for devstack-based functional tests for projects that
      consume the devstack cloud.

      This base job should only be used by projects that are not involved
      in the devstack deployment step, but are instead projects that are using
      devstack to get a cloud against which they can test things.

      Runs devstack in pre-run, then runs the tox ``functional`` environment,
      then collects tox/testr build output like normal tox jobs.

      Turns off tox sibling installation. Projects may be involved
      in the devstack deployment and so may be in the required-projects
      list, but may not want to test against master of the other
      projects in their tox env. Child jobs can set tox_install_siblings
      to True to re-enable sibling processing.
    pre-run:
      - playbooks/devstack.yaml
      - playbooks/tox/pre.yaml
    run: playbooks/tox/run.yaml

- job:
    name: devstack-unit-tests
    nodeset: ubuntu-jammy
    description: |
      Runs unit tests on devstack project.

      It runs  ``run_tests.sh``.
    pre-run: playbooks/unit-tests/pre.yaml
    run: playbooks/unit-tests/run.yaml

- project:
    templates:
      - integrated-gate-py3
      - publish-openstack-docs-pti
    check:
      jobs:
        - devstack
        - devstack-ipv6
        - devstack-enforce-scope
        - devstack-platform-centos-9-stream
        - devstack-platform-debian-bookworm
        - devstack-platform-rocky-blue-onyx
        - devstack-platform-ubuntu-jammy-ovn-source
        - devstack-platform-ubuntu-jammy-ovs
        - devstack-platform-ubuntu-noble
        - devstack-multinode
        - devstack-unit-tests
        - openstack-tox-bashate
        - ironic-tempest-bios-ipmi-direct-tinyipa
        - swift-dsvm-functional
        - grenade:
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
        - neutron-ovs-grenade-multinode:
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
        - neutron-ovn-tempest-ovs-release:
            voting: false
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
        - tempest-multinode-full-py3:
            voting: false
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
        - openstacksdk-functional-devstack:
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
        - tempest-ipv6-only:
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
        - nova-ceph-multistore:
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
    gate:
      jobs:
        - devstack
        - devstack-ipv6
        - devstack-platform-debian-bookworm
        # NOTE(danms): Disabled due to instability, see comment in the job
        # definition above.
        # - devstack-platform-rocky-blue-onyx
        - devstack-enforce-scope
        - devstack-multinode
        - devstack-unit-tests
        - openstack-tox-bashate
        - neutron-ovs-grenade-multinode:
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
        - ironic-tempest-bios-ipmi-direct-tinyipa
        - swift-dsvm-functional
        - grenade:
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
        - openstacksdk-functional-devstack:
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
        - tempest-ipv6-only:
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
        - nova-ceph-multistore:
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
    # Please add a note on each job and conditions for the job not
    # being experimental any more, so we can keep this list somewhat
    # pruned.
    #
    # * nova-next: maintained by nova for unreleased/undefaulted
    #    things, this job is not experimental but often is used to test
    #    things that are not yet production ready or to test what will be
    #    the new default after a deprecation period has ended.
    # * neutron-fullstack-with-uwsgi: maintained by neutron for fullstack test
    #    when neutron-api is served by uwsgi, it's in exprimental for testing.
    #    the next cycle we can remove this  job if things turn out to be
    #    stable enough.
    # * neutron-functional-with-uwsgi: maintained by neutron for functional
    #    test. Next cycle we can remove this one if things turn out to be
    #    stable engouh with uwsgi.
    # * neutron-ovn-tempest-with-uwsgi: maintained by neutron for tempest test.
    #    Next cycle we can remove this if everything run out stable enough.
    # * nova-multi-cell: maintained by nova and now is voting in the
    #    check queue for nova changes but relies on devstack configuration

    experimental:
      jobs:
        - nova-multi-cell
        - nova-next
        - neutron-fullstack-with-uwsgi
        - neutron-functional-with-uwsgi
        - neutron-ovn-tempest-with-uwsgi
        - devstack-plugin-ceph-tempest-py3:
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
        - neutron-ovs-tempest-dvr:
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
        - neutron-ovs-tempest-dvr-ha-multinode-full:
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
        - cinder-tempest-lvm-multibackend:
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
        - tempest-pg-full:
            irrelevant-files:
              - ^.*\.rst$
              - ^doc/.*$
        - devstack-no-tls-proxy
    periodic:
      jobs:
        - devstack-no-tls-proxy
    periodic-weekly:
      jobs:
        - devstack-platform-centos-9-stream
        - devstack-platform-debian-bookworm
        - devstack-platform-rocky-blue-onyx
        - devstack-platform-ubuntu-jammy-ovn-source
        - devstack-platform-ubuntu-jammy-ovs