---
- job:
    name: ironic-base
    abstract: true
    description: Base job for devstack/tempest based ironic jobs.
    parent: devstack-tempest
    nodeset: openstack-single-node-jammy
    post-run: playbooks/ci-workarounds/get_extra_logging.yaml
    timeout: 10800
    required-projects:
      # TODO(TheJulia): Explicitly pull in DIB until we get a release cut.
      - opendev.org/openstack/diskimage-builder
      - opendev.org/openstack/ironic
      - opendev.org/openstack/ironic-python-agent
      - opendev.org/openstack/ironic-python-agent-builder
      - opendev.org/openstack/ironic-tempest-plugin
      - opendev.org/openstack/virtualbmc
    irrelevant-files:
      - ^.*\.rst$
      - ^api-ref/.*$
      - ^doc/.*$
      - ^driver-requirements.txt$
      - ^install-guide/.*$
      - ^ironic/locale/.*$
      - ^ironic/tests/.*$
      - ^redfish-interop-profiles/.*$
      - ^releasenotes/.*$
      - ^setup.cfg$
      - ^test-requirements.txt$
      - ^tox.ini$
    vars:
      tox_envlist: all
      tempest_test_timeout: 2400
      tempest_test_regex: ironic_tempest_plugin.tests.scenario
      tempest_concurrency: 1
      devstack_localrc:
        DEFAULT_INSTANCE_TYPE: baremetal
        FORCE_CONFIG_DRIVE: True
        INSTALL_TEMPEST: False # Don't install a tempest package globally
        VIRT_DRIVER: ironic
        BUILD_TIMEOUT: 1800
        IRONIC_BAREMETAL_BASIC_OPS: True
        IRONIC_BUILD_DEPLOY_RAMDISK: False
        IRONIC_CALLBACK_TIMEOUT: 1800
        IRONIC_DEPLOY_DRIVER: ipmi
        IRONIC_INSPECTOR_BUILD_RAMDISK: False
        IRONIC_INSPECTOR_TEMPEST_INTROSPECTION_TIMEOUT: 1200
        IRONIC_TEMPEST_BUILD_TIMEOUT: 1800
        IRONIC_TEMPEST_WHOLE_DISK_IMAGE: False
        IRONIC_VM_COUNT: 2
        IRONIC_VM_EPHEMERAL_DISK: 1
        IRONIC_VM_SPECS_RAM: 2600
        IRONIC_VM_LOG_DIR: '{{ devstack_base_dir }}/ironic-bm-logs'
        # NOTE(dtantsur): in some jobs we end up with 12 disks total, so reduce
        # each of them. For don't need all 10 GiB for CirrOS anyway.
        IRONIC_VM_SPECS_DISK: 4
        IRONIC_VM_SPECS_CPU: 2
        Q_AGENT: openvswitch
        Q_ML2_TENANT_NETWORK_TYPE: vxlan
        Q_ML2_PLUGIN_MECHANISM_DRIVERS: openvswitch
        SERVICE_TIMEOUT: 90
        # NOTE(TheJulia): Devstack default glance limit is 1GB, we need
        # something more like 5GB for baremetal jobs due to image sizes
        # with firmware.
        GLANCE_LIMIT_IMAGE_SIZE_TOTAL: 5000
        # NOTE(TheJulia): Disable neutron firewall as bug
        # https://bugs.launchpad.net/neutron/+bug/1944201
        # causes us an abnormally high job failure rate due to the ports
        # not being found (as neutron crashed on initialization).
        Q_USE_SECGROUP: False
        # Default API workers is 2, however only 1 is needed,
        # which cuts API memory utilziation in half reducing the risk of
        # oom-killer events in CI.
        API_WORKERS: 1
        CIRROS_VERSION: 0.6.1
      devstack_plugins:
        ironic: https://opendev.org/openstack/ironic
      tempest_plugins:
        - ironic-tempest-plugin
      zuul_copy_output:
        '{{ devstack_base_dir }}/ironic-bm-logs': 'logs'
        '{{ devstack_base_dir }}/data/networking-generic-switch/netmiko_session.log': 'logs'
      devstack_services:
        # TODO: re-enable dstat once https://storyboard.openstack.org/#!/story/2008185
        # is resolved
        dstat: false
        q-agt: true
        q-dhcp: true
        q-l3: true
        q-meta: true
        q-svc: true
        ovn-controller: false
        ovn-northd: false
        q-ovn-metadata-agent: false
        c-api: False
        c-bak: False
        c-sch: False
        c-vol: False
        cinder: False
        s-account: False
        s-container: False
        s-object: False
        s-proxy: False
        openstack-cli-server: True

- job:
    name: ironic-standalone-aarch64
    description:
      Test ironic standalone configured with ipmi hardware type, ramdisk and
      direct deploy interfaces, rescue enabled.
    parent: ironic-base
    irrelevant-files:
      - ^.*\.rst$
      - ^api-ref/.*$
      - ^doc/.*$
      - ^install-guide/.*$
      - ^ironic/locale/.*$
      - ^ironic/tests/.*$
      - ^releasenotes/.*$
      - ^setup.cfg$
      - ^test-requirements.txt$
      - ^tools/.*$
      - ^tox.ini$
    vars:
      tempest_test_regex: BaremetalDriverDirectWholedisk
      tempest_concurrency: 2
      devstack_localrc:
        FORCE_CONFIG_DRIVE: False
        IRONIC_AGENT_IMAGE_DOWNLOAD_SOURCE: http
        IRONIC_AUTOMATED_CLEAN_ENABLED: False
        IRONIC_BUILD_DEPLOY_RAMDISK: False
        IRONIC_DEPLOY_DRIVER: redfish
        IRONIC_DEFAULT_RESCUE_INTERFACE: agent
        IRONIC_ENABLED_BOOT_INTERFACES: "ipxe,redfish-virtual-media,http-ipxe,pxe,http"
        IRONIC_ENABLED_HARDWARE_TYPES: redfish
        IRONIC_ENABLED_MANAGEMENT_INTERFACES: redfish
        IRONIC_ENABLED_DEPLOY_INTERFACES: "direct,ramdisk"
        IRONIC_ENABLED_RESCUE_INTERFACES: "agent,no-rescue"
        IRONIC_BOOT_MODE: uefi
        IRONIC_CALLBACK_TIMEOUT: 800
        IRONIC_GRUB2_SHIM_FILE: https://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/EFI/BOOT/BOOTAA64.EFI
        IRONIC_GRUB2_FILE: https://mirror.stream.centos.org/9-stream/BaseOS/aarch64/os/EFI/BOOT/grubaa64.efi
        IRONIC_HW_ARCH: aarch64
        IRONIC_DIB_RAMDISK_OS: debian-arm64
        IRONIC_VM_SPECS_RAM: 4096
        IRONIC_VM_SPECS_CPU: 1
        IRONIC_VM_COUNT: 1
        IRONIC_VM_VOLUME_COUNT: 2
        # We're using a lot of disk space in this job. Some testing nodes have
        # a small root partition, so use /opt which is mounted from a bigger
        # ephemeral partition on such nodes
        LIBVIRT_STORAGE_POOL_PATH: /opt/libvirt/images
      devstack_services:
        n-api: False
        n-api-meta: False
        n-cond: False
        n-cpu: False
        n-novnc: False
        n-sch: False
        nova: False
        placement-api: False
        s-account: False
        s-container: False
        s-object: False
        s-proxy: False

