This package provides the ability to populate a crd.Controller
dynamically via a function that provides additional config. The monitor will acquire snapshots of additional changes and populate the crd.Controller
as needed.
To create a monitor, you should provide the crd.Controller
, a polling interval, and a function that returns []*model.Config
.
monitor := file.NewMonitor( controller, // The crd controller holding the store and event handlers 1*time.Second, // How quickly the monitor requests new snapshots getSnapshotFunc) // The function used to acquire new config
Once created, you simply run the monitor, providing a stop channel.
stop := make(chan struct{}) ... monitor.Start(stop)
The Start
method will kick off an asynchronous polling loop and will return immediately.
To configure and run a monitor that watches for file changes to update an in-memory config store:
// Configure the config store store := memory.Make(configDescriptor) controller = memory.NewController(store) // Create an object that will take snapshots of config fileSnapshot := configmonitor.NewFileSnapshot(args.Config.FileDir, configDescriptor) // Provide snapshot func to monitor fileMonitor := configmonitor.NewMonitor(controller, 100*time.Millisecond, fileSnapshot.ReadFile) // Run the controller and monitor stop := make(chan struct{}) go controller.run(stop) monitor.Start(stop)
See monitor_test.go
and file_snapshot_test.go
for more examples.
While the API supports any model.ConfigStore
, it is recommended to always use a crd.Controller
so that other system components can be notified of changes via controller.RegisterEventHandler()
.
The Start
method will immediately check the provided getSnapshotFunc
and update the controller appropriately before returning. This helps to simplify tests that rely on starting in a particular state.
After performing an initial update, the Start
method then forks an asynchronous polling loop for update/termination.