diff --git a/bifrost/cli.py b/bifrost/cli.py index 214571baa..1984705a8 100644 --- a/bifrost/cli.py +++ b/bifrost/cli.py @@ -122,6 +122,7 @@ def cmd_testenv(args): test_vm_memory_size=args.memory, test_vm_disk_gib=args.disk, test_vm_domain_type=args.domain_type, + test_vm_node_driver=args.driver, baremetal_json_file=os.path.abspath(args.inventory), baremetal_nodes_json=os.path.abspath(args.output), extra_vars=args.extra_vars, @@ -198,6 +199,9 @@ def parse_args(): testenv.add_argument('--inventory', default='baremetal-inventory.json', help='output file with the inventory for using ' 'with dynamic playbooks') + testenv.add_argument('--driver', default='ipmi', + choices=['ipmi', 'redfish'], + help='driver for testing nodes') testenv.add_argument('-e', '--extra-vars', action='append', help='additional vars to pass to ansible') testenv.add_argument('-o', '--output', default='baremetal-nodes.json', diff --git a/playbooks/ci/run.yaml b/playbooks/ci/run.yaml index dafa646f5..701b3f980 100644 --- a/playbooks/ci/run.yaml +++ b/playbooks/ci/run.yaml @@ -14,3 +14,4 @@ ENABLE_VENV: "{{ use_venv | default(true) | bool | lower }}" ZUUL_BRANCH: "{{ zuul.branch }}" BOOT_MODE: "{{ boot_mode | default('') }}" + TEST_VM_NODE_DRIVER: "{{ test_driver | default('ipmi') }}" diff --git a/playbooks/roles/bifrost-create-vm-nodes/defaults/main.yml b/playbooks/roles/bifrost-create-vm-nodes/defaults/main.yml index 8d4de4731..1ba484b36 100644 --- a/playbooks/roles/bifrost-create-vm-nodes/defaults/main.yml +++ b/playbooks/roles/bifrost-create-vm-nodes/defaults/main.yml @@ -15,6 +15,11 @@ test_vm_disk_cache: "{{ lookup('env', 'VM_DISK_CACHE') | default('writeback', tr test_vm_node_name_base: "{{ lookup('env', 'NODEBASE') | default('testvm', true) }}" test_vm_node_names: "{{ lookup('env', 'TEST_VM_NODE_NAMES').split() }}" +test_vm_node_driver: ipmi + +redfish_emulator_host: localhost +redfish_emulator_port: 9132 + # NOTE(pas-ha) name and default are chosen to be the same # as in 'bifrost-ironic-install' role network_interface: "virbr0" diff --git a/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_CentOS.yml b/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_CentOS.yml index b310871ae..f9d6d022d 100644 --- a/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_CentOS.yml +++ b/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_CentOS.yml @@ -22,5 +22,6 @@ required_packages: - pkgconfig - libvirt-devel - trousers + - edk2-ovmf test_vm_emulator: "/usr/libexec/qemu-kvm" test_vm_machine: "pc" diff --git a/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Debian.yml b/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Debian.yml index 4802191d8..792703707 100644 --- a/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Debian.yml +++ b/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Debian.yml @@ -12,5 +12,6 @@ required_packages: - sgabios - pkg-config - libvirt-dev + - ovmf - ebtables - dnsmasq diff --git a/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Fedora.yml b/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Fedora.yml index 6f7e8e831..961195ef6 100644 --- a/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Fedora.yml +++ b/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Fedora.yml @@ -12,3 +12,4 @@ required_packages: - pkgconfig - libvirt-devel - python3-libselinux + - edk2-ovmf diff --git a/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_RedHat.yml b/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_RedHat.yml index 08fc9c404..813fb01c0 100644 --- a/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_RedHat.yml +++ b/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_RedHat.yml @@ -16,3 +16,4 @@ required_packages: - libvirt-devel - libxslt-devel - libxml2-devel + - edk2-ovmf diff --git a/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Suse.yml b/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Suse.yml index 6b7410dbb..83c0aedba 100644 --- a/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Suse.yml +++ b/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Suse.yml @@ -14,5 +14,6 @@ required_packages: - libxml2-devel - pkg-config - libvirt-devel + - qemu-ovmf-x86_64 - ebtables - dnsmasq diff --git a/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Ubuntu_20.04.yml b/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Ubuntu_20.04.yml index 86a85e1b3..e0ac86e7c 100644 --- a/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Ubuntu_20.04.yml +++ b/playbooks/roles/bifrost-create-vm-nodes/defaults/required_defaults_Ubuntu_20.04.yml @@ -12,5 +12,6 @@ required_packages: - qemu-system-data - pkg-config - libvirt-dev + - ovmf - ebtables - dnsmasq diff --git a/playbooks/roles/bifrost-create-vm-nodes/tasks/create_vm.yml b/playbooks/roles/bifrost-create-vm-nodes/tasks/create_vm.yml index 1d5ec2975..62373b3df 100644 --- a/playbooks/roles/bifrost-create-vm-nodes/tasks/create_vm.yml +++ b/playbooks/roles/bifrost-create-vm-nodes/tasks/create_vm.yml @@ -136,13 +136,17 @@ name: "{{ vm_name }}" uuid: "{{ vm_name | to_uuid }}" host_groups: "{{ vm_host_group }}" - driver: "{{ test_vm_node_driver|default('ipmi') }}" + driver: "{{ test_vm_node_driver }}" driver_info: power: ipmi_address: "192.168.122.1" ipmi_port: "{{ virtual_ipmi_port }}" ipmi_username: "admin" ipmi_password: "password" + redfish_address: "http://{{ redfish_emulator_host }}:{{ redfish_emulator_port }}" + redfish_system_id: "/redfish/v1/Systems/{{ vm_name }}" + redfish_username: "admin" + redfish_password: "password" nics: - mac: "{{ vm_mac }}" ansible_ssh_host: "192.168.122.{{ testvm_json_data | length + 2 }}" @@ -155,12 +159,16 @@ node_entry: name: "{{ vm_name }}" uuid: "{{ vm_name | to_uuid }}" - driver: "{{ test_vm_node_driver|default('ipmi') }}" + driver: "{{ test_vm_node_driver }}" driver_info: ipmi_address: "192.168.122.1" ipmi_port: "{{ virtual_ipmi_port }}" ipmi_username: "admin" ipmi_password: "password" + redfish_address: "http://{{ redfish_emulator_host }}:{{ redfish_emulator_port }}" + redfish_system_id: "/redfish/v1/Systems/{{ vm_name }}" + redfish_username: "admin" + redfish_password: "password" ports: - address: "{{ vm_mac }}" properties: diff --git a/playbooks/roles/bifrost-create-vm-nodes/tasks/prepare_libvirt.yml b/playbooks/roles/bifrost-create-vm-nodes/tasks/prepare_libvirt.yml index abe664586..9864d68a3 100644 --- a/playbooks/roles/bifrost-create-vm-nodes/tasks/prepare_libvirt.yml +++ b/playbooks/roles/bifrost-create-vm-nodes/tasks/prepare_libvirt.yml @@ -15,18 +15,14 @@ # Setup libvirt - ensure network and storage pool are defined and active, # prepare dir for vm logs --- -- name: set virtualenv_command - set_fact: - venv_command: "python3 -m venv" - when: enable_venv - -- name: install libvirt-python and lxml +- name: install libvirt-python, gunicorn and lxml include_role: name: bifrost-pip-install vars: package: "{{ item }}" loop: - libvirt-python + - gunicorn - lxml - name: configure libvirt log filters for qemu @@ -198,3 +194,45 @@ state: started daemon_reload: "{{ vbmcd_service_file.changed }}" become: true + +- name: install sushy-tools + include_role: + name: bifrost-pip-install + vars: + package: sushy-tools + +- name: ensure Redfish Emulator systemd service is configured + template: + src: redfish-emulator.service.j2 + dest: /etc/systemd/system/redfish-emulator.service + owner: root + group: root + mode: 0644 + become: true + register: redfish_emulator_service_file + +- name: find OVMF firmware + set_fact: + efi_loader_path: "{{ item }}" + with_first_found: + - /usr/share/OVMF/OVMF_CODE.secboot.fd + - /usr/share/OVMF/OVMF_CODE.fd + - /usr/share/qemu/ovmf-x86_64-code.bin + +- name: write Redfish Emulator configuration file + template: + src: redfish-emulator.conf.j2 + dest: /etc/redfish-emulator.conf + owner: root + group: root + mode: 0600 + become: true + register: redfish_emulator_config_file + +- name: ensure Redfish Emulator systemd service is started and enabled + systemd: + name: redfish-emulator + enabled: yes + state: "{{ 'restarted' if redfish_emulator_config_file.changed else 'started' }}" + daemon_reload: "{{ redfish_emulator_service_file.changed }}" + become: true diff --git a/playbooks/roles/bifrost-create-vm-nodes/templates/redfish-emulator.conf.j2 b/playbooks/roles/bifrost-create-vm-nodes/templates/redfish-emulator.conf.j2 new file mode 100644 index 000000000..7c9689e70 --- /dev/null +++ b/playbooks/roles/bifrost-create-vm-nodes/templates/redfish-emulator.conf.j2 @@ -0,0 +1,11 @@ +SUSHY_EMULATOR_BOOT_LOADER_MAP = { + 'UEFI': { + 'x86_64': '{{ efi_loader_path }}' + }, + 'Legacy': { + 'x86_64': None + } +} + +SUSHY_EMULATOR_LISTEN_IP = '{{ redfish_emulator_host }}' +SUSHY_EMULATOR_LISTEN_PORT = {{ redfish_emulator_port }} diff --git a/playbooks/roles/bifrost-create-vm-nodes/templates/redfish-emulator.service.j2 b/playbooks/roles/bifrost-create-vm-nodes/templates/redfish-emulator.service.j2 new file mode 100644 index 000000000..0877ff038 --- /dev/null +++ b/playbooks/roles/bifrost-create-vm-nodes/templates/redfish-emulator.service.j2 @@ -0,0 +1,15 @@ +{% if enable_venv | bool %} +{% set gunicorn = bifrost_venv_dir ~ '/bin/gunicorn' %} +{% else %} +{% set gunicorn = '/usr/local/bin/gunicorn' %} +{% endif %} +[Unit] +Description=Sushy Redfish Emulator + +[Service] +Type=simple +Restart=on-failure +ExecStart={{ gunicorn }} sushy_tools.emulator.main:app \ + --bind {{ redfish_emulator_host }}:{{ redfish_emulator_port }} \ + --env SUSHY_EMULATOR_CONFIG=/etc/redfish-emulator.conf \ + --env FLASK_DEBUG=1 --workers 2 --threads 2 --timeout 90 diff --git a/releasenotes/notes/test-redfish-54ed748e2305d8eb.yaml b/releasenotes/notes/test-redfish-54ed748e2305d8eb.yaml new file mode 100644 index 000000000..59a4e4fd9 --- /dev/null +++ b/releasenotes/notes/test-redfish-54ed748e2305d8eb.yaml @@ -0,0 +1,9 @@ +--- +features: + - | + The ``bifrost-create-vm-nodes`` role now supports redfish emulation, set + ``test_vm_node_driver=redfish`` (or ``--driver=redfish`` for + ``bifrost-cli testenv``) to use. + - | + The new parameter ``default_boot_mode`` allows specifying the default boot + mode: ``uefi`` or ``bios``. diff --git a/scripts/collect-test-info.sh b/scripts/collect-test-info.sh index 50b786f5e..1adede5cc 100755 --- a/scripts/collect-test-info.sh +++ b/scripts/collect-test-info.sh @@ -62,6 +62,7 @@ sudo journalctl -u ironic-conductor &> ${LOG_LOCATION}/ironic-conductor.log sudo journalctl -u ironic-inspector &> ${LOG_LOCATION}/ironic-inspector.log sudo journalctl -u dnsmasq &> ${LOG_LOCATION}/dnsmasq.log sudo journalctl -u vbmcd &> ${LOG_LOCATION}/vbmcd.log +sudo journalctl -u redfish-emulator &> ${LOG_LOCATION}/redfish-emulator.log sudo journalctl -u uwsgi &> ${LOG_LOCATION}/uwsgi.log # Copy PXE information diff --git a/scripts/test-bifrost.sh b/scripts/test-bifrost.sh index 39ed9ffb7..1c49ca513 100755 --- a/scripts/test-bifrost.sh +++ b/scripts/test-bifrost.sh @@ -132,6 +132,7 @@ done --memory ${VM_MEMORY_SIZE:-512} \ --disk ${VM_DISK:-5} \ --inventory "${BAREMETAL_DATA_FILE}" \ + --driver ${TEST_VM_NODE_DRIVER:-ipmi} \ --extra-vars git_url_root="${WORKSPACE:-https://opendev.org}" \ ${VM_SETUP_EXTRA:-} \ ${BIFROST_CLI_EXTRA:-} diff --git a/zuul.d/bifrost-jobs.yaml b/zuul.d/bifrost-jobs.yaml index 380326d4f..e103356bf 100644 --- a/zuul.d/bifrost-jobs.yaml +++ b/zuul.d/bifrost-jobs.yaml @@ -80,6 +80,7 @@ - openstack/keystone vars: enable_keystone: true + test_driver: redfish - job: name: bifrost-cli-ubuntu-bionic @@ -105,6 +106,7 @@ - openstack/keystone vars: enable_keystone: true + test_driver: redfish - job: name: bifrost-integration-tinyipa-debian-buster