# NOTE(TheJulia): This job is being phased out as it ends up executing
# the wholedisk standalone deploy, the partition standalone deploy,
# software raid tests, and ramdisk iso boot tests. All of this while in
# UEFI mode. Although the redfish test runs the exact same tests and *more*.
# On top of that, there really is not a good variation which would be
# impacted through IPMI while we keep other ipmi jobs in our CI config.
- job:
    name: ironic-standalone
    description:
      Test ironic standalone configured with ipmi hardware type, ramdisk and
      direct deploy interfaces, rescue enabled.
    parent: ironic-base
    irrelevant-files:
      - ^.*\.rst$
      - ^api-ref/.*$
      - ^doc/.*$
      - ^install-guide/.*$
      - ^ironic/locale/.*$
      - ^ironic/tests/.*$
      - ^redfish-interop-profiles/.*$
      - ^releasenotes/.*$
      - ^setup.cfg$
      - ^test-requirements.txt$
      - ^tools/.*$
      - ^tox.ini$
    vars:
      tempest_test_regex: ironic_standalone
      tempest_concurrency: 2
      devstack_localrc:
        FORCE_CONFIG_DRIVE: False
        IRONIC_AGENT_IMAGE_DOWNLOAD_SOURCE: http
        IRONIC_AUTOMATED_CLEAN_ENABLED: False
        IRONIC_DEFAULT_RESCUE_INTERFACE: agent
        IRONIC_ENABLED_HARDWARE_TYPES: ipmi
        IRONIC_ENABLED_DEPLOY_INTERFACES: "direct,ramdisk"
        IRONIC_ENABLED_RESCUE_INTERFACES: "agent,no-rescue"
        IRONIC_JSON_RPC_AUTH_STRATEGY: 'http_basic'
        IRONIC_RAMDISK_TYPE: tinyipa
        IRONIC_RPC_TRANSPORT: json-rpc
        IRONIC_VM_SPECS_RAM: 1024
        IRONIC_VM_SPECS_CPU: 1
        IRONIC_VM_COUNT: 4
        IRONIC_VM_VOLUME_COUNT: 2
        # We're using a lot of disk space in this job. Some testing nodes have
        # a small root partition, so use /opt which is mounted from a bigger
        # ephemeral partition on such nodes
        LIBVIRT_STORAGE_POOL_PATH: /opt/libvirt/images
      devstack_services:
        n-api: False
        n-api-meta: False
        n-cond: False
        n-cpu: False
        n-novnc: False
        n-sch: False
        nova: False
        placement-api: False
        s-account: False
        s-container: False
        s-object: False
        s-proxy: False

- job:
    name: ironic-standalone-redfish
    parent: ironic-base
    description:
      Test ironic standalone configured with redfish hardware type, ansible and
      direct and ansible deploy interfaces, rescue it's not enabled.
    required-projects:
      - opendev.org/openstack/sushy-tools
    vars:
      tempest_test_regex: ironic_standalone
      tempest_concurrency: 2
      devstack_localrc:
        FORCE_CONFIG_DRIVE: False
        IRONIC_AGENT_IMAGE_DOWNLOAD_SOURCE: http
        IRONIC_AUTOMATED_CLEAN_ENABLED: False
        IRONIC_DEPLOY_DRIVER: redfish
        # NOTE(TheJulia): We test numerous boot interfaces here, but "http"
        # with "grub2" is functionally unstable. Basically high odds of failure
        # with VMs in EFI request handling with VMs.
        # FIXME(dtantsur): add back the pxe interface once it actually works
        # and the boot interface handling in the tempest plugin is fixed.
        IRONIC_ENABLED_BOOT_INTERFACES: "ipxe,redfish-virtual-media,http-ipxe"
        IRONIC_ENABLED_HARDWARE_TYPES: redfish
        IRONIC_ENABLED_POWER_INTERFACES: redfish
        IRONIC_ENABLED_MANAGEMENT_INTERFACES: redfish
        IRONIC_ENABLED_DEPLOY_INTERFACES: "direct,ansible,ramdisk"
        IRONIC_RPC_TRANSPORT: json-rpc
        IRONIC_RAMDISK_TYPE: tinyipa
        IRONIC_VM_COUNT: 4
        IRONIC_VM_VOLUME_COUNT: 2
        IRONIC_VM_SPECS_RAM: 1024
        IRONIC_VM_SPECS_CPU: 1
        IRONIC_ENFORCE_SCOPE: True
        # We're using a lot of disk space in this job. Some testing nodes have
        # a small root partition, so use /opt which is mounted from a bigger
        # ephemeral partition on such nodes
        LIBVIRT_STORAGE_POOL_PATH: /opt/libvirt/images
      devstack_services:
        n-api: False
        n-api-meta: False
        n-cond: False
        n-cpu: False
        n-novnc: False
        n-sch: False
        nova: False
        placement-api: False
        s-account: False
        s-container: False
        s-object: False
        s-proxy: False

- job:
    name: ironic-standalone-anaconda
    parent: ironic-standalone-redfish
    description:
      Test ironic with the anaconda deployment interface.
      Test also uses Redfish.
    required-projects:
      - opendev.org/openstack/sushy-tools
    vars:
      tempest_test_regex: BaremetalRedfishIPxeAnacondaNoGlance
      tempest_test_timeout: 4800
      tempest_concurrency: 2
      devstack_localrc:
        IRONIC_ENABLED_DEPLOY_INTERFACES: "anaconda"
        IRONIC_VM_COUNT: 2
        IRONIC_VM_VOLUME_COUNT: 1
        IRONIC_VM_SPECS_RAM: 3192
        IRONIC_VM_SPECS_CPU: 3
        IRONIC_ENFORCE_SCOPE: True
        # We're using a lot of disk space in this job. Some testing nodes have
        # a small root partition, so use /opt which is mounted from a bigger
        # ephemeral partition on such nodes
        LIBVIRT_STORAGE_POOL_PATH: /opt/libvirt/images
        IRONIC_ANACONDA_IMAGE_REF: https://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/
        IRONIC_ANACONDA_KERNEL_REF: https://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/images/pxeboot/vmlinuz
        IRONIC_ANACONDA_RAMDISK_REF: https://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/images/pxeboot/initrd.img
        IRONIC_ANACONDA_INSECURE_HEARTBEAT: True
        IRONIC_DEPLOY_CALLBACK_WAIT_TIMEOUT: 3600
        IRONIC_PXE_BOOT_RETRY_TIMEOUT: 3600

