| // Package bmdb implements a connector to the Bare Metal Database, which is the |
| // main data store backing information about bare metal machines. |
| // |
| // All components of the BMaaS project connect directly to the underlying |
| // CockroachDB database storing this data via this library. In the future, this |
| // library might turn into a shim which instead connects to a coordinator |
| // service over gRPC. |
| package bmdb |
| |
| import ( |
| "github.com/prometheus/client_golang/prometheus" |
| |
| "source.monogon.dev/cloud/bmaas/bmdb/metrics" |
| "source.monogon.dev/cloud/lib/component" |
| ) |
| |
| // BMDB is the Bare Metal Database, a common schema to store information about |
| // bare metal machines in CockroachDB. This struct is supposed to be |
| // embedded/contained by different components that interact with the BMDB, and |
| // provides a common interface to BMDB operations to these components. |
| // |
| // The BMDB provides two mechanisms facilitating a 'reactive work system' being |
| // implemented on the bare metal machine data: |
| // |
| // - Sessions, which are maintained by heartbeats by components and signal the |
| // liveness of said components to other components operating on the BMDB. These |
| // effectively extend CockroachDB's transactions to be visible as row data. Any |
| // session that is not actively being updated by a component can be expired by a |
| // component responsible for lease garbage collection. |
| // - Work locking, which bases on Sessions and allows long-standing |
| // multi-transaction work to be performed on given machines, preventing |
| // conflicting work from being performed by other components. As both Work |
| // locking and Sessions are plain row data, other components can use SQL queries |
| // to exclude machines to act on by constraining SELECT queries to not return |
| // machines with some active work being performed on them. |
| type BMDB struct { |
| Config |
| |
| metrics *metrics.MetricsSet |
| } |
| |
| // Config is the configuration of the BMDB connector. |
| type Config struct { |
| Database component.CockroachConfig |
| |
| // ComponentName is a human-readable name of the component connecting to the |
| // BMDB, and is stored in any Sessions managed by this component's connector. |
| ComponentName string |
| // RuntimeInfo is a human-readable 'runtime information' (eg. software version, |
| // host machine/job information, IP address, etc.) stored alongside the |
| // ComponentName in active Sessions. |
| RuntimeInfo string |
| } |
| |
| // EnableMetrics configures BMDB metrics collection and registers it on the given |
| // registry. This method should only be called once, and is not goroutine safe. |
| func (b *BMDB) EnableMetrics(registry *prometheus.Registry) { |
| if b.metrics == nil { |
| b.metrics = metrics.New(registry) |
| } |
| } |