infra

package
v1.3.0-main Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 27, 2026 License: Apache-2.0 Imports: 13 Imported by: 0

Documentation

Overview

Package infra provides testcontainers-based infrastructure for E2E tests.

Package infra provides E2E test infrastructure in two separate layers:

  1. Aux services (test/e2e/infra/aux): Shared testcontainers that run the same for all deployments — registry, git server, prometheus. Use auxiliary.Get(ctx).

  2. Deployment providers (this package + k8s/, quadlet/): Where Flight Control runs. Interfaces (InfraProvider, ServiceLifecycleProvider, RBACProvider, SecretsProvider) and implementations for K8s and Quadlet. Create once at harness creation via the harness's NewProvidersForEnvironment; then use the interface methods without further environment checks.

Package infra provides testcontainers-based infrastructure for E2E tests.

Convention: never use exec kubectl or the raw Kubernetes client outside of infra/k8s. If harness, util, or other e2e code needs cluster or config access, that functionality must live in infra: implement it in infra/k8s (and in infra/quadlet with equivalent behaviour when relevant for both deployment types), expose it via InfraProvider or another infra interface, and have callers use the provider (e.g. from setup.GetDefaultProviders() or the harness).

Package infra provides testcontainers-based infrastructure for E2E tests.

Package infra provides testcontainers-based infrastructure for E2E tests.

Package infra provides testcontainers-based infrastructure for E2E tests.

Package infra provides testcontainers-based infrastructure for E2E tests.

Index

Constants

View Source
const (
	EnvE2EEnvironment = "E2E_ENVIRONMENT"  // Environment type: k8s, ocp, quadlet
	EnvE2ENamespace   = "E2E_NAMESPACE"    // K8s namespace
	EnvE2EAPIEndpoint = "E2E_API_ENDPOINT" // FlightCtl API endpoint URL
	EnvKubeConfig     = "KUBECONFIG"       // Kubeconfig path
	EnvE2EKubeContext = "E2E_KUBE_CONTEXT" // Kubeconfig context
	EnvE2ESSHHost     = "E2E_SSH_HOST"     // Remote SSH host for Quadlet
	EnvE2ESSHUser     = "E2E_SSH_USER"     // SSH username
	EnvE2ESSHKeyPath  = "E2E_SSH_KEY_PATH" // SSH key path
	// #nosec G101 -- env var name, not a credential value
	EnvE2ESSHPassword = "E2E_SSH_PASSWORD" // SSH password (alternative to key; requires sshpass)
	EnvE2EUseSudo     = "E2E_USE_SUDO"     // Use sudo (default: true for quadlet)
	EnvE2EConfigDir   = "E2E_CONFIG_DIR"   // Config directory for Quadlet
)

Environment variable names for configuration

View Source
const (
	// DefaultQuadletConfigDir is the default config directory for Quadlet deployments
	DefaultQuadletConfigDir = "/etc/flightctl"
	// DefaultAPIPort is the default port for the FlightCtl API
	DefaultAPIPort = "3443"
)

Default values for different environments

View Source
const (
	EnvironmentKind    = "kind"
	EnvironmentOCP     = "ocp"
	EnvironmentQuadlet = "quadlet"
)

EnvironmentType constants for environment detection.

View Source
const CoreAPIGroup = "core"

CoreAPIGroup is the sentinel for Kubernetes core API group (e.g. secrets). Use in Permission.ApiGroup.

View Source
const OrgLabelKey = "io.flightctl/instance"

OrgLabelKey is the namespace/project label key for the Flight Control release (K8s: io.flightctl/instance=<releaseName>).

Variables

View Source
var DeploymentServiceNames = map[string]ServiceName{
	"flightctl-kv":                  ServiceRedis,
	"flightctl-api":                 ServiceAPI,
	"flightctl-worker":              ServiceWorker,
	"flightctl-periodic":            ServicePeriodic,
	"flightctl-telemetry-gateway":   ServiceTelemetryGateway,
	"flightctl-db":                  ServiceDB,
	"flightctl-ui":                  ServiceUI,
	"flightctl-alertmanager":        ServiceAlertmanager,
	"flightctl-alertmanager-proxy":  ServiceAlertmanagerProxy,
	"flightctl-imagebuilder-api":    ServiceImageBuilderAPI,
	"flightctl-imagebuilder-worker": ServiceImageBuilderWorker,
	"flightctl-alert-exporter":      ServiceAlertExporter,
}