# NOTE(TheJulia): This job should likely be phased out as the standalone
# job mostly checks the related code paths, the overlap pertinant here is
# BIOS mode, which is not commonly deployed, and the minimum feature set
# flag for the emulator.
- job:
    name: ironic-tempest-bios-redfish-pxe
    description: "Deploy ironic node over PXE using BIOS boot mode"
    parent: ironic-tempest-uefi-redfish-vmedia
    required-projects:
      - opendev.org/openstack/sushy-tools
    vars:
      devstack_localrc:
        IRONIC_ENABLED_BOOT_INTERFACES: ipxe
        IRONIC_TEMPEST_WHOLE_DISK_IMAGE: True
        IRONIC_VM_EPHEMERAL_DISK: 0
        SWIFT_ENABLE_TEMPURLS: False
        SWIFT_TEMPURL_KEY: ''
        # Parent job has a longer timeout due to vmedia usage,
        # Reset the callback to a normal-ish value.
        IRONIC_CALLBACK_TIMEOUT: 600
        IRONIC_BOOT_MODE: bios
        # Make sure this feature works even with the minimum implementation
        IRONIC_REDFISH_EMULATOR_FEATURE_SET: minimum
        # Test sharding support
        IRONIC_SHARDS: 1
      devstack_services:
        # Parent job uses swift, this one does not, thus we can turn it off.
        s-account: False
        s-container: False
        s-object: False
        s-proxy: False

- job:
    name: ironic-tempest-uefi-redfish-vmedia
    description: "Deploy ironic node over Redfish virtual media using UEFI boot mode"
    parent: ironic-base
    vars:
      # NOTE(iurygregory): switch to only wholedisk test, since the
      # partition test is failing randomly.
      tempest_test_regex: test_baremetal_server_ops_wholedisk_image
      devstack_localrc:
        IRONIC_DEPLOY_DRIVER: redfish
        IRONIC_ENABLED_HARDWARE_TYPES: redfish
        IRONIC_ENABLED_POWER_INTERFACES: redfish
        IRONIC_ENABLED_MANAGEMENT_INTERFACES: redfish
        IRONIC_AUTOMATED_CLEAN_ENABLED: False
        IRONIC_ENABLED_BOOT_INTERFACES: redfish-virtual-media
        SWIFT_ENABLE_TEMPURLS: True
        SWIFT_TEMPURL_KEY: secretkey
        # Ironic has to master a new image, and this CAN take longer as a
        # result and makes this job VERY sensitive to heavy disk IO of the
        # underlying hypervisor/cloud.
        IRONIC_CALLBACK_TIMEOUT: 800
        IRONIC_GRUB2_SHIM_FILE: https://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/EFI/BOOT/BOOTX64.EFI
        IRONIC_GRUB2_FILE: https://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/EFI/BOOT/grubx64.efi
        IRONIC_GRUB2_CONFIG_PATH: EFI/BOOT/grub.cfg
        IRONIC_REDFISH_EMULATOR_FEATURE_SET: vmedia
      devstack_services:
        s-account: True
        s-container: True
        s-object: True
        s-proxy: True

- job:
    name: ironic-tempest-uefi-redfish-https
    description: "Deploy ironic node utilizing https boot interface"
    parent: ironic-base
    required-projects:
      - opendev.org/openstack/sushy
      - opendev.org/openstack/sushy-tools
    vars:
      tempest_test_regex: test_baremetal_server_ops_wholedisk_image
      devstack_localrc:
        IRONIC_DEPLOY_DRIVER: redfish
        IRONIC_ENABLED_HARDWARE_TYPES: redfish
        IRONIC_ENABLED_POWER_INTERFACES: redfish
        IRONIC_ENABLED_MANAGEMENT_INTERFACES: redfish
        IRONIC_AUTOMATED_CLEAN_ENABLED: False
        IRONIC_ENABLED_BOOT_INTERFACES: redfish-https
        SWIFT_ENABLE_TEMPURLS: True
        SWIFT_TEMPURL_KEY: secretkey
        # Ironic has to master a new image, and this CAN take longer as a
        # result and makes this job VERY sensitive to heavy disk IO of the
        # underlying hypervisor/cloud.
        IRONIC_CALLBACK_TIMEOUT: 800
        IRONIC_GRUB2_SHIM_FILE: "https://{{ zuul_site_mirror_fqdn }}/centos-stream/9-stream/BaseOS/x86_64/os/EFI/BOOT/BOOTX64.EFI"
        IRONIC_GRUB2_FILE: "https://{{ zuul_site_mirror_fqdn }}/centos-stream/9-stream/BaseOS/x86_64/os/EFI/BOOT/grubx64.efi"
        IRONIC_GRUB2_CONFIG_PATH: EFI/BOOT/grub.cfg
      devstack_services:
        s-account: True
        s-container: True
        s-object: True
        s-proxy: True

- job:
    name: ironic-inspector-tempest-uefi-redfish-vmedia
    description: "Inspect and deploy ironic node over Redfish virtual media using UEFI"
    parent: ironic-tempest-uefi-redfish-vmedia
    required-projects:
      - opendev.org/openstack/ironic-inspector
    vars:
      # NOTE(dtantsur): the inspector job includes booting an instance too.
      # Excluding the abort tests since it hits "node locked" too often.
      tempest_test_regex: test_baremetal_introspection
      devstack_localrc:
        IRONIC_INSPECTOR_MANAGED_BOOT: True
        IRONIC_INSPECTOR_NODE_NOT_FOUND_HOOK: ''
        IRONIC_AUTOMATED_CLEAN_ENABLED: False
        IRONIC_VM_COUNT: 1
      devstack_plugins:
        ironic-inspector: https://opendev.org/openstack/ironic-inspector
      devstack_services:
        ironic-inspector: True
        ironic-inspector-dhcp: True

- job:
    name: ironic-tempest-pxe_ipmitool-postgres
    description: ironic-tempest-pxe_ipmitool-postgres
    parent: ironic-base
    vars:
      devstack_localrc:
        IRONIC_ENABLED_BOOT_INTERFACES: "fake,pxe"
        IRONIC_IPXE_ENABLED: False
        IRONIC_AUTOMATED_CLEAN_ENABLED: False
      devstack_services:
        mysql: False
        postgresql: True

# NOTE(rpittau): converted job but not running for now as there
# could be an issue with the lookup in ironic-python-agent
- job:
    name: ironic-tempest-ipa-wholedisk-bios-agent_ipmitool
    description: Gate-ish job with classic name. Executes rescue!
    parent: ironic-base
    vars:
      devstack_localrc:
        IRONIC_DEFAULT_RESCUE_INTERFACE: agent
        IRONIC_ENABLED_RESCUE_INTERFACES: "fake,agent,no-rescue"
        IRONIC_TEMPEST_WHOLE_DISK_IMAGE: True
        IRONIC_VM_EPHEMERAL_DISK: 0
        IRONIC_VM_SPECS_RAM: 3096
        SWIFT_ENABLE_TEMPURLS: True
        SWIFT_TEMPURL_KEY: secretkey
        IRONIC_BOOT_MODE: bios
      devstack_services:
        s-account: True
        s-container: True
        s-object: True
        s-proxy: True

