Vaultx.Config.HotReload (Vaultx v0.7.0)

View Source

Runtime configuration hot reloading for VaultX without application restart.

This module provides safe, atomic configuration reloading capabilities that allow VaultX to update its configuration at runtime without requiring application restart. It includes validation, backup, rollback, and notification mechanisms to ensure reliable configuration updates.

Features

  • Atomic Updates: Configuration changes are applied atomically
  • Validation: New configuration is validated before application
  • Backup & Rollback: Automatic backup and rollback on failure
  • Change Notifications: Notify components of configuration changes
  • Health Checks: Verify system health after configuration changes
  • Graceful Degradation: Handle partial failures gracefully

Safety Mechanisms

Pre-Update Validation

  • Configuration syntax and type validation
  • Connectivity testing with new settings
  • Security policy compliance checking
  • Performance impact assessment

Post-Update Verification

  • System health checks
  • Connectivity verification
  • Performance monitoring
  • Error rate monitoring

Rollback Triggers

  • Validation failures
  • Connectivity issues
  • Performance degradation
  • Error rate increases
  • Manual rollback requests

Usage

# Simple hot reload
:ok = Vaultx.Config.HotReload.reload_configuration(new_config)

# Hot reload with validation and backup
:ok = Vaultx.Config.HotReload.reload_configuration(new_config,
  validate: true,
  backup: true,
  rollback_on_error: true
)

# Check reload status
{:ok, status} = Vaultx.Config.HotReload.get_reload_status()

Integration

This module integrates with the existing VaultX configuration system and maintains compatibility with all existing configuration mechanisms.

Summary

Functions

Returns a specification to start this module under a supervisor.

Clears the configuration backup.

Gets the current reload status.

Reloads configuration at runtime with the specified options.

Rolls back to the previous configuration if a backup is available.

Starts the hot reload server.

Types

reload_options()

@type reload_options() :: [
  validate: boolean(),
  backup: boolean(),
  rollback_on_error: boolean(),
  health_check_timeout: pos_integer(),
  notification_timeout: pos_integer()
]

reload_result()

@type reload_result() :: :ok | {:error, Vaultx.Base.Error.t()}

reload_status()

@type reload_status() :: %{
  status: :idle | :reloading | :validating | :applying | :verifying | :failed,
  last_reload_at: DateTime.t() | nil,
  last_error: String.t() | nil,
  backup_available: boolean(),
  reload_count: non_neg_integer()
}

Functions

child_spec(init_arg)

Returns a specification to start this module under a supervisor.

See Supervisor.

clear_backup()

@spec clear_backup() :: :ok | {:error, Vaultx.Base.Error.t()}

Clears the configuration backup.

Returns

  • :ok - Backup cleared
  • {:error, reason} - Failed to clear backup

get_reload_status()

@spec get_reload_status() :: {:ok, reload_status()} | {:error, Vaultx.Base.Error.t()}

Gets the current reload status.

Returns

  • {:ok, status} - Current reload status
  • {:error, reason} - Failed to get status

Examples

{:ok, status} = Vaultx.Config.HotReload.get_reload_status()

case status.status do
  :idle -> IO.puts("No reload in progress")
  :reloading -> IO.puts("Reload in progress")
  :failed -> IO.puts("Last reload failed: #{status.last_error}")
end

reload_configuration(new_config, opts \\ [])

@spec reload_configuration(map() | keyword(), reload_options()) :: reload_result()

Reloads configuration at runtime with the specified options.

Parameters

  • new_config - New configuration map or keyword list
  • opts - Reload options

Options

  • :validate - Validate configuration before applying (default: true)
  • :backup - Create backup of current configuration (default: true)
  • :rollback_on_error - Automatically rollback on errors (default: true)
  • :health_check_timeout - Timeout for health checks in ms (default: 30_000)
  • :notification_timeout - Timeout for notifications in ms (default: 5_000)

Returns

  • :ok - Configuration reloaded successfully
  • {:error, reason} - Reload failed

Examples

# Simple reload
:ok = Vaultx.Config.HotReload.reload_configuration(new_config)

# Reload with custom options
:ok = Vaultx.Config.HotReload.reload_configuration(new_config,
  validate: true,
  backup: true,
  rollback_on_error: true,
  health_check_timeout: 60_000
)

rollback()

@spec rollback() :: reload_result()

Rolls back to the previous configuration if a backup is available.

Returns

  • :ok - Rollback successful
  • {:error, reason} - Rollback failed

Examples

case Vaultx.Config.HotReload.rollback() do
  :ok -> IO.puts("Rollback successful")
  {:error, reason} -> IO.puts("Rollback failed: #{reason}")
end

start_link(opts \\ [])

@spec start_link(keyword()) :: GenServer.on_start()

Starts the hot reload server.

This function is typically called by the application supervisor.