Documentation
¶
Overview ¶
Package controllers — RUNE-121 init-step orchestration for the instance controller. Owns iteration order, runIf evaluation, per-step retry policy, and persistence of InitStepState. Runners only execute one step at a time via Runner.RunInit.
Index ¶
- type CreateInstanceCall
- type DeleteInstanceCall
- type EndpointPublisher
- type ExecCall
- type FakeDialControllerCall
- type FakeHealthController
- func (f *FakeHealthController) AddInstance(service *types.Service, instance *types.Instance) error
- func (f *FakeHealthController) AddedInstances() []struct{ ... }
- func (f *FakeHealthController) GetHealthStatus(ctx context.Context, instanceID string) (*types.InstanceHealthStatus, error)
- func (f *FakeHealthController) RemoveInstance(instanceID string) error
- func (f *FakeHealthController) RemovedInstanceIDs() []string
- func (f *FakeHealthController) Start(ctx context.Context) error
- func (f *FakeHealthController) Stop() error
- type FakeInstanceController
- func (c *FakeInstanceController) AddInstance(instance *types.Instance)
- func (c *FakeInstanceController) CreateInstance(ctx context.Context, service *types.Service, instanceName string, ordinal int) (*types.Instance, error)
- func (c *FakeInstanceController) DeleteInstance(ctx context.Context, instance *types.Instance) error
- func (c *FakeInstanceController) Dial(ctx context.Context, instance *types.Instance, port uint32) (net.Conn, error)
- func (c *FakeInstanceController) Exec(ctx context.Context, instance *types.Instance, options types.ExecOptions) (types.ExecStream, error)
- func (c *FakeInstanceController) ExecDebug(ctx context.Context, instance *types.Instance, options types.ExecOptions) (types.ExecStream, error)
- func (c *FakeInstanceController) GetInstance(ctx context.Context, namespace, instanceID string) (*types.Instance, error)
- func (c *FakeInstanceController) GetInstanceByID(ctx context.Context, namespace, instanceID string) (*types.Instance, error)
- func (c *FakeInstanceController) GetInstanceLogs(ctx context.Context, instance *types.Instance, opts types.LogOptions) (io.ReadCloser, error)
- func (c *FakeInstanceController) GetInstanceStatus(ctx context.Context, instance *types.Instance) (*types.InstanceStatusInfo, error)
- func (c *FakeInstanceController) ListInstances(ctx context.Context, namespace string) ([]*types.Instance, error)
- func (c *FakeInstanceController) ListRunningInstances(ctx context.Context, namespace string) ([]*types.Instance, error)
- func (c *FakeInstanceController) RecreateInstance(ctx context.Context, service *types.Service, instance *types.Instance) (*types.Instance, error)
- func (c *FakeInstanceController) RepublishService(_ context.Context, _ *types.Service)
- func (c *FakeInstanceController) RepublishServiceByInstance(_ context.Context, _ *types.Instance)
- func (c *FakeInstanceController) Reset()
- func (c *FakeInstanceController) RestartInstance(ctx context.Context, instance *types.Instance, reason InstanceRestartReason) error
- func (c *FakeInstanceController) RetryCreateInstance(ctx context.Context, service *types.Service, instance *types.Instance) error
- func (c *FakeInstanceController) SetEndpointPublisher(_ EndpointPublisher, _ string)
- func (c *FakeInstanceController) SetEventLog(_ events.EventLog)
- func (c *FakeInstanceController) SetMountResolver(_ MountResolver)
- func (c *FakeInstanceController) StopInstance(ctx context.Context, instance *types.Instance) error
- func (c *FakeInstanceController) UpdateInstance(ctx context.Context, service *types.Service, instance *types.Instance) error
- type HealthController
- type InstanceController
- type InstanceRestartReason
- type MountErrorReporter
- type MountResolver
- type RecreateInstanceCall
- type RestartInstanceCall
- type RetryCreateInstanceCall
- type RunningInstance
- type ScalingController
- type ServiceController
- type ServiceInstanceData
- type SnapshotController
- type SnapshotControllerOptions
- type StopInstanceCall
- type UpdateInstanceCall
- type VolumeController
- type VolumeControllerOptions
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type CreateInstanceCall ¶
CreateInstanceCall records the parameters of a CreateInstance call
type DeleteInstanceCall ¶
DeleteInstanceCall records the parameters of a DeleteInstance call
type EndpointPublisher ¶
type EndpointPublisher interface {
// PublishService re-publishes the full Endpoint set for a service.
// `endpoints` may be empty (the service has no running instances)
// in which case the publisher should clear/Delete.
PublishService(ctx context.Context, service *types.Service, endpoints []types.Endpoint) error
// PublishLocalInstances re-publishes the per-node identity table
// for `nodeID` so that policy enforcement can map source IPs back
// to a service identity.
PublishLocalInstances(ctx context.Context, nodeID string, table map[string]types.InstanceIdentity) error
}
EndpointPublisher is the orchestrator-side surface of the networking data plane. The runed agent supplies an implementation backed by pkg/networking/endpoints + pkg/networking/localinstances.
type ExecCall ¶
type ExecCall struct {
Instance *types.Instance
Options types.ExecOptions
}
ExecCall records the parameters of an Exec call
type FakeDialControllerCall ¶
FakeDialControllerCall records one Dial invocation on the fake controller.
type FakeHealthController ¶
type FakeHealthController struct {
// contains filtered or unexported fields
}
FakeHealthController is a lightweight test double for HealthController
func NewFakeHealthController ¶
func NewFakeHealthController() *FakeHealthController
func (*FakeHealthController) AddInstance ¶
func (*FakeHealthController) AddedInstances ¶
func (f *FakeHealthController) AddedInstances() []struct { Service *types.Service Instance *types.Instance }
Helper accessors for assertions
func (*FakeHealthController) GetHealthStatus ¶
func (f *FakeHealthController) GetHealthStatus(ctx context.Context, instanceID string) (*types.InstanceHealthStatus, error)
func (*FakeHealthController) RemoveInstance ¶
func (f *FakeHealthController) RemoveInstance(instanceID string) error
func (*FakeHealthController) RemovedInstanceIDs ¶
func (f *FakeHealthController) RemovedInstanceIDs() []string
func (*FakeHealthController) Start ¶
func (f *FakeHealthController) Start(ctx context.Context) error
func (*FakeHealthController) Stop ¶
func (f *FakeHealthController) Stop() error
type FakeInstanceController ¶
type FakeInstanceController struct {
CreateInstanceCalls []CreateInstanceCall
RetryCreateInstanceCalls []RetryCreateInstanceCall
RecreateInstanceCalls []RecreateInstanceCall
UpdateInstanceCalls []UpdateInstanceCall
StopInstanceCalls []StopInstanceCall
DeleteInstanceCalls []DeleteInstanceCall
RestartInstanceCalls []RestartInstanceCall
GetStatusCalls []string // Instance IDs
GetLogsCalls []string // Instance IDs
ExecCalls []ExecCall
// Port-forward (RUNE-122)
DialCalls []FakeDialControllerCall
DialError error
LastDialPeer net.Conn
// Custom behavior options
CreateInstanceFunc func(ctx context.Context, service *types.Service, instanceName string, ordinal int) (*types.Instance, error)
RetryCreateInstanceFunc func(ctx context.Context, service *types.Service, instance *types.Instance) error
RecreateInstanceFunc func(ctx context.Context, service *types.Service, instance *types.Instance) (*types.Instance, error)
UpdateInstanceFunc func(ctx context.Context, service *types.Service, instance *types.Instance) error
StopInstanceFunc func(ctx context.Context, instance *types.Instance) error
DeleteInstanceFunc func(ctx context.Context, instance *types.Instance) error
RestartInstanceFunc func(ctx context.Context, instance *types.Instance, reason InstanceRestartReason) error
GetStatusFunc func(ctx context.Context, instance *types.Instance) (*types.InstanceStatusInfo, error)
GetLogsFunc func(ctx context.Context, instance *types.Instance, opts types.LogOptions) (io.ReadCloser, error)
ExecFunc func(ctx context.Context, instance *types.Instance, options types.ExecOptions) (types.ExecStream, error)
IsCompatibleFunc func(ctx context.Context, instance *types.Instance, service *types.Service) (bool, string)
// Default error responses
CreateInstanceError error
RetryCreateInstanceError error
RecreateInstanceError error
UpdateInstanceError error
StopInstanceError error
DeleteInstanceError error
RestartInstanceError error
GetStatusError error
GetLogsError error
ExecError error
// Mock responses
ExecStdout []byte
ExecStderr []byte
ExecExitCode int
// contains filtered or unexported fields
}
FakeInstanceController implements the InstanceController interface for testing purposes
func NewFakeInstanceController ¶
func NewFakeInstanceController() *FakeInstanceController
NewFakeInstanceController creates a new test instance controller
func (*FakeInstanceController) AddInstance ¶
func (c *FakeInstanceController) AddInstance(instance *types.Instance)
AddInstance allows tests to add an instance directly to the controller's storage
func (*FakeInstanceController) CreateInstance ¶
func (c *FakeInstanceController) CreateInstance(ctx context.Context, service *types.Service, instanceName string, ordinal int) (*types.Instance, error)
CreateInstance records a call to create an instance and returns a predefined or mocked result
func (*FakeInstanceController) DeleteInstance ¶
func (c *FakeInstanceController) DeleteInstance(ctx context.Context, instance *types.Instance) error
DeleteInstance records a call to delete an instance
func (*FakeInstanceController) Dial ¶
func (c *FakeInstanceController) Dial(ctx context.Context, instance *types.Instance, port uint32) (net.Conn, error)
Dial returns one end of a net.Pipe; the peer end is stashed on the fake controller for tests.
func (*FakeInstanceController) Exec ¶
func (c *FakeInstanceController) Exec(ctx context.Context, instance *types.Instance, options types.ExecOptions) (types.ExecStream, error)
Exec records a call to execute a command in an instance
func (*FakeInstanceController) ExecDebug ¶
func (c *FakeInstanceController) ExecDebug(ctx context.Context, instance *types.Instance, options types.ExecOptions) (types.ExecStream, error)
ExecDebug stubs the debug-sidecar path for tests. The fake doesn't model the sidecar lifecycle (that's covered by the real docker runner tests + manual e2e); we just return a fake stream so callers exercising the orchestrator surface don't blow up.
func (*FakeInstanceController) GetInstance ¶
func (c *FakeInstanceController) GetInstance(ctx context.Context, namespace, instanceID string) (*types.Instance, error)
GetInstance allows tests to retrieve an instance from the controller's storage
func (*FakeInstanceController) GetInstanceByID ¶
func (c *FakeInstanceController) GetInstanceByID(ctx context.Context, namespace, instanceID string) (*types.Instance, error)
GetInstanceByID implements InstanceController interface
func (*FakeInstanceController) GetInstanceLogs ¶
func (c *FakeInstanceController) GetInstanceLogs(ctx context.Context, instance *types.Instance, opts types.LogOptions) (io.ReadCloser, error)
GetInstanceLogs records a call to get instance logs
func (*FakeInstanceController) GetInstanceStatus ¶
func (c *FakeInstanceController) GetInstanceStatus(ctx context.Context, instance *types.Instance) (*types.InstanceStatusInfo, error)
GetInstanceStatus records a call to get instance status
func (*FakeInstanceController) ListInstances ¶
func (c *FakeInstanceController) ListInstances(ctx context.Context, namespace string) ([]*types.Instance, error)
ListInstances records a call to list instances
func (*FakeInstanceController) ListRunningInstances ¶
func (*FakeInstanceController) RecreateInstance ¶
func (c *FakeInstanceController) RecreateInstance(ctx context.Context, service *types.Service, instance *types.Instance) (*types.Instance, error)
RecreateInstance records a call to recreate an instance
func (*FakeInstanceController) RepublishService ¶
func (c *FakeInstanceController) RepublishService(_ context.Context, _ *types.Service)
RepublishService is a no-op on the fake.
func (*FakeInstanceController) RepublishServiceByInstance ¶
func (c *FakeInstanceController) RepublishServiceByInstance(_ context.Context, _ *types.Instance)
RepublishServiceByInstance is a no-op on the fake. Tests that need to observe republish calls should track them via a custom field.
func (*FakeInstanceController) Reset ¶
func (c *FakeInstanceController) Reset()
Reset clears all recorded calls and stored instances
func (*FakeInstanceController) RestartInstance ¶
func (c *FakeInstanceController) RestartInstance(ctx context.Context, instance *types.Instance, reason InstanceRestartReason) error
RestartInstance records a call to restart an instance
func (*FakeInstanceController) RetryCreateInstance ¶
func (c *FakeInstanceController) RetryCreateInstance(ctx context.Context, service *types.Service, instance *types.Instance) error
RetryCreateInstance records a call to retry the create pipeline on an existing record. Default behavior: no-op success (record stays as-is in the fake's instance map). Tests that need to observe retry calls inspect RetryCreateInstanceCalls; tests that need to simulate retry failure set RetryCreateInstanceError or RetryCreateInstanceFunc.
func (*FakeInstanceController) SetEndpointPublisher ¶
func (c *FakeInstanceController) SetEndpointPublisher(_ EndpointPublisher, _ string)
SetEndpointPublisher is a no-op on the fake.
func (*FakeInstanceController) SetEventLog ¶
func (c *FakeInstanceController) SetEventLog(_ events.EventLog)
SetEventLog is a no-op on the fake.
func (*FakeInstanceController) SetMountResolver ¶
func (c *FakeInstanceController) SetMountResolver(_ MountResolver)
SetMountResolver is a no-op on the fake.
func (*FakeInstanceController) StopInstance ¶
StopInstance records a call to stop an instance
func (*FakeInstanceController) UpdateInstance ¶
func (c *FakeInstanceController) UpdateInstance(ctx context.Context, service *types.Service, instance *types.Instance) error
UpdateInstance records a call to update an instance
type HealthController ¶
type HealthController interface {
// Start the health controller
Start(ctx context.Context) error
// Stop the health controller
Stop() error
// AddInstance adds an instance to be monitored
AddInstance(service *types.Service, instance *types.Instance) error
// RemoveInstance removes an instance from monitoring
RemoveInstance(instanceID string) error
// GetHealthStatus gets the current health status of an instance
GetHealthStatus(ctx context.Context, instanceID string) (*types.InstanceHealthStatus, error)
}
HealthController monitors instance health
func NewHealthController ¶
func NewHealthController(logger log.Logger, store store.Store, runnerManager manager.IRunnerManager, instanceController InstanceController) HealthController
NewHealthController creates a new health controller
type InstanceController ¶
type InstanceController interface {
// GetInstanceByID gets an instance by ID
GetInstanceByID(ctx context.Context, namespace, instanceID string) (*types.Instance, error)
// ListInstances lists all instances in a namespace
ListInstances(ctx context.Context, namespace string) ([]*types.Instance, error)
// GetRunningInstances lists all running instances
ListRunningInstances(ctx context.Context, namespace string) ([]*types.Instance, error)
// CreateInstance creates a new instance for a service. ordinal is the
// per-replica slot index assigned by the reconciler; it is stored on the
// instance and drives per-replica volume claimTemplate binding.
CreateInstance(ctx context.Context, service *types.Service, instanceName string, ordinal int) (*types.Instance, error)
// RetryCreateInstance re-runs the create pipeline against an
// existing record that previously failed in a stuck-in-create
// state (Status=Failed, ContainerEverCreatedAt==nil). Same UUID,
// same Name. Called by the reconciler when the stuck record's
// NextCreateAttemptAt backoff has elapsed.
RetryCreateInstance(ctx context.Context, service *types.Service, instance *types.Instance) error
// RecreateInstance recreates an instance
RecreateInstance(ctx context.Context, service *types.Service, instance *types.Instance) (*types.Instance, error)
// UpdateInstance updates an existing instance
UpdateInstance(ctx context.Context, service *types.Service, instance *types.Instance) error
// StopInstance stops an instance temporarily but keeps it in the store
StopInstance(ctx context.Context, instance *types.Instance) error
// DeleteInstance marks an instance for deletion and cleans up runner resources
// The instance will remain in the store with Deleted status until garbage collection
DeleteInstance(ctx context.Context, instance *types.Instance) error
// GetInstanceStatus gets the current status of an instance
GetInstanceStatus(ctx context.Context, instance *types.Instance) (*types.InstanceStatusInfo, error)
// GetInstanceLogs gets logs for an instance
GetInstanceLogs(ctx context.Context, instance *types.Instance, opts types.LogOptions) (io.ReadCloser, error)
// RestartInstance restarts an instance with respect to the service's restart policy
RestartInstance(ctx context.Context, instance *types.Instance, reason InstanceRestartReason) error
// Exec executes a command in a running instance
// Returns an ExecStream for bidirectional communication
Exec(ctx context.Context, instance *types.Instance, options types.ExecOptions) (types.ExecStream, error)
// ExecDebug spawns an ephemeral inspection sidecar from a Failed
// instance's template (image, env, mounts), with the entrypoint
// overridden to `sleep infinity`, and execs options.Command inside
// the sidecar. The sidecar is removed when the returned ExecStream
// is Closed. The original Failed container is never touched.
ExecDebug(ctx context.Context, instance *types.Instance, options types.ExecOptions) (types.ExecStream, error)
// Dial opens a TCP connection to the given port on a running
// instance (RUNE-122). Returns a net.Conn owned by the caller.
Dial(ctx context.Context, instance *types.Instance, port uint32) (net.Conn, error)
// SetEndpointPublisher wires the networking data plane (RUNE-063).
// May be called once at startup; nil-publisher disables publishing.
SetEndpointPublisher(publisher EndpointPublisher, nodeID string)
// SetMountResolver wires the agent-side volumes Subsystem
// (RUNE-069). May be called once at startup; nil disables
// resolver-first mount-target lookup and falls back to
// Volume.Handle.
SetMountResolver(resolver MountResolver)
// SetEventLog wires the persisted event log (RUNE-126 Phase 2)
// so status transitions surface in `rune describe`. Nil-safe.
SetEventLog(eventLog events.EventLog)
// RepublishServiceByInstance recomputes the data-plane endpoint set
// for the service owning the given instance. Exposed for callers
// outside instanceController that change instance reachability
// (e.g. the health controller promoting Starting→Running on the
// first readiness pass). Nil-safe when no endpoint publisher is
// wired; safe to call repeatedly.
RepublishServiceByInstance(ctx context.Context, instance *types.Instance)
// RepublishService refreshes the dataplane endpoint set from
// current store state (including live container IPs). Safe to
// call on every reconcile tick.
RepublishService(ctx context.Context, service *types.Service)
// contains filtered or unexported methods
}
InstanceController manages instance lifecycle
func NewInstanceController ¶
func NewInstanceController(store store.Store, runnerManager manager.IRunnerManager, logger log.Logger) InstanceController
NewInstanceController creates a new instance controller
type InstanceRestartReason ¶
type InstanceRestartReason string
const ( InstanceRestartReasonManual InstanceRestartReason = "manual" InstanceRestartReasonHealthCheckFailure InstanceRestartReason = "health-check-failure" InstanceRestartReasonUpdate InstanceRestartReason = "update" InstanceRestartReasonFailure InstanceRestartReason = "failure" )
type MountErrorReporter ¶
MountErrorReporter is an optional companion to MountResolver that explains WHY a volume is not mounted. Without it, an instance blocked on storage only ever reported "not yet mounted (will retry)", which reads as a benign transient. In practice an expired cloud credential once stranded volumes that were attached and mounted the whole time, with the real HTTP 401 visible only in the agent's startup log — undiagnosable from the CLI. Implementations return the most recent bring-up failure for the volume.
type MountResolver ¶
type MountResolver interface {
// MountTargetFor returns the host-side mount target for the named
// volume on this node, plus a presence flag. A false return means
// the subsystem has not (yet) mounted the volume locally; callers
// should treat this as a transient "not ready" condition.
MountTargetFor(volumeID string) (string, bool)
}
MountResolver is the orchestrator-side surface of the agent's volumes Subsystem. The runed agent supplies an implementation backed by internal/agent/volumes.Subsystem.
type RecreateInstanceCall ¶
RecreateInstanceCall records the parameters of a RecreateInstance call
type RestartInstanceCall ¶
type RestartInstanceCall struct {
Instance *types.Instance
Reason InstanceRestartReason
}
RestartInstanceCall records the parameters of a RestartInstance call
type RetryCreateInstanceCall ¶
RetryCreateInstanceCall records the parameters of a RetryCreateInstance call
type RunningInstance ¶
type RunningInstance struct {
Instance *types.Instance
IsOrphaned bool
Runner types.RunnerType
}
RunningInstance represents an instance found running in a runner
type ScalingController ¶
type ScalingController interface {
// Start the scaling controller
Start(ctx context.Context) error
// Stop the scaling controller
Stop()
// CreateScalingOperation creates a new scaling operation
CreateScalingOperation(ctx context.Context, service *types.Service, params types.ScalingOperationParams) error
// GetActiveOperation gets the active scaling operation for a service
GetActiveOperation(ctx context.Context, namespace, serviceName string) (*types.ScalingOperation, error)
}
ScalingController manages scaling operations for services
func NewScalingController ¶
func NewScalingController(store store.Store, logger log.Logger) ScalingController
NewScalingController creates a new scaling controller
type ServiceController ¶
type ServiceController interface {
Start(ctx context.Context) error
Stop() error
GetServiceStatus(ctx context.Context, namespace, name string) (*types.ServiceStatusInfo, error)
UpdateServiceStatus(ctx context.Context, service *types.Service, status types.ServiceStatus) error
GetServiceLogs(ctx context.Context, namespace, name string, opts types.LogOptions) (io.ReadCloser, error)
ExecInService(ctx context.Context, namespace, serviceName string, options types.ExecOptions) (types.ExecStream, error)
DialInService(ctx context.Context, namespace, serviceName string, port uint32) (net.Conn, *types.Instance, error)
RestartService(ctx context.Context, namespace, serviceName string) (templateGeneration int64, scale int, err error)
StopService(ctx context.Context, namespace, serviceName string) error
DeleteService(ctx context.Context, request *types.DeletionRequest) (*types.DeletionResponse, error)
GetDeletionStatus(ctx context.Context, namespace, name string) (*types.DeletionOperation, error)
// contains filtered or unexported methods
}
ServiceController implements the Controller interface for service management
func NewServiceController ¶
func NewServiceController( store store.Store, instanceController InstanceController, healthController HealthController, logger log.Logger, ) (ServiceController, error)
NewServiceController creates a new service controller
type ServiceInstanceData ¶
type ServiceInstanceData struct {
Instances []types.Instance
OrphanedInstances []*types.Instance // Actual orphaned instance objects
}
ServiceInstanceData contains instances and orphaned instance information
type SnapshotController ¶
SnapshotController owns the lifecycle of Snapshot resources: it watches the store, resolves the source Volume + StorageClass + driver, drives Pending → Creating → Ready, and on Deleting calls Driver.DeleteSnapshot before removing the row.
Introduced in RUNE-071 (Slice 10a).
func NewSnapshotController ¶
func NewSnapshotController(opts SnapshotControllerOptions) (SnapshotController, error)
NewSnapshotController constructs a SnapshotController.
type SnapshotControllerOptions ¶
type SnapshotControllerOptions struct {
Store store.Store
Logger log.Logger
DriverConfigs map[string]map[string]any
// SecretLookup resolves `secret:...` references inside the
// merged driver parameters before Snapshot / DeleteSnapshot
// calls. See RUNE-200 PR 3 and pkg/storage/driverparams.
SecretLookup driverparams.SecretLookup
}
SnapshotControllerOptions configures the controller.
type StopInstanceCall ¶
StopInstanceCall records the parameters of a StopInstance call
type UpdateInstanceCall ¶
UpdateInstanceCall records the parameters of an UpdateInstance call
type VolumeController ¶
type VolumeController interface {
Start(ctx context.Context) error
Stop() error
// SetEventLog wires the persisted event log (RUNE-126 Phase 2)
// so volume status transitions surface in `rune describe`. Nil-safe.
SetEventLog(eventLog events.EventLog)
}
VolumeController owns the lifecycle of Volume resources: it watches the store, picks a driver from the resolved StorageClass, and drives the Pending → Provisioning → Available state machine. On deletion it honours the reclaim policy (delete via the driver, or leave the handle in place for retain).
Scope for this iteration is intentionally narrow:
No claim binding (that lives with the runner-integration ticket; this controller leaves Volume.BoundClaim untouched).
No expand reconciliation (the Volume size field is observed but not compared to the existing handle).
No snapshot scheduling (handled in RUNE-071).
Introduced in RUNE-069.
func NewVolumeController ¶
func NewVolumeController(opts VolumeControllerOptions) (VolumeController, error)
NewVolumeController constructs a VolumeController.
type VolumeControllerOptions ¶
type VolumeControllerOptions struct {
Store store.Store
Logger log.Logger
DriverConfigs map[string]map[string]any
// SecretLookup resolves `secret:<name>[.namespace.rune]/<key>`
// references inside StorageClass / Volume parameters before the
// controller calls the driver. Wired by cmd/runed against the
// store-backed SecretRepo so rotation takes effect on the next
// reconcile. nil disables resolution — secret-ref-shaped values
// then fail Provision with a clear error (see RUNE-200 PR 3).
SecretLookup driverparams.SecretLookup
// DefaultStorageClass mirrors the runefile [storage].defaultStorageClass
// knob. nil keeps the built-in default ("local"); a non-nil pointer
// to a non-empty name promotes that class to Default:true at boot
// (creating it as a no-op marker if needed); a non-nil pointer to
// the empty string disables the cluster default entirely (any
// existing Default flag is cleared, and Volumes with empty
// storageClassName fail to resolve).
DefaultStorageClass *string
// PreserveOnDelete, when true, demotes ReclaimPolicy:delete to
// retain for volumes provisioned by the in-tree "local" driver. Has
// no effect on other drivers.
PreserveOnDelete bool
// Provision retry tuning. Zero values fall back to defaults
// (5 attempts, 2s base, 30s cap) so existing callers don't need
// updating.
MaxProvisionAttempts int
ProvisionBaseBackoff time.Duration
ProvisionMaxBackoff time.Duration
}
VolumeControllerOptions configures the controller. DriverConfigs is the per-driver-name configuration block parsed out of the runefile [storage] section — for example `{"local": {"localVolumeRoot": "/var/lib/rune"}}`. nil/missing entries are passed to the factory as nil, which all in-tree drivers tolerate.