- job:
    name: ironic-tempest-ramdisk-bios-snmp-pxe
    description: SNMP power, iPXE, OVN, no-op management and whole disk images.
    parent: ironic-base
    vars:
      # NOTE(TheJulia): No reason to go much further than the network boot,
      # Hence the use of the ramdisk test scenario as opposed to the others.
      tempest_test_regex: test_ramdisk_iso
      devstack_localrc:
        IRONIC_ENABLED_HARDWARE_TYPES: snmp
        IRONIC_DEPLOY_DRIVER: snmp
        IRONIC_ENABLED_DEPLOY_INTERFACES: "ramdisk"
        IRONIC_TEMPEST_WHOLE_DISK_IMAGE: True
        IRONIC_VM_EPHEMERAL_DISK: 0
        IRONIC_AUTOMATED_CLEAN_ENABLED: False
        # NOTE(TheJulia): Explicitly set scope enforcement to False until we
        # remove the legacy policies.
        IRONIC_ENFORCE_SCOPE: False
        IRONIC_BOOT_MODE: bios
        Q_AGENT: ovn
        Q_ML2_TENANT_NETWORK_TYPE: vlan
        Q_ML2_PLUGIN_MECHANISM_DRIVERS: ovn
        ENABLE_CHASSIS_AS_GW: True
        ML2_L3_PLUGIN: "ovn-router,trunk"
        OVN_DBS_LOG_LEVEL: dbg
        OVN_BUILD_FROM_SOURCE: True
        Q_BUILD_OVS_FROM_GIT: True
        # NOTE(TheJulia): Ubuntu ships an out of date OVN package, so
        # we need to build from source. These are the minimum versions
        # representing June 2023 release. Ubuntu Kinetic is shipping Q3 2022
        # i.e. OVN 22.09, so likely possible to remove sometime *after*
        # Ubuntu Mantic OVN 2023.03.
        OVN_BRANCH: v23.06.0
        OVS_BRANCH: v3.1.1
      devstack_services:
        q-agt: False
        q-dhcp: False
        q-l3: False
        ovn-controller: True
        ovn-northd: True
        q-ovn-metadata-agent: True
        n-api: False
        n-api-meta: False
        n-cond: False
        n-cpu: False
        n-novnc: False
        n-sch: False
        nova: False
        placement-api: False
        s-account: False
        s-container: False
        s-object: False
        s-proxy: False

- job:
    name: ironic-tempest-ovn-uefi-ipmi-pxe
    description: IPMI power, UEFI, iPXE, OVN image.
    parent: ironic-base
    vars:
      # NOTE(iurygregory): switch to only wholedisk test, since the
      # partition test is failing randomly.
      tempest_test_regex: test_baremetal_server_ops_wholedisk_image
      devstack_localrc:
        IRONIC_AUTOMATED_CLEAN_ENABLED: False
        Q_AGENT: ovn
        Q_ML2_TENANT_NETWORK_TYPE: vlan
        Q_ML2_PLUGIN_MECHANISM_DRIVERS: ovn
        ENABLE_CHASSIS_AS_GW: True
        ML2_L3_PLUGIN: "ovn-router,trunk"
        OVN_DBS_LOG_LEVEL: dbg
        OVN_BUILD_FROM_SOURCE: True
        Q_BUILD_OVS_FROM_GIT: True
        # NOTE(TheJulia): Ubuntu ships an out of date OVN package, so
        # we need to build from source. These are the minimum versions
        # representing June 2023 release. Ubuntu Kinetic is shipping Q3 2022
        # i.e. OVN 22.09, so likely possible to remove sometime *after*
        # Ubuntu Mantic which is OVN 2023.03.
        OVN_BRANCH: v23.06.0
        OVS_BRANCH: v3.1.1
      devstack_services:
        q-agt: False
        q-dhcp: False
        q-l3: False
        ovn-controller: True
        ovn-northd: True
        ovn-vswitchd: True
        q-ovn-metadata-agent: True

- job:
    name: ironic-tempest-bfv
    description: ironic-tempest-bfv
    parent: ironic-base
    vars:
      tempest_test_regex: baremetal_boot_from_volume
      devstack_localrc:
        IRONIC_ENABLED_STORAGE_INTERFACES: cinder,noop
        IRONIC_STORAGE_INTERFACE: cinder
        IRONIC_ENABLED_BOOT_INTERFACES: http-ipxe,ipxe,pxe,fake
        IRONIC_DEFAULT_BOOT_INTERFACE: http-ipxe
        IRONIC_TEMPEST_WHOLE_DISK_IMAGE: True
        IRONIC_VM_EPHEMERAL_DISK: 0
        IRONIC_VM_COUNT: 3
        IRONIC_AUTOMATED_CLEAN_ENABLED: False
        SWIFT_ENABLE_TEMPURLS: True
        SWIFT_TEMPURL_KEY: secretkey
        IRONIC_ENFORCE_SCOPE: True
      devstack_services:
        c-api: True
        c-bak: True
        c-sch: True
        c-vol: True
        cinder: True

- job:
    name: ironic-inspector-tempest
    description: ironic-inspector-tempest
    parent: ironic-base
    required-projects:
      - opendev.org/openstack/ironic-inspector
    irrelevant-files:
      - ^.*\.rst$
      - ^api-ref/.*$
      - ^doc/.*$
      - ^driver-requirements.txt$
      - ^install-guide/.*$
      - ^ironic/locale/.*$
      - ^ironic/tests/.*$
      # This job is also run on inspector
      - ^ironic_inspector/locale/.*$
      - ^ironic_inspector/test/.*$
      - ^redfish-interop-profiles/.*$
      - ^releasenotes/.*$
      - ^setup.cfg$
      - ^test-requirements.txt$
      - ^tools/.*$
      - ^tox.ini$
    vars:
      tempest_test_regex: InspectorBasicTest
      devstack_localrc:
        IRONIC_INSPECTOR_MANAGE_FIREWALL: True
        IRONIC_TEMPEST_WHOLE_DISK_IMAGE: True
        IRONIC_VM_EPHEMERAL_DISK: 0
        IRONIC_VM_COUNT: 1
        IRONIC_AUTOMATED_CLEAN_ENABLED: False
        SWIFT_ENABLE_TEMPURLS: True
        SWIFT_TEMPURL_KEY: secretkey
      devstack_plugins:
        ironic-inspector: https://opendev.org/openstack/ironic-inspector
      devstack_services:
        s-account: True
        s-container: True
        s-object: True
        s-proxy: True

- job:
    name: ironic-inspector-tempest-rbac-scope-enforced
    description: ironic-inspector-tempest-rbac-scope-enforced
    parent: ironic-inspector-tempest
    required-projects:
      - openstack/ironic-inspector
    vars:
      devstack_localrc:
        IRONIC_ENFORCE_SCOPE: True
        IRONIC_INSPECTOR_ENFORCE_SCOPE: True

- job:
    name: ironic-tempest-functional-python3
    description: ironic-tempest-functional-python3
    parent: ironic-base
    pre-run: playbooks/ci-workarounds/etc-neutron.yaml
    vars:
      tempest_test_regex: ironic_tempest_plugin.tests.api
      devstack_localrc:
        IRONIC_BAREMETAL_BASIC_OPS: False
        IRONIC_DEFAULT_DEPLOY_INTERFACE: ""
        IRONIC_DEFAULT_NETWORK_INTERFACE: noop
        IRONIC_TEMPEST_WHOLE_DISK_IMAGE: True
        IRONIC_VM_EPHEMERAL_DISK: 0
        IRONIC_RPC_TRANSPORT: json-rpc
      devstack_services:
        rabbit: True
        g-api: False
        n-api: False
        n-api-meta: False
        n-cond: False
        n-cpu: False
        n-novnc: False
        n-sch: False
        nova: False
        placement-api: False
        # NOTE(TheJulia): This job runs neutron so neutron dependent
        # tests can also exercised as part of CI.