DeploymentServiceNames maps deployment/service names (same in K8s and Quadlet) to ServiceName. Use when callers have a string (e.g. "flightctl-ui") and need a ServiceName for provider calls.

View Source
var ErrSecretsNotSupported = fmt.Errorf("secrets not supported in this environment")

ErrSecretsNotSupported is returned when the environment does not support secret storage (e.g. quadlet).

View Source
var ErrTPMNotSupported = fmt.Errorf("TPM operations not supported in this environment")

ErrTPMNotSupported is returned when the environment does not support TPM operations.

Functions

func DetectEnvironment

func DetectEnvironment() string

DetectEnvironment returns the detected environment type using the default factory.

func GetAPIEndpoint

func GetAPIEndpoint() string

GetAPIEndpoint returns the API endpoint using the default factory's config. Uses defaults if not explicitly configured.

func GetDefaultQuadletAPIEndpoint

func GetDefaultQuadletAPIEndpoint() string

GetDefaultQuadletAPIEndpoint returns the default API endpoint for Quadlet deployments. Uses the host's FQDN (hostname -f). VMs will have /etc/hosts entry injected during prepare.

func IsK8sEnvironment

func IsK8sEnvironment() bool

IsK8sEnvironment returns true if running in a K8s environment.

func IsQuadletEnvironment

func IsQuadletEnvironment() bool

IsQuadletEnvironment returns true if running in a Quadlet environment.

func IsRemoteDeployment

func IsRemoteDeployment() bool

IsRemoteDeployment returns true if testing against a remote deployment.

func NormalizeEnvironmentType

func NormalizeEnvironmentType(envType string) string

NormalizeEnvironmentType normalizes environment type strings.

func RequireEnvironment

func RequireEnvironment(envType string)

RequireEnvironment fails the test if not running in the specified environment.

func SkipIfEnvironment

func SkipIfEnvironment(envType string, reason ...string)

SkipIfEnvironment skips the current test if running in the specified environment.

func SkipIfNotK8s

func SkipIfNotK8s(reason ...string)

SkipIfNotK8s skips the current test if not running in a Kubernetes environment. Use this for tests that require Kubernetes-specific features (RBAC, etc.).

func SkipIfNotQuadlet

func SkipIfNotQuadlet(reason ...string)

SkipIfNotQuadlet skips the current test if not running in a Quadlet environment. Use this for tests that require Quadlet-specific features.

func SkipIfRBACNotSupported

func SkipIfRBACNotSupported(rbacProvider RBACProvider)

SkipIfRBACNotSupported skips the current test if RBAC provider is not available. Both K8s and PAM environments support RBAC, so this only checks for nil provider.

Types

type EnvironmentConfig

type EnvironmentConfig struct {
	// Type is the environment type: "kind", "ocp", or "quadlet"
	Type string

	// Namespace is the K8s namespace for flightctl services (K8s only)
	Namespace string

	// APIEndpoint is the FlightCtl API endpoint URL (e.g., "https://api.flightctl.example.com:3443")
	APIEndpoint string

	// KubeConfig is the path to kubeconfig file (K8s only, defaults to ~/.kube/config)
	KubeConfig string

	// KubeContext is the kubeconfig context to use (K8s only)
	KubeContext string

	// SSHHost is the remote host for Quadlet deployments (Quadlet only, for remote testing)
	SSHHost string

	// SSHUser is the SSH username for remote Quadlet deployments
	SSHUser string

	// SSHKeyPath is the path to SSH private key for remote Quadlet deployments
	SSHKeyPath string

	// UseSudo indicates whether to use sudo for systemctl/podman commands (Quadlet only)
	UseSudo bool

	// ConfigDir is the config directory for Quadlet deployments (defaults to /etc/flightctl)
	ConfigDir string
}

EnvironmentConfig holds configuration for the test environment. Values can be set via environment variables or programmatically.

func GetConfig

func GetConfig() *EnvironmentConfig

GetConfig returns the environment configuration from the default factory.

func GetEnvironmentConfig

func GetEnvironmentConfig() *EnvironmentConfig

GetEnvironmentConfig reads configuration from environment variables.

func (*EnvironmentConfig) GetAPIEndpoint

func (c *EnvironmentConfig) GetAPIEndpoint() string

