Skip to content

RHDHDeployment

Class for managing RHDH deployments in OpenShift.

Import

typescript
import { RHDHDeployment } from "@red-hat-developer-hub/e2e-test-utils/rhdh";

Constructor

typescript
new RHDHDeployment(namespace: string)
ParameterTypeDescription
namespacestringKubernetes namespace for deployment

Properties

rhdhUrl

typescript
get rhdhUrl(): string

The URL of the deployed RHDH instance.

deploymentConfig

typescript
get deploymentConfig(): DeploymentConfig

Current deployment configuration. See Deployment Types.

k8sClient

typescript
get k8sClient(): KubernetesClientHelper

Kubernetes client instance for direct cluster operations.

Methods

configure()

typescript
async configure(options?: DeploymentOptions): Promise<void>

Configure deployment options and create namespace.

ParameterTypeDescription
optionsDeploymentOptionsOptional deployment configuration
typescript
await rhdh.configure({
  version: "1.5",
  method: "helm",
  auth: "keycloak",
  appConfig: "tests/config/app-config.yaml",
});

deploy()

typescript
async deploy(options?: { timeout?: number | null }): Promise<void>

Deploy RHDH to the cluster. This:

  1. Merges configuration files
  2. Injects plugin metadata into dynamic plugins config
  3. Applies ConfigMaps and Secrets
  4. Installs RHDH via Helm or Operator
  5. Waits for deployment to be ready
ParameterTypeDefaultDescription
options.timeoutnumber | null600_000Playwright 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.
typescript
// 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()

typescript
async waitUntilReady(timeout?: number): Promise<void>

Wait for RHDH deployment to be ready. Performs two checks:

  1. Pod readiness — Waits for all pods to have Ready=True, with early failure detection for CrashLoopBackOff, ImagePullBackOff, etc.
  2. Route readiness — HTTP health check against the RHDH route URL using Playwright's request.newContext({ ignoreHTTPSErrors: true }). This closes the gap between pod Ready=True and the OpenShift Router/HAProxy actually serving traffic.

The remaining timeout after pod readiness is used for the route check (minimum 30 seconds).

ParameterTypeDefaultDescription
timeoutnumber500Timeout in seconds
typescript
await rhdh.waitUntilReady(600); // 10 minutes

rolloutRestart()

typescript
async rolloutRestart(): Promise<void>

Restart the RHDH deployment.

typescript
await rhdh.rolloutRestart();

scaleDownAndRestart()

typescript
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.

typescript
await rhdh.scaleDownAndRestart();

teardown()

typescript
async teardown(): Promise<void>

Delete the namespace and all resources.

typescript
await rhdh.teardown();

Example

typescript
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();

Released under the Apache-2.0 License.