- job:
    name: ironic-tempest-functional-rbac-scope-enforced
    description: ironic-tempest-funcitonal-rbac-scope-enforced
    parent: ironic-tempest-functional-python3
    vars:
      devstack_localrc:
        IRONIC_ENFORCE_SCOPE: True

- job:
    name: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode
    description: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode
    parent: tempest-multinode-full-base
    nodeset: openstack-two-node-jammy
    pre-run: playbooks/ci-workarounds/pre.yaml
    required-projects:
      - opendev.org/openstack/ironic
      - opendev.org/openstack/ironic-python-agent
      - opendev.org/openstack/ironic-python-agent-builder
      - opendev.org/openstack/ironic-tempest-plugin
      - opendev.org/openstack/virtualbmc
      - opendev.org/openstack/networking-generic-switch
    irrelevant-files:
      - ^.*\.rst$
      - ^api-ref/.*$
      - ^doc/.*$
      - ^driver-requirements.txt$
      - ^install-guide/.*$
      - ^ironic/locale/.*$
      - ^ironic/tests/.*$
      - ^redfish-interop-profiles/.*$
      - ^releasenotes/.*$
      - ^setup.cfg$
      - ^tools/.*$
      - ^tox.ini$
    roles:
      - zuul: opendev.org/zuul/zuul-jobs
    vars:
      tox_envlist: all
      tempest_concurrency: 3
      tempest_test_regex: "ironic_tempest_plugin.tests.scenario"
      tempest_test_timeout: 2400
      devstack_localrc:
        BUILD_TIMEOUT: 2400
        DEFAULT_INSTANCE_TYPE: baremetal
        ENABLE_TENANT_TUNNELS: False
        ENABLE_TENANT_VLANS: True
        FORCE_CONFIG_DRIVE: True
        GENERIC_SWITCH_KEY_FILE: /opt/stack/.ssh/id_rsa
        HOST_TOPOLOGY: multinode
        HOST_TOPOLOGY_ROLE: primary
        INSTALL_TEMPEST: False # Don't install a tempest package globally
        IRONIC_AUTOMATED_CLEAN_ENABLED: False
        HOST_TOPOLOGY_SUBNODES: "{{ hostvars['compute1']['nodepool']['public_ipv4'] }}"
        IRONIC_BAREMETAL_BASIC_OPS: True
        IRONIC_BUILD_DEPLOY_RAMDISK: False
        IRONIC_CALLBACK_TIMEOUT: 600
        IRONIC_DEPLOY_DRIVER: ipmi
        IRONIC_ENABLED_NETWORK_INTERFACES: flat,neutron
        IRONIC_INSPECTOR_BUILD_RAMDISK: False
        IRONIC_NETWORK_INTERFACE: neutron
        IRONIC_PROVISION_NETWORK_NAME: ironic-provision
        IRONIC_PROVISION_SUBNET_GATEWAY: 10.0.5.1
        IRONIC_PROVISION_SUBNET_PREFIX: 10.0.5.0/24
        IRONIC_RAMDISK_TYPE: tinyipa
        IRONIC_TEMPEST_BUILD_TIMEOUT: 600
        IRONIC_TEMPEST_WHOLE_DISK_IMAGE: True
        IRONIC_USE_LINK_LOCAL: True
        IRONIC_VM_COUNT: 3
        IRONIC_VM_EPHEMERAL_DISK: 0
        IRONIC_VM_LOG_DIR: '{{ devstack_base_dir }}/ironic-bm-logs'
        IRONIC_VM_SPECS_RAM: 1024
        IRONIC_VM_SPECS_DISK: 4
        IRONIC_VM_SPECS_CPU: 1
        OVS_BRIDGE_MAPPINGS: 'mynetwork:brbm,public:br-infra'
        OVS_PHYSICAL_BRIDGE: brbm
        PHYSICAL_NETWORK: mynetwork
        PUBLIC_BRIDGE: br-infra
        Q_AGENT: openvswitch
        Q_ML2_TENANT_NETWORK_TYPE: vlan
        Q_PLUGIN: ml2
        Q_ML2_PLUGIN_MECHANISM_DRIVERS: openvswitch
        SWIFT_ENABLE_TEMPURLS: True
        SWIFT_TEMPURL_KEY: secretkey
        TENANT_VLAN_RANGE: 100:150
        VIRT_DRIVER: ironic
        # We're using a lot of disk space in this job. Some testing nodes have
        # a small root partition, so use /opt which is mounted from a bigger
        # ephemeral partition on such nodes
        LIBVIRT_STORAGE_POOL_PATH: /opt/libvirt/images

      devstack_plugins:
        ironic: https://opendev.org/openstack/ironic
        networking-generic-switch: https://opendev.org/openstack/networking-generic-switch
      tempest_plugins:
        - ironic-tempest-plugin
      zuul_copy_output:
        '{{ devstack_base_dir }}/ironic-bm-logs': 'logs'
        '{{ devstack_base_dir }}/data/networking-generic-switch/netmiko_session.log': 'logs'
      devstack_services:
        c-api: False
        c-bak: False
        c-sch: False
        c-vol: False
        cinder: False

        s-account: True
        s-container: True
        s-object: True
        s-proxy: True

        dstat: True
        g-api: True
        key: True
        mysql: True
        n-api: True
        n-api-meta: True
        n-cond: True
        n-cpu: True
        n-novnc: True
        n-sch: True
        placement-api: True
        q-agt: True
        q-dhcp: True
        q-l3: True
        q-meta: True
        q-metering: True
        q-svc: True
        ovn-controller: False
        ovn-northd: False
        q-ovn-metadata-agent: False
        rabbit: True
    group-vars:
      subnode:
        devstack_localrc:
          ENABLE_TENANT_TUNNELS: False
          ENABLE_TENANT_VLANS: True
          FORCE_CONFIG_DRIVE: True
          HOST_TOPOLOGY: multinode
          HOST_TOPOLOGY_ROLE: subnode
          IRONIC_AUTOMATED_CLEAN_ENABLED: False
          IRONIC_BAREMETAL_BASIC_OPS: True
          IRONIC_DEPLOY_DRIVER: ipmi
          IRONIC_ENABLED_NETWORK_INTERFACES: flat,neutron
          IRONIC_NETWORK_INTERFACE: neutron
          IRONIC_PROVISION_NETWORK_NAME: ironic-provision
          IRONIC_RAMDISK_TYPE: tinyipa
          IRONIC_USE_LINK_LOCAL: True
          IRONIC_VM_COUNT: 3
          IRONIC_VM_EPHEMERAL_DISK: 0
          IRONIC_VM_LOG_DIR: '{{ devstack_base_dir }}/ironic-bm-logs'
          IRONIC_VM_NETWORK_BRIDGE: sub1brbm
          IRONIC_VM_SPECS_RAM: 1024
          IRONIC_VM_SPECS_DISK: 4
          IRONIC_VM_SPECS_CPU: 1
          OVS_BRIDGE_MAPPINGS: 'mynetwork:sub1brbm,public:br-infra'
          OVS_PHYSICAL_BRIDGE: sub1brbm
          PHYSICAL_NETWORK: mynetwork
          Q_AGENT: openvswitch
          Q_ML2_TENANT_NETWORK_TYPE: vlan
          VIRT_DRIVER: ironic
          PUBLIC_BRIDGE: br-infra
          LIBVIRT_STORAGE_POOL_PATH: /opt/libvirt/images
        devstack_services:
          c-api: False
          c-bak: False
          c-sch: False
          c-vol: False
          cinder: False

          q-agt: True
          ovn-controller: False
          ovn-northd: False
          q-ovn-metadata-agent: False
          n-cpu: True