GetAPIEndpoint returns the API endpoint, using defaults if not explicitly set. For K8s: checks API_ENDPOINT env var (set by run_e2e_tests.sh from K8s route) For Quadlet: defaults to https://<host-ip>:3443 (uses host IP so VMs can reach it)

func (*EnvironmentConfig) GetConfigDir

func (c *EnvironmentConfig) GetConfigDir() string

GetConfigDir returns the config directory, using defaults if not set.

func (*EnvironmentConfig) GetNamespace

func (c *EnvironmentConfig) GetNamespace() string

GetNamespace returns the namespace from config (E2E_NAMESPACE or FLIGHTCTL_NS). Returns empty string when not set; K8s providers then detect from cluster (flightctl-api / flightctl-worker pods).

func (*EnvironmentConfig) IsRemote

func (c *EnvironmentConfig) IsRemote() bool

IsRemote returns true if this is a remote deployment (has SSHHost or external API endpoint).

type InfraProvider

type InfraProvider interface {
	// GetConfigValue retrieves a configuration value by name and key.
	// For K8s: reads from ConfigMap
	// For Quadlet: reads from config files or environment variables
	GetConfigValue(name, key string) (string, error)

	// GetServiceConfig retrieves the full configuration content for a service.
	// For K8s: reads from ConfigMap data (e.g., config.yaml key)
	// For Quadlet: reads the config file from container or host
	GetServiceConfig(service ServiceName) (string, error)

	// GetSecretValue retrieves a secret value by name and key.
	// For K8s: reads from Secret (base64 decoded)
	// For Quadlet: reads from secret files or environment variables
	GetSecretValue(name, key string) (string, error)

	// GetServiceEndpoint returns the host and port for a named service.
	// For K8s: returns in-cluster DNS name and port (not directly accessible from test host)
	// For Quadlet: returns the configured host with the service's port
	GetServiceEndpoint(service ServiceName) (host string, port int, err error)

	// ExposeService makes an internal service accessible from the test host.
	// Use this for services not normally exposed externally (e.g., metrics endpoints).
	// For K8s: starts port-forwarding and returns localhost URL + cleanup function
	// For Quadlet: returns direct URL + no-op cleanup (internal services accessible on host)
	// The cleanup function must be called when done (e.g., defer cleanup()).
	ExposeService(service ServiceName, protocol string) (url string, cleanup func(), err error)

	// InvalidateExposeCache closes any cached port-forward for the service and removes it from the cache.
	// Call before retrying ExposeService so the next call creates a new port-forward (e.g. after Redis restart).
	InvalidateExposeCache(service ServiceName)

	// ExecInService executes a command in the context of a service.
	// For K8s: kubectl exec into the service's pod
	// For Quadlet: direct command execution or SSH
	ExecInService(service ServiceName, command []string) (string, error)

	// ExecInServiceWithStdin executes a command in the context of a service with stdin attached.
	// Used e.g. to pipe a backup file into psql during DB restore.
	// For K8s: kubectl exec -i into the service's pod
	// For Quadlet: podman exec -i (and stdin piped through SSH when remote)
	ExecInServiceWithStdin(service ServiceName, command []string, stdin io.Reader) (string, error)

	// GetEnvironmentType returns the type of environment ("kind", "ocp", "quadlet").
	GetEnvironmentType() string

	// GetAPILoginToken returns a token suitable for flightctl login --token.
	// For K8s/KIND: kubectl create token in main namespace; OCP: oc whoami -t.
	// For Quadlet: read from file or return error. Namespace is internal to the provider.
	GetAPILoginToken() (string, error)

	// SetServiceConfig writes back config for a service (e.g. config.yaml in ConfigMap).
	// For K8s: updates ConfigMap data[configKey]. For Quadlet: single config file per
	// service; configKey is ignored (callers may pass "" or "config.yaml").
	SetServiceConfig(service ServiceName, configKey, content string) error

	// GetInternalNamespace returns the namespace where internal services (worker, db, kv, etc.) run.
	// For K8s: e.g. flightctl-internal when using split namespaces; empty when all in one namespace.
	// For Quadlet: empty.
	GetInternalNamespace() string

	// GetExternalNamespace returns the namespace where external services (API, UI, etc.) run (release namespace).
	// For K8s: the namespace where flightctl-api is deployed; used e.g. for io.flightctl/instance label.
	// For Quadlet: empty.
	GetExternalNamespace() string

	// BuiltinDatabaseWorkloadAvailable reports whether backup/restore tests can pg_dump/psql via the
	// built-in DB workload: K8s checks for a flightctl-db pod (Helm db.type=builtin); external Helm DB
	// has no such pod. Quadlet reads db.type from service-config.yaml (deploy/podman/service-config.yaml);
	// db.type=external uses an external Postgres instance instead of the flightctl-db container.
	BuiltinDatabaseWorkloadAvailable() bool
}

