@@ -15,12 +15,14 @@ import (
1515 "github.com/netboxlabs/orb-agent/agent/otlpbridge"
1616 "github.com/netboxlabs/orb-agent/agent/policymgr"
1717 "github.com/netboxlabs/orb-agent/agent/redact"
18+ "github.com/netboxlabs/orb-agent/agent/secretsmgr"
1819)
1920
20- // Compile-time check to ensure fleetConfigManager implements Manager interface
21- var _ Manager = (* fleetConfigManager )(nil )
21+ // Compile-time check to ensure FleetConfigManager implements Manager interface
22+ var _ Manager = (* FleetConfigManager )(nil )
2223
23- type fleetConfigManager struct {
24+ // FleetConfigManager implements the Manager interface for Fleet-based configuration
25+ type FleetConfigManager struct {
2426 logger * slog.Logger
2527 connection fleet.MQTTConnector
2628 authTokenManager * fleet.AuthTokenManager
@@ -38,10 +40,10 @@ type fleetConfigManager struct {
3840 monitorCancel context.CancelFunc
3941}
4042
41- func newFleetConfigManager (logger * slog.Logger , pMgr policymgr.PolicyManager , backendState backend.StateRetriever ) * fleetConfigManager {
43+ func newFleetConfigManager (logger * slog.Logger , pMgr policymgr.PolicyManager , backendState backend.StateRetriever ) * FleetConfigManager {
4244 resetChan := make (chan struct {}, 1 )
4345 reconnectChan := make (chan struct {}, 1 )
44- return & fleetConfigManager {
46+ return & FleetConfigManager {
4547 logger : logger ,
4648 connection : fleet .NewMQTTConnection (logger , pMgr , resetChan , reconnectChan , backendState ),
4749 authTokenManager : fleet .NewAuthTokenManager (logger ),
@@ -52,11 +54,11 @@ func newFleetConfigManager(logger *slog.Logger, pMgr policymgr.PolicyManager, ba
5254 }
5355}
5456
55- // newFleetConfigManagerWithConnection creates a fleetConfigManager with a custom connection (for testing)
56- func newFleetConfigManagerWithConnection (logger * slog.Logger , pMgr policymgr.PolicyManager , backendState backend.StateRetriever , conn fleet.MQTTConnector ) * fleetConfigManager {
57+ // newFleetConfigManagerWithConnection creates a FleetConfigManager with a custom connection (for testing)
58+ func newFleetConfigManagerWithConnection (logger * slog.Logger , pMgr policymgr.PolicyManager , backendState backend.StateRetriever , conn fleet.MQTTConnector ) * FleetConfigManager {
5759 resetChan := make (chan struct {}, 1 )
5860 reconnectChan := make (chan struct {}, 1 )
59- return & fleetConfigManager {
61+ return & FleetConfigManager {
6062 logger : logger ,
6163 connection : conn , // Use provided connection instead of creating new one
6264 authTokenManager : fleet .NewAuthTokenManager (logger ),
@@ -67,7 +69,8 @@ func newFleetConfigManagerWithConnection(logger *slog.Logger, pMgr policymgr.Pol
6769 }
6870}
6971
70- func (fleetManager * fleetConfigManager ) Start (cfg config.Config , backends map [string ]backend.Backend ) error {
72+ // Start initializes and starts the Fleet configuration manager
73+ func (fleetManager * FleetConfigManager ) Start (cfg config.Config , backends map [string ]backend.Backend ) error {
7174 ctx := context .Background ()
7275
7376 var err error
@@ -222,8 +225,48 @@ func (fleetManager *fleetConfigManager) Start(cfg config.Config, backends map[st
222225 return nil
223226}
224227
228+ // BindSecretsManager binds a fleet secrets manager to the MQTT connection
229+ func (fleetManager * FleetConfigManager ) BindSecretsManager (sm secretsmgr.Manager ) error {
230+ // Check if it's a fleet secrets manager by type assertion
231+ fleetSM , ok := sm .(* secretsmgr.FleetSecretsManager )
232+ if ! ok {
233+ // Try to get the underlying fleet secrets manager
234+ // This handles the case where the manager is wrapped
235+ return nil // Not a fleet secrets manager, nothing to bind
236+ }
237+
238+ // Register OnReadyHook to bind secrets manager when MQTT connection is ready
239+ fleetManager .connection .AddOnReadyHook (func (cm * autopaho.ConnectionManager , topics fleet.TokenResponseTopics ) {
240+ // Create publisher and subscriber adapters
241+ pub := secretsmgr .NewCMAdapterPublisher (cm )
242+ sub := secretsmgr .NewCMAdapterSubscriber (cm )
243+
244+ // Bind the secrets manager to MQTT
245+ if err := fleetSM .BindMQTT (pub , sub , topics .SecretsRequest , topics .SecretsResponse , topics .SecretsUpdated ); err != nil {
246+ fleetManager .logger .Error ("failed to bind fleet secrets manager to MQTT" , "error" , err )
247+ return
248+ }
249+
250+ // Register topic handlers for secrets topics
251+ // Note: These handlers will be called from OnPublishReceived in connection.go
252+ fleetManager .connection .RegisterTopicHandler (topics .SecretsResponse , func (topic string , payload []byte ) error {
253+ return fleetSM .HandleMessage (topic , payload )
254+ })
255+ fleetManager .connection .RegisterTopicHandler (topics .SecretsUpdated , func (topic string , payload []byte ) error {
256+ return fleetSM .HandleMessage (topic , payload )
257+ })
258+
259+ fleetManager .logger .Info ("Fleet secrets manager bound to MQTT" ,
260+ slog .String ("request_topic" , topics .SecretsRequest ),
261+ slog .String ("response_topic" , topics .SecretsResponse ),
262+ slog .String ("updated_topic" , topics .SecretsUpdated ))
263+ })
264+
265+ return nil
266+ }
267+
225268// refreshAndReconnect refreshes the JWT token and reconnects to MQTT
226- func (fleetManager * fleetConfigManager ) refreshAndReconnect (ctx context.Context , timeout time.Duration ) error {
269+ func (fleetManager * FleetConfigManager ) refreshAndReconnect (ctx context.Context , timeout time.Duration ) error {
227270 // Refresh JWT token
228271 token , err := fleetManager .authTokenManager .RefreshToken (ctx )
229272 if err != nil {
@@ -271,7 +314,7 @@ func (fleetManager *fleetConfigManager) refreshAndReconnect(ctx context.Context,
271314 return nil
272315}
273316
274- func (fleetManager * fleetConfigManager ) configToSafeString (cfg config.Config ) (string , error ) {
317+ func (fleetManager * FleetConfigManager ) configToSafeString (cfg config.Config ) (string , error ) {
275318 redacted := redact .SensitiveData (cfg )
276319 configYaml , err := yaml .Marshal (redacted )
277320 if err != nil {
@@ -280,13 +323,14 @@ func (fleetManager *fleetConfigManager) configToSafeString(cfg config.Config) (s
280323 return string (configYaml ), nil
281324}
282325
283- func (fleetManager * fleetConfigManager ) GetContext (ctx context.Context ) context.Context {
326+ // GetContext returns the context for the Fleet configuration manager
327+ func (fleetManager * FleetConfigManager ) GetContext (ctx context.Context ) context.Context {
284328 // Empty implementation for now - just return the context as-is
285329 return ctx
286330}
287331
288332// monitorTokenExpiry periodically checks token expiry and triggers reconnection before token expires
289- func (fleetManager * fleetConfigManager ) monitorTokenExpiry () {
333+ func (fleetManager * FleetConfigManager ) monitorTokenExpiry () {
290334 // Check interval: default 30 seconds, configurable via config
291335 checkInterval := 30 * time .Second
292336 if fleetManager .config .OrbAgent .ConfigManager .Sources .Fleet .TokenExpiryCheckInterval != nil && * fleetManager .config .OrbAgent .ConfigManager .Sources .Fleet .TokenExpiryCheckInterval > 0 {
@@ -346,7 +390,7 @@ func (fleetManager *fleetConfigManager) monitorTokenExpiry() {
346390}
347391
348392// Stop gracefully shuts down the OTLP bridge and token expiry monitor.
349- func (fleetManager * fleetConfigManager ) Stop (ctx context.Context ) error {
393+ func (fleetManager * FleetConfigManager ) Stop (ctx context.Context ) error {
350394 // Stop token expiry monitor
351395 if fleetManager .monitorCancel != nil {
352396 fleetManager .monitorCancel ()
0 commit comments