RHDHDeployment
Class for managing RHDH deployments in OpenShift.
Import
import { RHDHDeployment } from "@red-hat-developer-hub/e2e-test-utils/rhdh";Constructor
new RHDHDeployment(namespace: string)| Parameter | Type | Description |
|---|---|---|
namespace | string | Kubernetes namespace for deployment |
Properties
rhdhUrl
get rhdhUrl(): stringThe URL of the deployed RHDH instance.
deploymentConfig
get deploymentConfig(): DeploymentConfigCurrent deployment configuration. See Deployment Types.
k8sClient
get k8sClient(): KubernetesClientHelperKubernetes client instance for direct cluster operations.
Methods
configure()
async configure(options?: DeploymentOptions): Promise<void>Configure deployment options and create namespace.
| Parameter | Type | Description |
|---|---|---|
options | DeploymentOptions | Optional deployment configuration |
await rhdh.configure({
version: "1.5",
method: "helm",
auth: "keycloak",
appConfig: "tests/config/app-config.yaml",
});deploy()
async deploy(options?: { timeout?: number | null }): Promise<void>Deploy RHDH to the cluster. This:
- Merges configuration files
- Injects plugin metadata into dynamic plugins config
- Applies ConfigMaps and Secrets
- Installs RHDH via Helm or Operator
- Waits for deployment to be ready
| Parameter | Type | Default | Description |
|---|---|---|---|
options.timeout | number | null | 600_000 | Playwright test timeout (ms) for the deployment. Pass a custom number to override, 0 for no timeout, or null to skip and let the consumer control the timeout. |
// Default (600s timeout)
await rhdh.deploy();
// Custom timeout (15 minutes)
await rhdh.deploy({ timeout: 900_000 });
// No timeout (infinite)
await rhdh.deploy({ timeout: 0 });
// Skip — consumer controls the timeout
test.setTimeout(900_000);
await rhdh.deploy({ timeout: null });waitUntilReady()
async waitUntilReady(timeout?: number): Promise<void>Wait for RHDH deployment to be ready. Performs two checks:
- Pod readiness — Waits for all pods to have
Ready=True, with early failure detection forCrashLoopBackOff,ImagePullBackOff, etc. - Route readiness — HTTP health check against the RHDH route URL using Playwright's
request.newContext({ ignoreHTTPSErrors: true }). This closes the gap between podReady=Trueand the OpenShift Router/HAProxy actually serving traffic.
The remaining timeout after pod readiness is used for the route check (minimum 30 seconds).
| Parameter | Type | Default | Description |
|---|---|---|---|
timeout | number | 500 | Timeout in seconds |
await rhdh.waitUntilReady(600); // 10 minutesrolloutRestart()
async rolloutRestart(): Promise<void>Restart the RHDH deployment.
await rhdh.rolloutRestart();scaleDownAndRestart()
async scaleDownAndRestart(): Promise<void>Scale down to 0, wait for pod termination, then scale back to 1 replica. Prevents MigrationLocked errors when two backstage instances try to run database migrations simultaneously.
INFO
Called automatically during deploy() only on helm upgrades (when an existing deployment is detected). Skipped on fresh installs to avoid unnecessary pod cycling.
await rhdh.scaleDownAndRestart();teardown()
async teardown(): Promise<void>Delete the namespace and all resources.
await rhdh.teardown();Example
import { RHDHDeployment } from "@red-hat-developer-hub/e2e-test-utils/rhdh";
const rhdh = new RHDHDeployment("my-namespace");
await rhdh.configure({
version: "1.5",
method: "helm",
auth: "keycloak",
appConfig: "tests/config/app-config.yaml",
secrets: "tests/config/secrets.yaml",
dynamicPlugins: "tests/config/plugins.yaml",
valueFile: "tests/config/values.yaml",
});
await rhdh.deploy();
console.log(`RHDH deployed at: ${rhdh.rhdhUrl}`);
// After tests
await rhdh.teardown();