InfraProvider abstracts infrastructure access for different deployment environments. K8s implementations use kubectl/client-go, Quadlet implementations use systemctl and files.

type Permission

type Permission struct {
	Resources []string
	Verbs     []string
	ApiGroup  string // K8s: CoreAPIGroup for core (e.g. secrets), "" defaults to flightctl.io; PAM ignores
}

Permission defines access to resources. K8s uses Resources, Verbs, and ApiGroup to build PolicyRules (ApiGroup "" is core API). PAM ignores this (permissions are implicit based on role name).

type ProviderFactory

type ProviderFactory struct {
	// contains filtered or unexported fields
}

ProviderFactory creates providers based on environment detection.

func NewProviderFactory

func NewProviderFactory() *ProviderFactory

NewProviderFactory creates a new provider factory.

func NewProviderFactoryWithConfig

func NewProviderFactoryWithConfig(config *EnvironmentConfig) *ProviderFactory

NewProviderFactoryWithConfig creates a provider factory with explicit configuration.

func (*ProviderFactory) DetectEnvironment

func (f *ProviderFactory) DetectEnvironment() string

DetectEnvironment determines the current environment type. Priority: E2E_ENVIRONMENT env var > auto-detection

func (*ProviderFactory) GetConfig

func (f *ProviderFactory) GetConfig() *EnvironmentConfig

GetConfig returns the environment configuration.

func (*ProviderFactory) IsK8sEnvironment

func (f *ProviderFactory) IsK8sEnvironment() bool

IsK8sEnvironment returns true if the current environment is Kubernetes-based.

func (*ProviderFactory) IsQuadletEnvironment

func (f *ProviderFactory) IsQuadletEnvironment() bool

IsQuadletEnvironment returns true if the current environment is Quadlet-based.

type Providers

type Providers struct {
	Infra     InfraProvider
	Lifecycle ServiceLifecycleProvider
	RBAC      RBACProvider
	Secrets   SecretsProvider
	TPM       TPMProvider
}

Providers holds all the infrastructure providers for a test environment. Create once at harness/suite creation via infra/setup.NewProvidersForEnvironment or setup.EnsureDefaultProviders; after that use the interface methods (e.g. GetSecretsProvider().GetSecretData) without further environment checks. Methods that are not supported in an implementation (e.g. GetSecretData on Quadlet) return an error (e.g. ErrSecretsNotSupported); callers handle that instead of branching on implementation type.

type RBACProvider

type RBACProvider interface {
	// CreateRole creates a role.
	// K8s: creates rbacv1.Role in namespace
	// PAM: creates group "<namespace>.<name>" if namespace provided, else "<name>"
	CreateRole(ctx context.Context, spec *RoleSpec) error

	// UpdateRole updates a role.
	// K8s: updates rbacv1.Role
	// PAM: no-op (groups don't have permissions)
	UpdateRole(ctx context.Context, spec *RoleSpec) error

	// DeleteRole deletes a role.
	// K8s: deletes rbacv1.Role
	// PAM: deletes group "<namespace>.<name>" or "<name>"
	DeleteRole(ctx context.Context, namespace, name string) error

	// CreateRoleBinding binds a user to a role.
	// K8s: creates rbacv1.RoleBinding
	// PAM: adds user to group via usermod -aG
	CreateRoleBinding(ctx context.Context, spec *RoleBindingSpec) error

	// DeleteRoleBinding removes a user from a role.
	// K8s: deletes rbacv1.RoleBinding
	// PAM: removes user from group via gpasswd -d
	DeleteRoleBinding(ctx context.Context, namespace, name string) error

	// CreateClusterRole creates a cluster-scoped role.
	// K8s: creates rbacv1.ClusterRole
	// PAM: creates group "<name>" (no namespace prefix)
	CreateClusterRole(ctx context.Context, spec *RoleSpec) error

	// UpdateClusterRole updates a cluster-scoped role.
	// K8s: updates rbacv1.ClusterRole
	// PAM: no-op (groups don't have permissions)
	UpdateClusterRole(ctx context.Context, spec *RoleSpec) error

	// DeleteClusterRole deletes a cluster-scoped role.
	// K8s: deletes rbacv1.ClusterRole
	// PAM: deletes group "<name>"
	DeleteClusterRole(ctx context.Context, name string) error

	// CreateClusterRoleBinding binds a user to a cluster role.
	// K8s: creates rbacv1.ClusterRoleBinding
	// PAM: adds user to group via usermod -aG
	CreateClusterRoleBinding(ctx context.Context, spec *RoleBindingSpec) error

	// DeleteClusterRoleBinding removes a user from a cluster role.
	// K8s: deletes rbacv1.ClusterRoleBinding
	// PAM: removes user from group via gpasswd -d
	DeleteClusterRoleBinding(ctx context.Context, name string) error

	// CreateOrganization creates an organization (K8s: namespace with release label; PAM: org-<name> group).
	CreateOrganization(ctx context.Context, name string) error

	// AddUserToOrg grants the user access to the organization (K8s: view RoleBinding in namespace; PAM: add user to org-<name> group).
	AddUserToOrg(ctx context.Context, orgName, userName string) error

	// DeleteOrganization deletes an organization (K8s: namespace; PAM: org-<name> group).
	DeleteOrganization(ctx context.Context, name string) error
}

