diff --git a/devstack/lib/ironic b/devstack/lib/ironic index 4b4a06d3f6..72891bf96b 100644 --- a/devstack/lib/ironic +++ b/devstack/lib/ironic @@ -212,6 +212,12 @@ if [[ "$hostdomain" =~ "rax" ]] || [[ "$hostdomain" =~ "iweb" ]]; then # we should make a helper method... fi +# DO NOT MODIFY/SET +# NOTE(TheJulia): These settings are for virtual media based testing, and +# the need to send traffic *back* to the host. The subnet ID is dynamic, +# the IP needs to be within the floating IP range. +PUBLIC_SUBNET_ID="" +PUBLIC_SUBNET_IP="172.24.5.250" # Oslo Policy enforcement for Scope and new policy enforcement. IRONIC_ENFORCE_SCOPE=$(trueorfalse True IRONIC_ENFORCE_SCOPE) @@ -348,6 +354,10 @@ fi IRONIC_DIB_RAMDISK_OS=${IRONIC_DIB_RAMDISK_OS:-centos9} IRONIC_DIB_RAMDISK_RELEASE=${IRONIC_DIB_RAMDISK_RELEASE:-} +# OS for building images in CI +IRONIC_DIB_OS=${IRONIC_DIB_RAMDISK_OS:-centos9} +IRONIC_DIB_RELEASE=${IRONIC_DIB_RAMDISK_RELEASE:-} + # Configure URLs required to download ramdisk if we're not building it, and # IRONIC_DEPLOY_RAMDISK/KERNEL or the RAMDISK/KERNEL_URLs have not been # preconfigured. @@ -2561,6 +2571,13 @@ SUBSHELL # Route back to our test subnet. Static should be safe for a while. sudo ip -6 route add fd00::/8 via $IPV6_ROUTER_GW_IP fi + + # NOTE(TheJulia): Getting the subnet_id might need additional logic + # behind it, should also just generally work. + PUBLIC_SUBNET_ID=$(openstack router show $Q_ROUTER_NAME -c external_gateway_info -f json | jq -r .external_gateway_info.external_fixed_ips[0].subnet_id) + # Add a route for dhcp-less return path traffic + sudo ip route add 10.0.6.0/24 via $PUBLIC_SUBNET_IP + if [[ "${IRONIC_NETWORK_SIMULATOR:-ovs}" != "ovs" ]]; then create_network_simulator fi @@ -3849,6 +3866,7 @@ function build_ipa_dib_ramdisk { fi git_clone $IRONIC_PYTHON_AGENT_BUILDER_REPO $IRONIC_PYTHON_AGENT_BUILDER_DIR $IRONIC_PYTHON_AGENT_BUILDER_BRANCH ELEMENTS_PATH="$IRONIC_PYTHON_AGENT_BUILDER_DIR/dib" \ + DIB_CLOUD_INIT_DATASOURCES="ConfigDrive,openstack" \ DIB_DHCP_TIMEOUT=$IRONIC_DIB_DHCP_TIMEOUT \ DIB_RELEASE=$IRONIC_DIB_RAMDISK_RELEASE \ DIB_REPOLOCATION_ironic_python_agent="$IRONIC_PYTHON_AGENT_DIR" \ @@ -3869,6 +3887,45 @@ function build_ipa_dib_ramdisk { rm -rf $tempdir } +function build_wholedisk_image { + local img_path=$1 + local tempdir + tempdir=$(mktemp -d --tmpdir=${DEST}) + + # install diskimage-builder if not present + if ! $(type -P disk-image-create > /dev/null); then + install_diskimage_builder + fi + + echo "Building wholedisk DIB image options: $IRONIC_DIB_OPTIONS block-device-efi bootloader" + # Build a bootable UEFI image iniit tooling . + DIB_DHCP_TIMEOUT=$IRONIC_DIB_DHCP_TIMEOUT \ + DIB_RELEASE=$IRONIC_DIB_RELEASE \ + DIB_SIMPLE_INIT_NO_DHCP_FALLBACK=1 \ + DIB_CLOUD_INIT_DATASOURCES="ConfigDrive,openstack" \ + disk-image-create "$IRONIC_DIB_OPTIONS" block-device-efi bootloader \ + -x -o "$tempdir/wholedisk" + chmod -R +r $tempdir + mv "$tempdir/wholedisk.qcow2" "$img_path" + rm -rf $tempdir +} + +function upload_baremetal_ironic_wholedisk { + disk_img=$1 + disk_img_name=$2 + + if [[ "$HOST_TOPOLOGY_ROLE" != "subnode" ]]; then + echo_summary "Uploading baremetal images for ironic" + wholedisk_image_id=$(openstack --os-cloud devstack-admin \ + image create \ + $(basename $disk_img_name) \ + --public --disk-format=qcow2 \ + --container-format=bare \ + --file $(readlink -f "$disk_img") -f value -c id) + die_if_not_set $LINENO wholedisk_image_id "Failed to load wholedisk image into glance" + fi +} + function build_dib_image { local target_path=$1 local tempdir @@ -4096,10 +4153,17 @@ function prepare_baremetal_basic_ops { if [[ "$IRONIC_BAREMETAL_BASIC_OPS" != "True" ]]; then return 0 fi - + if [[ "${IRONIC_BUILD_WHOLEDISK:-False}" == "True" ]]; then + local dib_file_path + dib_file_path=$FILES/ironic-wholedisk-image.qcow2 + build_wholedisk_image $dib_file_path + echo "WARNING: Overriding supplied IRONIC_WHOLEDISK_IMAGE_NAME as we have built an image as requested." + IRONIC_WHOLEDISK_IMAGE_NAME="ironic-wholedisk-image.qcow2" + upload_baremetal_ironic_wholedisk $dib_file_path $IRONIC_WHOLEDISK_IMAGE_NAME + fi if ! is_service_enabled nova && is_http_server_required; then local image_file_path - if [[ ${IRONIC_WHOLEDISK_IMAGE_NAME} =~ \.img$ ]]; then + if [[ ${IRONIC_WHOLEDISK_IMAGE_NAME} =~ \.img$ ]] || [ -f $FILES/${IRONIC_WHOLEDISK_IMAGE_NAME} ]; then image_file_path=$FILES/${IRONIC_WHOLEDISK_IMAGE_NAME} else image_file_path=$FILES/${IRONIC_WHOLEDISK_IMAGE_NAME}.img @@ -4307,6 +4371,10 @@ function ironic_configure_tempest { iniset $TEMPEST_CONFIG baremetal inspect_timeout $IRONIC_TEMPEST_BUILD_TIMEOUT fi + # Set networking parameters for dhcp-less vmedia testing + iniset $TEMPEST_CONFIG baremetal public_subnet_id $PUBLIC_SUBNET_ID + iniset $TEMPEST_CONFIG baremetal public_subnet_ip $PUBLIC_SUBNET_IP + if [[ $IRONIC_VM_VOLUME_COUNT -gt 1 ]]; then iniset $TEMPEST_CONFIG baremetal_feature_enabled software_raid True iniset $TEMPEST_CONFIG baremetal_feature_enabled deploy_time_raid True diff --git a/zuul.d/ironic-jobs.yaml b/zuul.d/ironic-jobs.yaml index 39e62012dc..8f4804af98 100644 --- a/zuul.d/ironic-jobs.yaml +++ b/zuul.d/ironic-jobs.yaml @@ -474,8 +474,8 @@ # 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_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 IRONIC_REDFISH_EMULATOR_FEATURE_SET: vmedia devstack_services: @@ -1103,7 +1103,7 @@ TENANT_VLAN_RANGE: 100:150 IRONIC_ENABLED_NETWORK_INTERFACES: flat,neutron IRONIC_NETWORK_INTERFACE: neutron - IRONIC_DEFAILT_RESCUE_INTERFACE: no-rescue + IRONIC_DEFAULT_RESCUE_INTERFACE: no-rescue IRONIC_USE_LINK_LOCAL: True IRONIC_TEMPEST_WHOLE_DISK_IMAGE: True IRONIC_VM_EPHEMERAL_DISK: 0 @@ -1184,6 +1184,102 @@ IRONIC_TEMPEST_BUILD_TIMEOUT: 2000 IRONIC_PING_TIMEOUT: 1440 +- job: + name: ironic-tempest-standalone-advanced + description: ironic-tempest-standalone-advanced test cases + parent: ironic-base + required-projects: + - opendev.org/openstack/diskimage-builder + - opendev.org/openstack/networking-generic-switch + - opendev.org/openstack/ironic-python-agent-builder + vars: + tempest_test_timeout: 2800 + devstack_services: + # NOTE(TheJulia): We could likely change this over to OVN, + # but it really doesn't matter. We're using vmedia here. + q-agt: True + q-dhcp: True + q-l3: True + q-meta: False + q-metering: False + q-svc: True + swift: True + s-account: True + s-container: True + s-object: True + s-proxy: True + n-api: False + n-api-meta: False + n-cauth: False + n-cond: False + n-cpu: False + n-novnc: False + n-obj: False + n-sch: False + nova: False + placement-api: False + 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: ironic_standalone.test_advanced_ops + devstack_localrc: + IRONIC_RAMDISK_TYPE: dib + # known working path + # The options below are known working, and leverage simple-init element + # (glean) to perform initial configuration. Ironic's dib element + # removes cloud-init, and upon re-install it just doesn't work for + # unknown reasons. + IRONIC_DIB_RAMDISK_OPTIONS: centos simple-init + IRONIC_DIB_OPTIONS: centos simple-init + IRONIC_BUILD_DEPLOY_RAMDISK: True + IRONIC_BUILD_WHOLEDISK: True + IRONIC_DIB_RAMDISK_OS: centos9 + IRONIC_DIB_OS: centos9 + IRONIC_DIB_RAMDISK_RELEASE: 9-stream + IRONIC_DIB_RELEASE: 9-stream + 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: False + 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 + IRONIC_PROVISION_NETWORK_NAME: ironic-provision + # Cache the image locally so we convert it to raw, + # allowing it to be streamed. Otherwise the ramdisk + # will run out of RAM. + IRONIC_AGENT_IMAGE_DOWNLOAD_SOURCE: local + OVS_PHYSICAL_BRIDGE: brbm + PHYSICAL_NETWORK: mynetwork + TENANT_VLAN_RANGE: 100:150 + IRONIC_ENABLED_NETWORK_INTERFACES: neutron + IRONIC_NETWORK_INTERFACE: neutron + IRONIC_DEFAULT_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 + IRONIC_VM_SPECS_DISK: 8 + 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 + # NOTE(rpittau): OLD TINYIPA JOBS # Those jobs are used by other projects, we leave them here until # we can convert them to dib. diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml index d3817ca57f..ea6828daf0 100644 --- a/zuul.d/project.yaml +++ b/zuul.d/project.yaml @@ -17,6 +17,8 @@ - ironic-tempest-functional-python3 - ironic-standalone-redfish: voting: false + - ironic-tempest-standalone-advanced: + voting: false - ironic-tempest-bios-redfish-pxe - ironic-tempest-uefi-redfish-vmedia - ironic-tempest-ramdisk-bios-snmp-pxe