- job:
    # NOTE(JayF) This job sets up two nova-computes with two different shards
    # TODO(JayF) Add a post-run validation to ensure the two n-cpus did not
    #            see each others' nodes
    name: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode-shard
    description: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode-shard
    parent: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode
    nodeset: openstack-two-node-jammy
    vars:
      tempest_test_regex: "BaremetalBasicOps"
      devstack_localrc:
        IRONIC_SHARDS: 1
        IRONIC_SHARD_1_NAME: "main-node"
    group-vars:
      subnode:
        devstack_localrc:
          IRONIC_SHARDS: 1
          IRONIC_SHARD_1_NAME: "subnode"

- job:
    name: ironic-tox-unit-with-driver-libs
    parent: openstack-tox
    description: |
      Run python 3 unit tests with driver dependencies installed.
    vars:
      tox_envlist: unit-with-driver-libs

- job:
    name: ironic-tox-unit-mysql-migrations
    parent: openstack-tox
    description: |
      Run MySQL based data model migrations separate to isolate failures.
    vars:
      tox_envlist: mysql-migrations

- job:
    name: ironic-inspector-tempest-discovery-fast-track
    description: ironic-inspector-tempest-discovery-fast-track
    parent: ironic-inspector-tempest-discovery
    vars:
      tempest_test_regex: BareMetalFastTrackTest
      devstack_localrc:
        IRONIC_INSPECTOR_POWER_OFF: False
        IRONIC_DEPLOY_FAST_TRACK: True
        IRONIC_DEPLOY_FAST_TRACK_CLEANING: True

- job:
    name: ironic-tempest-ipa-partition-uefi-pxe-grub2
    description: Ironic tempest scenario test utilizing PXE, UEFI, and Grub2
    parent: ironic-base
    vars:
      devstack_localrc:
        IRONIC_ENABLED_HARDWARE_TYPES: ipmi
        IRONIC_ENABLED_BOOT_INTERFACES: pxe
        IRONIC_IPXE_ENABLED: False
        IRONIC_RAMDISK_TYPE: tinyipa
        IRONIC_AUTOMATED_CLEAN_ENABLED: False

- job:
    name: ironic-tempest-ipa-wholedisk-bios-ipmi-direct-dib
    parent: ironic-base
    vars:
      devstack_services:
        s-account: True
        s-container: True
        s-object: True
        s-proxy: True
      devstack_localrc:
        IRONIC_DIB_RAMDISK_OS: centos9
        IRONIC_TEMPEST_WHOLE_DISK_IMAGE: True
        IRONIC_VM_EPHEMERAL_DISK: 0
        IRONIC_VM_INTERFACE_COUNT: 1
        IRONIC_AUTOMATED_CLEAN_ENABLED: False
        SWIFT_ENABLE_TEMPURLS: True
        SWIFT_TEMPURL_KEY: secretkey
        IRONIC_BOOT_MODE: bios

- job:
    name: ironic-tempest-ipxe-ipv6
    description: ironic-tempest-ipxe-ipv6
    parent: ironic-base
    required-projects:
      - opendev.org/openstack/networking-generic-switch
    vars:
      tempest_test_timeout: 2400
      devstack_services:
        # NOTE(TheJulia): It seems our devstack plugin does not play well
        # with multitenancy and the newer neutron service names.
        q-agt: True
        q-dhcp: True
        q-l3: True
        q-meta: False
        q-metering: False
        q-svc: True
        swift: True
      devstack_plugins:
        ironic: https://opendev.org/openstack/ironic
        networking-generic-switch: https://opendev.org/openstack/networking-generic-switch
      # NOTE(TheJulia): Nova default behavior is to rely upon stack defaults, v6 needs to
      # be explicit. This is the best place to wire it in.
      tempest_test_regex: BaremetalSingleTenant
      devstack_localrc:
        IRONIC_AGENT_IMAGE_DOWNLOAD_SOURCE: http
        IPV6_ENABLED: True
        IRONIC_IP_VERSION: 6
        IRONIC_AUTOMATED_CLEAN_ENABLED: False
        IRONIC_ENABLED_BOOT_INTERFACES: ipxe,pxe
        IRONIC_DEFAULT_BOOT_INTERFACE: ipxe
        IRONIC_IPXE_ENABLED: True
        IRONIC_PROVISION_NETWORK_NAME: ironic-provision
        OVS_PHYSICAL_BRIDGE: brbm
        PHYSICAL_NETWORK: mynetwork
        TENANT_VLAN_RANGE: 100:150
        IRONIC_ENABLED_NETWORK_INTERFACES: flat,neutron
        IRONIC_NETWORK_INTERFACE: neutron
        IRONIC_DEFAILT_RESCUE_INTERFACE: no-rescue
        IRONIC_USE_LINK_LOCAL: True
        IRONIC_TEMPEST_WHOLE_DISK_IMAGE: True
        IRONIC_VM_EPHEMERAL_DISK: 0
        IRONIC_VM_INTERFACE_COUNT: 1
        # This will swap and needs to get to tinycore soon.
        IRONIC_VM_SPECS_CPU: 2
        Q_PLUGIN: ml2
        ENABLE_TENANT_VLANS: True
        Q_ML2_TENANT_NETWORK_TYPE: vlan
        OVS_BRIDGE_MAPPINGS: "public:br-ex,mynetwork:brbm"
        USE_PROVIDER_NETWORKING: True
        PUBLIC_PHYSICAL_NETWORK: public
        PUBLIC_PROVIDERNET_TYPE: flat
        Q_USE_PROVIDERNET_FOR_PUBLIC: True
        BUILD_TIMEOUT: 2000
        IRONIC_TEMPEST_BUILD_TIMEOUT: 2000
        IRONIC_PING_TIMEOUT: 1440
        # TODO(TheJulia): Change this to UEFI once we have Ubuntu Jammy
        # as it auto-attempts to UEFI boot PXE v4 and PXE v6. Prior just
        # does IPv4 and we cannot easily edit the nvram to inject just v6.
        # TODO(TheJulia): The devstack plugin also needs to be changed to
        # dhcpv6-stateful instead of stateless when this is changed to UEFI
        # as OVMF/E2DK does not support stateless.
        IRONIC_BOOT_MODE: bios


# NOTE(rpittau): OLD TINYIPA JOBS
# Those jobs are used by other projects, we leave them here until
# we can convert them to dib.

# Used by devstack/ironic/nova/neutron
- job:
    name: ironic-tempest-bios-ipmi-direct-tinyipa
    description: ironic-tempest-wholedisk-bios-ipmi-direct-tinyipa that also tests cleaning.
    parent: ironic-base
    vars:
      devstack_localrc:
        IRONIC_DEFAULT_RESCUE_INTERFACE: agent
        IRONIC_ENABLED_RESCUE_INTERFACES: "fake,agent,no-rescue"
        IRONIC_RAMDISK_TYPE: tinyipa
        IRONIC_VM_SPECS_RAM: 1024
        IRONIC_TEMPEST_WHOLE_DISK_IMAGE: True
        IRONIC_VM_EPHEMERAL_DISK: 0
        SWIFT_ENABLE_TEMPURLS: True
        SWIFT_TEMPURL_KEY: secretkey
        IRONIC_BOOT_MODE: bios
      devstack_services:
        s-account: True
        s-container: True
        s-object: True
        s-proxy: True