RBACProvider abstracts RBAC operations for different environments. K8s implementations use the RBAC API, PAM implementations use Linux groups.

type RoleBindingSpec

type RoleBindingSpec struct {
	Name      string
	Namespace string // empty for cluster-scoped
	RoleName  string
	Subject   string // user name or service account name
	// SubjectKind: "User" (default) or "ServiceAccount"
	SubjectKind string
	// SubjectNamespace: required when SubjectKind is ServiceAccount (namespace of the SA)
	SubjectNamespace string
}

RoleBindingSpec binds a subject (user or service account) to a role.

type RoleSpec

type RoleSpec struct {
	Name        string
	Namespace   string // empty for cluster-scoped
	Permissions []Permission
}

RoleSpec defines a role with permissions.

type SecretsProvider

type SecretsProvider interface {
	// GetSecretData returns the value of a key in a secret.
	// Namespace and secretName identify the secret; key is the data key.
	// Returns decoded bytes (K8s API returns Secret.Data already decoded).
	GetSecretData(ctx context.Context, namespace, secretName, key string) ([]byte, error)

	// GetSecretDataForService returns the value of a key in a secret for the given service.
	// K8s: resolves service to namespace internally. Quadlet: returns ErrSecretsNotSupported.
	GetSecretDataForService(ctx context.Context, service ServiceName, secretName, key string) ([]byte, error)

	// CreateSecret creates a secret with the given namespace, name, and string data (key -> value).
	// K8s: creates a Secret with StringData; idempotent (no-op if already exists with same data or update as needed).
	// Quadlet: returns ErrSecretsNotSupported.
	CreateSecret(ctx context.Context, namespace, name string, stringData map[string]string) error
}

SecretsProvider abstracts secret access for different environments. K8s: reads from Kubernetes Secret API. Quadlet: not supported; GetSecretData returns an error so callers fall back to file/infra paths.

type ServiceLifecycleProvider

type ServiceLifecycleProvider interface {
	// IsRunning checks if a service is currently running.
	// For K8s: checks pod phase is Running
	// For Quadlet: checks systemctl is-active
	IsRunning(service ServiceName) (bool, error)

	// Start starts a stopped service.
	// For K8s: scales deployment to 1 replica
	// For Quadlet: systemctl start
	Start(service ServiceName) error

	// Stop stops a running service.
	// For K8s: scales deployment to 0 replicas
	// For Quadlet: systemctl stop
	Stop(service ServiceName) error

	// Restart restarts a service.
	// For K8s: deletes the pod to force restart
	// For Quadlet: systemctl restart
	Restart(service ServiceName) error

	// WaitForReady waits for a service to be ready and healthy.
	// For K8s: waits for pod Ready condition
	// For Quadlet: waits for systemctl is-active and optionally health checks
	WaitForReady(service ServiceName, timeout time.Duration) error

	// AreServicesHealthy checks if all flightctl services are healthy.
	// For K8s: checks all deployments have ready replicas
	// For Quadlet: checks all systemd services are active
	AreServicesHealthy() (bool, error)

	// SetDeploymentEnv sets an environment variable on a service's deployment
	// and waits for the rollout to complete.
	// For K8s: patches the deployment container spec and waits for rollout
	// For Quadlet: creates a Quadlet container drop-in override and restarts the service
	SetDeploymentEnv(service ServiceName, envName, envValue string) error

	// RemoveDeploymentEnv removes an environment variable from a service's
	// deployment and waits for the rollout to complete.
	// For K8s: removes the env var from the deployment container spec and waits for rollout
	// For Quadlet: removes the env var from the container drop-in override and restarts the service
	RemoveDeploymentEnv(service ServiceName, envName string) error
}

