Documentation
¶
Overview ¶
Package infra provides testcontainers-based infrastructure for E2E tests.
Package infra provides E2E test infrastructure in two separate layers:
Aux services (test/e2e/infra/aux): Shared testcontainers that run the same for all deployments — registry, git server, prometheus. Use auxiliary.Get(ctx).
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
- Variables
- func DetectEnvironment() string
- func GetAPIEndpoint() string
- func GetDefaultQuadletAPIEndpoint() string
- func IsK8sEnvironment() bool
- func IsQuadletEnvironment() bool
- func IsRemoteDeployment() bool
- func NormalizeEnvironmentType(envType string) string
- func RequireEnvironment(envType string)
- func SkipIfEnvironment(envType string, reason ...string)
- func SkipIfNotK8s(reason ...string)
- func SkipIfNotQuadlet(reason ...string)
- func SkipIfRBACNotSupported(rbacProvider RBACProvider)
- type EnvironmentConfig
- type InfraProvider
- type Permission
- type ProviderFactory
- type Providers
- type RBACProvider
- type RoleBindingSpec
- type RoleSpec
- type SecretsProvider
- type ServiceLifecycleProvider
- type ServiceName
- type TPMProvider
- type TracingProvider
Constants ¶
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
const ( // DefaultQuadletConfigDir is the default config directory for Quadlet deployments DefaultQuadletConfigDir = "/etc/flightctl" // DefaultAPIPort is the default port for the FlightCtl API DefaultAPIPort = "443" )
Default values for different environments
const ( EnvironmentKind = "kind" EnvironmentOCP = "ocp" EnvironmentQuadlet = "quadlet" )
EnvironmentType constants for environment detection.
const CoreAPIGroup = "core"
CoreAPIGroup is the sentinel for Kubernetes core API group (e.g. secrets). Use in Permission.ApiGroup.
const OrgLabelKey = "io.flightctl/instance"
OrgLabelKey is the namespace/project label key for the Flight Control release (K8s: io.flightctl/instance=<releaseName>).
Variables ¶
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.
var ErrSecretsNotSupported = fmt.Errorf("secrets not supported in this environment")
ErrSecretsNotSupported is returned when the environment does not support secret storage (e.g. quadlet).
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 ¶
NormalizeEnvironmentType normalizes environment type strings.
func RequireEnvironment ¶
func RequireEnvironment(envType string)
RequireEnvironment fails the test if not running in the specified environment.
func SkipIfEnvironment ¶
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")
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> (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 ¶
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.
Source Files
¶
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. |