- job:
    name: ironic-tempest-ipa-wholedisk-bios-agent_ipmitool-tinyipa
    description: Alias for ironic-tempest-wholedisk-bios-ipmi-direct-tinyipa
    parent: ironic-tempest-bios-ipmi-direct-tinyipa

- job:
    name: ironic-tempest-uefi-redfish-vmedia-4k
    description: "Build 4k disk artifacts with 4k VMs"
    parent: ironic-tempest-uefi-redfish-vmedia
    vars:
      tempest_test_timeout: 2800
      devstack_localrc:
        # NOTE(TheJulia): This job takes a while because it is blending
        # vmedia *and* 4k block device layouts which requires mastering and
        # streaming a real image as opposed to cirros.
        BUILD_TIMEOUT: 2400
        IRONIC_AUTOMATED_CLEAN_ENABLED: False
        IRONIC_VM_COUNT: 1
        IRONIC_VM_SPECS_DISK: 20
        IRONIC_VM_BLOCK_SIZE: 4096
        IRONIC_BUILD_DIB_IMAGE: True
        SWIFT_ENABLE_TEMPURLS: False
        # This job by defaults deploys a dib cirros image,
        # and to do so, the instance user is not cirros.
        DEFAULT_INSTANCE_USER: "cloud-user"
        IRONIC_DEFAULT_RESCUE_INTERFACE: "no-rescue"
        IRONIC_ENABLED_RESCUE_INTERFACES: "fake,no-rescue"

- job:
    name: ironic-grenade
    parent: grenade
    timeout: 10800
    irrelevant-files:
      - ^driver-requirements.txt$
      - ^.*\.rst$
      - ^api-ref/.*$
      - ^doc/.*$
      - ^install-guide/.*$
      - ^ironic/locale/.*$
      - ^ironic/tests/.*$
      - ^redfish-interop-profiles/.*$
      - ^releasenotes/.*$
      - ^setup.cfg$
      - ^tools/.*$
      - ^tox.ini$
    required-projects:
      - opendev.org/openstack/grenade
      - opendev.org/openstack/ironic
      - opendev.org/openstack/ironic-python-agent
      - opendev.org/openstack/ironic-python-agent-builder
      - opendev.org/openstack/ironic-tempest-plugin
      - opendev.org/openstack/virtualbmc
    vars:
      grenade_devstack_localrc:
        shared:
          #NOTE: when in UEFI mode, TFTP packets don't get tracked nor
          #pass between original and upgrade networks. Switch to BIOS
          #until we can fix this properly.
          IRONIC_BOOT_MODE: bios
          DEFAULT_INSTANCE_TYPE: baremetal
          FORCE_CONFIG_DRIVE: True
          INSTALL_TEMPEST: False
          VIRT_DRIVER: ironic
          BUILD_TIMEOUT: 1200
          IRONIC_TEMPEST_BUILD_TIMEOUT: 1200
          IRONIC_BAREMETAL_BASIC_OPS: True
          IRONIC_BUILD_DEPLOY_RAMDISK: False
          IRONIC_CALLBACK_TIMEOUT: 600
          IRONIC_DEPLOY_DRIVER: ipmi
          IRONIC_INSPECTOR_BUILD_RAMDISK: False
          IRONIC_RAMDISK_TYPE: tinyipa
          IRONIC_TEMPEST_WHOLE_DISK_IMAGE: True
          IRONIC_VM_COUNT: 4
          IRONIC_VM_EPHEMERAL_DISK: 0
          IRONIC_VM_SPECS_RAM: 1024
          IRONIC_AUTOMATED_CLEAN_ENABLED: False
          Q_AGENT: openvswitch
          Q_ML2_TENANT_NETWORK_TYPE: vxlan
          Q_ML2_PLUGIN_MECHANISM_DRIVERS: openvswitch
          SWIFT_ENABLE_TEMPURLS: True
          SWIFT_TEMPURL_KEY: secretkey
          EBTABLES_RACE_FIX: True
          LIBVIRT_STORAGE_POOL_PATH: /opt/libvirt/images
          INSTANCE_WAIT: 120
          MYSQL_GATHER_PERFORMANCE: False
          CIRROS_VERSION: 0.6.1
          # Required as different access rights are used by default
          # and the classic devstack config which is defaulted doesn't work.
          IRONIC_ENFORCE_SCOPE: True
        old:
          IRONIC_VM_LOG_DIR: '{{ devstack_bases.old }}/ironic-bm-logs'
      grenade_localrc:
        BASE_RUN_SMOKE: False
      grenade_tempest_concurrency: 1
      grenade_test_timeout: 2600
      devstack_plugins:
        ironic: https://opendev.org/openstack/ironic
      devstack_services:
        c-api: False
        c-bak: False
        c-sch: False
        c-vol: False
        cinder: False
        ir-api: True
        ir-cond: True
        # Neutron services
        # In the Ironic grenade job we want to explicitly enable ML2/OVS agents
        # and disable OVN
        q-agt: true
        q-dhcp: true
        q-l3: true
        q-meta: true
        q-svc: true
        q-metering: true
        ovn-controller: false
        ovn-northd: false
        q-ovn-metadata-agent: false
      tempest_plugins:
        - ironic-tempest-plugin
      tempest_test_regex: ironic_tempest_plugin.tests.scenario
      tox_envlist: all
      tempest_concurrency: 1
      zuul_copy_output:
        '{{ devstack_bases.old }}/ironic-bm-logs': logs