ServiceLifecycleProvider abstracts service lifecycle management for different environments. K8s implementations use kubectl scale/delete, Quadlet implementations use systemctl.

type ServiceName

type ServiceName string

ServiceName is a type-safe identifier for flightctl services.

const (
	ServiceRedis              ServiceName = "redis"
	ServiceAPI                ServiceName = "api"
	ServiceWorker             ServiceName = "worker"
	ServicePeriodic           ServiceName = "periodic"
	ServiceTelemetryGateway   ServiceName = "telemetry-gateway"
	ServiceUI                 ServiceName = "ui"
	ServiceDB                 ServiceName = "db"
	ServiceAlertmanager       ServiceName = "alertmanager"
	ServiceAlertmanagerProxy  ServiceName = "alertmanager-proxy"
	ServiceImageBuilderAPI    ServiceName = "imagebuilder-api"
	ServiceImageBuilderWorker ServiceName = "imagebuilder-worker"
	ServiceAlertExporter      ServiceName = "alert-exporter"
)

ServiceName constants for logical service names. Use these constants when calling InfraProvider methods that accept ServiceName.

func ServiceNameFromDeploymentName

func ServiceNameFromDeploymentName(name string) (ServiceName, bool)

ServiceNameFromDeploymentName returns the ServiceName for a deployment/service name string, or false if unknown.

type TPMProvider

type TPMProvider interface {
	// InjectCerts configures TPM CA certificates for the API server.
	// certs is a map of filename -> PEM certificate data.
	// The implementation handles all environment-specific details:
	// - K8s: creates ConfigMap, updates API config with tpmCAPaths, adds volume mount, restarts deployment
	// - Quadlet: writes certs to config directory, updates config file, restarts service
	InjectCerts(ctx context.Context, certs map[string][]byte) error

	// CleanupCerts removes TPM CA certificates from the API server configuration.
	// - K8s: deletes ConfigMap, removes volume mount from deployment, restarts deployment
	// - Quadlet: removes cert files, updates config to remove tpmCAPaths, restarts service
	CleanupCerts(ctx context.Context) error
}

TPMProvider abstracts TPM certificate management for different environments. K8s: creates ConfigMap, updates API config, adds volume mount, restarts deployment. Quadlet: writes certs to config directory, updates config file, restarts service.

type TracingProvider

type TracingProvider struct {
	// contains filtered or unexported fields
}

TracingProvider starts/stops the tracing aux container and configures flightctl services accordingly.

func NewTracingProvider

func NewTracingProvider(infra InfraProvider, lifecycle ServiceLifecycleProvider) *TracingProvider

NewTracingProvider returns a TracingProvider that uses the given infra and lifecycle.

func (*TracingProvider) StartTracing

func (p *TracingProvider) StartTracing(ctx context.Context) (*auxiliary.Services, error)

StartTracing starts the tracing aux container and configures flightctl services to report to it.

func (*TracingProvider) StopTracing

func (p *TracingProvider) StopTracing() error

StopTracing reconfigures flightctl services to disable tracing, then stops the tracing aux container.

Directories

Path Synopsis
Package auxiliary provides shared testcontainer-based services for E2E tests.
Package auxiliary provides shared testcontainer-based services for E2E tests.
Package k8s provides Kubernetes-specific implementations of the infra providers.
Package k8s provides Kubernetes-specific implementations of the infra providers.
Package quadlet provides Quadlet/systemd-specific implementations of the infra providers.
Package quadlet provides Quadlet/systemd-specific implementations of the infra providers.
Package redis provides Redis and queue helpers for e2e tests using infra providers.
Package redis provides Redis and queue helpers for e2e tests using infra providers.
Package setup provides provider factory and default-providers for e2e tests.
Package setup provides provider factory and default-providers for e2e tests.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL