|
5 | 5 | "log/slog" |
6 | 6 | "sync" |
7 | 7 | "time" |
| 8 | + |
| 9 | + "github.com/netboxlabs/orb-agent/agent/policies" |
8 | 10 | ) |
9 | 11 |
|
10 | 12 | // MinRestartTime is the minimum time to wait between restarts |
@@ -33,16 +35,18 @@ type stateManager struct { |
33 | 35 | ticker *time.Ticker |
34 | 36 | logger *slog.Logger |
35 | 37 | restartBackendChan chan string |
| 38 | + policyRepo policies.PolicyRepo |
36 | 39 | } |
37 | 40 |
|
38 | 41 | // NewStateManager creates a new StateManager with the given logger and restart channel |
39 | | -func NewStateManager(activeConfigMgr string, logger *slog.Logger, restartBackendChan chan string) StateManager { |
| 42 | +func NewStateManager(activeConfigMgr string, logger *slog.Logger, restartBackendChan chan string, policyRepo policies.PolicyRepo) StateManager { |
40 | 43 | if configMgrSupportsStateMonitoring(activeConfigMgr) { |
41 | 44 | return &stateManager{ |
42 | 45 | backendState: make(map[string]*State), |
43 | 46 | ticker: time.NewTicker(BackendMonitorInterval), |
44 | 47 | logger: logger, |
45 | 48 | restartBackendChan: restartBackendChan, |
| 49 | + policyRepo: policyRepo, |
46 | 50 | } |
47 | 51 | } |
48 | 52 | return nullStateManager{} |
@@ -99,6 +103,21 @@ func (manager *stateManager) StartBackendMonitor(name string, be Backend) { |
99 | 103 | } |
100 | 104 | } |
101 | 105 | manager.mu.Unlock() |
| 106 | + |
| 107 | + // Poll policy status if backend supports it |
| 108 | + if provider, ok := be.(PolicyStatusProvider); ok && manager.policyRepo != nil { |
| 109 | + statuses, err := provider.GetPolicyStatus() |
| 110 | + if err != nil { |
| 111 | + manager.logger.Debug("failed to get policy status", "backend", name, "error", err) |
| 112 | + } else { |
| 113 | + for _, ps := range statuses { |
| 114 | + jobs := convertToJobData(ps.Jobs) |
| 115 | + if err := manager.policyRepo.UpdateJobs(ps.Name, jobs); err != nil { |
| 116 | + manager.logger.Debug("failed to update jobs for policy", "policy", ps.Name, "error", err) |
| 117 | + } |
| 118 | + } |
| 119 | + } |
| 120 | + } |
102 | 121 | } |
103 | 122 | }() |
104 | 123 | } |
@@ -138,3 +157,19 @@ func (manager *stateManager) Get() map[string]*State { |
138 | 157 | } |
139 | 158 | return result |
140 | 159 | } |
| 160 | + |
| 161 | +// convertToJobData converts backend PolicyStatusJob to policies.JobData |
| 162 | +func convertToJobData(statusJobs []PolicyStatusJob) []policies.JobData { |
| 163 | + jobs := make([]policies.JobData, len(statusJobs)) |
| 164 | + for i, sj := range statusJobs { |
| 165 | + jobs[i] = policies.JobData{ |
| 166 | + ID: sj.ID, |
| 167 | + Status: sj.Status, |
| 168 | + Reason: sj.Reason, |
| 169 | + EntityCount: sj.EntityCount, |
| 170 | + CreatedAt: sj.CreatedAt, |
| 171 | + UpdatedAt: sj.UpdatedAt, |
| 172 | + } |
| 173 | + } |
| 174 | + return jobs |
| 175 | +} |
0 commit comments