- job:
    name: ironic-grenade-multinode-multitenant
    parent: grenade-multinode
    timeout: 10800
    irrelevant-files:
      - ^driver-requirements.txt$
      - ^.*\.rst$
      - ^api-ref/.*$
      - ^doc/.*$
      - ^install-guide/.*$
      - ^ironic/locale/.*$
      - ^ironic/tests/.*$
      - ^redfish-interop-profiles/.*$
      - ^releasenotes/.*$
      - ^setup.cfg$
      - ^tools/.*$
      - ^tox.ini$
    required-projects:
      - opendev.org/openstack/grenade
      - opendev.org/openstack/ironic
      - opendev.org/openstack/ironic-lib
      - opendev.org/openstack/ironic-python-agent
      - opendev.org/openstack/ironic-python-agent-builder
      - opendev.org/openstack/ironic-tempest-plugin
      - opendev.org/openstack/networking-generic-switch
      - opendev.org/openstack/python-ironicclient
      - opendev.org/openstack/virtualbmc
    vars:
      grenade_devstack_localrc:
        shared:
          DEFAULT_INSTANCE_TYPE: baremetal
          ENABLE_TENANT_TUNNELS: False
          ENABLE_TENANT_VLANS: True
          FORCE_CONFIG_DRIVE: True
          HOST_TOPOLOGY: multinode
          HOST_TOPOLOGY_ROLE: primary
          BUILD_TIMEOUT: 1200
          INSTALL_TEMPEST: False # Don't install a tempest package globally
          HOST_TOPOLOGY_SUBNODES: "{{ hostvars['compute1']['nodepool']['public_ipv4'] }}"
          IRONIC_BAREMETAL_BASIC_OPS: True
          IRONIC_AUTOMATED_CLEAN_ENABLED: False
          IRONIC_BUILD_DEPLOY_RAMDISK: False
          IRONIC_CALLBACK_TIMEOUT: 700
          IRONIC_DEFAULT_DEPLOY_INTERFACE: direct
          IRONIC_DEPLOY_DRIVER: ipmi
          IRONIC_VM_COUNT: 4
          IRONIC_VM_EPHEMERAL_DISK: 1
          IRONIC_VM_SPECS_RAM: 1024
          IRONIC_RAMDISK_TYPE: tinyipa
          IRONIC_TEMPEST_BUILD_TIMEOUT: 1200
          IRONIC_TEMPEST_WHOLE_DISK_IMAGE: True

          IRONIC_ENABLED_NETWORK_INTERFACES: flat,neutron
          IRONIC_NETWORK_INTERFACE: neutron
          IRONIC_PROVISION_NETWORK_NAME: ironic-provision
          IRONIC_PROVISION_SUBNET_GATEWAY: 10.0.5.1
          IRONIC_PROVISION_SUBNET_PREFIX: 10.0.5.0/24
          IRONIC_USE_LINK_LOCAL: True
          OVS_BRIDGE_MAPPINGS: 'mynetwork:brbm,public:br-infra'
          OVS_PHYSICAL_BRIDGE: brbm
          PHYSICAL_NETWORK: mynetwork
          PUBLIC_BRIDGE: br-infra
          Q_AGENT: openvswitch
          Q_ML2_TENANT_NETWORK_TYPE: vlan
          Q_PLUGIN: ml2
          SWIFT_ENABLE_TEMPURLS: True
          SWIFT_TEMPURL_KEY: secretkey
          TENANT_VLAN_RANGE: 100:150
          VIRT_DRIVER: ironic
          EBTABLES_RACE_FIX: True
          LIBVIRT_STORAGE_POOL_PATH: /opt/libvirt/images
          IRONIC_VM_LOG_DIR: '/opt/stack/ironic-bm-logs'
      grenade_localrc:
        BASE_RUN_SMOKE: False
      devstack_plugins:
        ironic: https://opendev.org/openstack/ironic
        networking-generic-switch: https://opendev.org/openstack/networking-generic-switch
      devstack_services:
        c-api: False
        c-bak: False
        c-sch: False
        c-vol: False
        cinder: False
        ir-api: True
        ir-cond: True
      tempest_plugins:
        - ironic-tempest-plugin
      tempest_test_regex: BaremetalMultitenancy
      tox_envlist: all
      tempest_concurrency: 1
      grenade_tempest_concurrency: 1
      grenade_test_timeout: 2600
      zuul_copy_output:
        '/opt/stack/ironic-bm-logs': logs
        '{{ devstack_base_dir }}/data/networking-generic-switch/netmiko_session.log': 'logs'
    group-vars:
      subnode:
        devstack_plugins:
          ironic: https://opendev.org/openstack/ironic
          networking-generic-switch: https://opendev.org/openstack/networking-generic-switch
        devstack_services:
          c-api: False
          c-bak: False
          c-sch: False
          c-vol: False
          cinder: False
          g-api: True
          ir-api: True
          ir-cond: True
          n-cpu: True
          q-agt: True
          virtualbmc: True
        grenade_devstack_localrc:
          shared:
            DEFAULT_INSTANCE_TYPE: baremetal
            ENABLE_TENANT_TUNNELS: False
            ENABLE_TENANT_VLANS: True
            FORCE_CONFIG_DRIVE: True
            HOST_TOPOLOGY: multinode
            HOST_TOPOLOGY_ROLE: subnode
            IRONIC_AUTOMATED_CLEAN_ENABLED: False
            IRONIC_BAREMETAL_BASIC_OPS: True
            IRONIC_BUILD_DEPLOY_RAMDISK: False
            BUILD_TIMEOUT: 1200
            IRONIC_CALLBACK_TIMEOUT: 700
            IRONIC_TEMPEST_BUILD_TIMEOUT: 1200
            IRONIC_DEFAULT_DEPLOY_INTERFACE: direct
            IRONIC_DEPLOY_DRIVER: ipmi
            IRONIC_ENABLED_NETWORK_INTERFACES: flat,neutron
            IRONIC_NETWORK_INTERFACE: neutron
            IRONIC_PROVISION_NETWORK_NAME: ironic-provision
            IRONIC_PROVISION_SUBNET_GATEWAY: 10.0.5.1
            IRONIC_PROVISION_SUBNET_PREFIX: 10.0.5.0/24
            IRONIC_RAMDISK_TYPE: tinyipa
            IRONIC_USE_LINK_LOCAL: True
            IRONIC_VM_COUNT: 4
            IRONIC_VM_EPHEMERAL_DISK: 0
            IRONIC_VM_SPECS_RAM: 1024
            IRONIC_VM_NETWORK_BRIDGE: sub1brbm
            OVS_BRIDGE_MAPPINGS: 'mynetwork:sub1brbm,public:br-infra'
            OVS_PHYSICAL_BRIDGE: sub1brbm
            PHYSICAL_NETWORK: mynetwork
            PUBLIC_BRIDGE: br-infra
            Q_AGENT: openvswitch
            Q_ML2_TENANT_NETWORK_TYPE: vlan
            Q_PLUGIN: ml2
            SWIFT_ENABLE_TEMPURLS: True
            SWIFT_TEMPURL_KEY: secretkey
            VIRT_DRIVER: ironic
            EBTABLES_RACE_FIX: True
            LIBVIRT_STORAGE_POOL_PATH: /opt/libvirt/images
            IRONIC_VM_LOG_DIR: '/opt/stack/ironic-bm-logs'

- job:
    name: ironic-cross-sushy
    nodeset: ubuntu-jammy
    description: Ironic unit tests run with Sushy from source
    parent: openstack-tox
    required-projects:
      - opendev.org/openstack/ironic
      - opendev.org/openstack/sushy
    irrelevant-files:
      - ^.*\.rst$
      - ^api-ref/.*$
      - ^devstack/.*$
      - ^doc/.*$
      - ^releasenotes/.*$
      - ^tools/.*$
    vars:
      # NOTE(dtantsur): change this every release cycle if needed.
      bindep_profile: test py310
      tox_envlist: py310
      # This variable ensures that sushy is installed from source.
      tox_install_siblings: true
      # NOTE(dtantsur): this job will be run on sushy as well, so it's
      # important to set the working dir to the Ironic checkout.
      zuul_work_dir: "{{ ansible_user_dir }}/{{ zuul.projects['opendev.org/openstack/ironic'].src_dir }}"

- job:
    name: ironic-grenade-skip-level
    parent: ironic-grenade
    vars:
      grenade_from_branch: stable/zed
      grenade_to_branch: master
      grenade_localrc:
        # NOTE(iurygregory): This is required for skip upgrades.
        NOVA_ENABLE_UPGRADE_WORKAROUND: True