Files
Steve Baker e6e842b228 Replace Chrome/Selenium console with Firefox extension
The current containerised graphical console approach has a Selenium
script managing a Chrome browser session. This change replaces that with
firefox and a custom extension to perform the required actions to login
and load the BMC console. This supports the same vendors as the previous
approach (iDRAC, iLO, Supermicro).

This change is required by Red Hat as Chrome is not packaged in RHEL.
However switching to firefox has allowed a more robust and featureful
implementation so it is presented here on its own merits.

This is implemented with bash, calling out to dedicated python scripts
for these specific tasks:
- Detecting which vendor specific javascript to use for the
  redfish-graphical driver
- Building the required certificate fingerprint when app_info.verify_ca
  is false, which is written to the profile's cert_override.txt
- Building a custom policy.json which is specific to the BMC and vendor
  implementation.

Functional differences with the chrome/selenium version
- Firefox kiosk mode has a more locked-down environment, including
  disabling context menus. This means the brittle workaround to disable
  them is no longer required.
- Firefox global policy allows the environment to be locked down
  further, including limiting accessing to all URLs except the BMC.
- There is now a dedicated loading page which can show status updates
  until the first BMC page loads. This page shows error messages if any
  of the early redfish calls fail.
- VNC client sessions are now shared with multiple clients, and firefox
  will be started on the first connection, and stopped when the last
  connection ends.
- Starting Xvfb is now deferred until the first VNC client connection.
  This results in a never-connected container using 5MB vs 30MB
  once Xvfb is started. Starting Xvfb has ~1sec time penality on first
  connection.
- The browser now runs in a dedicated non-root user
- All redfish consoles now hide toolbar elements with a CSS overlay rather than
  simulating other methods such as clicking the "Full Screen" button.
- ilo6/ilo5 detection is now done by a redfish call and the ilo5 path
  has less moving parts.

Change-Id: Ib42704a016dc891833a0ddbeae8054cac2c57d4d
Signed-off-by: Steve Baker <sbaker@redhat.com>
Assisted-By: gemini
2025-11-05 11:07:07 +13:00
..

VNC Container

Overview

This allows a container image to be built which supports Ironic's graphical console functionality.

For each node with an enabled graphical console, the service ironic-novncproxy (or nova-novncproxy) will connect to a VNC server exposed by a container running this image.

Building and using

To build the container image for local use, install buildah and run the following as the user which runs ironic-conductor:

buildah bud -f ./Containerfile -t localhost/ironic-vnc-container

The systemd container provider (or an external provider) can then be configured to use this image in ironic.conf:

[vnc]
enabled = True
container_provider=systemd
console_image=localhost/ironic-vnc-container

Implementation

When the container is started the following occurs:

  1. x11vnc is run, which exposes a VNC server port

When a VNC connection is established, the following occurs:

  1. Xvfb is run, which starts a virtual X11 session
  2. A firefox browser is started in kiosk mode
  3. A firefox extension automates loading the requested console app
  4. For the fake app, display drivers/fake/index.html
  5. For the redfish-graphical app, detect the vendor by looking at the Oem value in a /redfish/v1 response
  6. Runs vendor specific scripts to display an HTML5 based console

Multiple VNC connections can share a single instance. When the last VNC connection is closed, the running Firefox is closed.

Vendor specific implementations are as follows.

Dell iDRAC

One-time console credentials are created with a call to /Managers/<manager>/Oem/Dell/DelliDRACCardService/Actions/DelliDRACCardService.GetKVMSession and the browser loads a console URL using those credentials.

HPE iLO

The /irc.html URL is loaded. For iLO 6 the inline login form is populated with credentials and submitted, showing the console. For iLO 5 the main login page is loaded, and when the login is submitted irc.html is loaded again.

Supermicro (Experimental)

A simulated user logs in, waits for the console preview image to load, then clicks on it.