@@ -7,10 +7,12 @@ import (
77 "testing"
88
99 "github.com/stretchr/testify/assert"
10+ "github.com/stretchr/testify/require"
1011
1112 "github.com/netboxlabs/orb-agent/agent/backend"
1213 "github.com/netboxlabs/orb-agent/agent/config"
1314 "github.com/netboxlabs/orb-agent/agent/configmgr"
15+ "github.com/netboxlabs/orb-agent/agent/policies"
1416)
1517
1618// mockConfigManager implements configmgr.Manager for testing Stop delegation
@@ -40,3 +42,205 @@ func TestAgentStop_DelegatesToConfigManagerStop(t *testing.T) {
4042
4143 assert .True (t , mockMgr .stopCalled , "expected configManager.Stop to be called" )
4244}
45+
46+ // mockPolicyManager implements policymgr.PolicyManager for testing
47+ type mockPolicyManager struct {
48+ repo policies.PolicyRepo
49+ }
50+
51+ func (m * mockPolicyManager ) ManagePolicy (_ config.PolicyPayload ) {}
52+ func (m * mockPolicyManager ) RemovePolicyDataset (_ string , _ string , _ backend.Backend ) {}
53+ func (m * mockPolicyManager ) GetPolicyState () ([]policies.PolicyData , error ) {
54+ return nil , nil
55+ }
56+
57+ func (m * mockPolicyManager ) GetRepo () policies.PolicyRepo {
58+ return m .repo
59+ }
60+
61+ func (m * mockPolicyManager ) ApplyBackendPolicies (_ backend.Backend ) error {
62+ return nil
63+ }
64+
65+ func (m * mockPolicyManager ) RemoveBackendPolicies (_ backend.Backend , _ bool ) error {
66+ return nil
67+ }
68+
69+ func (m * mockPolicyManager ) RemovePolicy (_ string , _ string , _ string ) error {
70+ return nil
71+ }
72+
73+ // mockSecretsManager implements secretsmgr.Manager for testing
74+ type mockSecretsManager struct {}
75+
76+ func (m * mockSecretsManager ) Start (_ context.Context ) error {
77+ return nil
78+ }
79+ func (m * mockSecretsManager ) RegisterUpdatePoliciesCallback (_ func (map [string ]bool )) {}
80+ func (m * mockSecretsManager ) SolvePolicySecrets (payload config.PolicyPayload ) (config.PolicyPayload , error ) {
81+ return payload , nil
82+ }
83+
84+ func (m * mockSecretsManager ) SolveConfigSecrets (backends map [string ]any , configManager config.ManagerConfig ) (map [string ]any , config.ManagerConfig , error ) {
85+ return backends , configManager , nil
86+ }
87+
88+ func TestStart_FleetConfig_OverridesExistingOTLPGrpcURL (t * testing.T ) {
89+ logger := slog .New (slog .NewTextHandler (os .Stderr , nil ))
90+ repo , err := policies .NewMemRepo ()
91+ require .NoError (t , err )
92+
93+ cfg := config.Config {
94+ OrbAgent : config.OrbAgent {
95+ Backends : map [string ]any {
96+ "common" : map [string ]any {
97+ "otlp" : map [string ]any {
98+ "grpc" : "original:4317" ,
99+ },
100+ },
101+ },
102+ ConfigManager : config.ManagerConfig {
103+ Active : "fleet" ,
104+ },
105+ SecretsManager : config.ManagerSecrets {
106+ Active : "" ,
107+ },
108+ },
109+ }
110+
111+ agent , err := New (logger , cfg )
112+ require .NoError (t , err )
113+
114+ orbAgent := agent .(* orbAgent )
115+ orbAgent .secretsManager = & mockSecretsManager {}
116+ orbAgent .policyManager = & mockPolicyManager {repo : repo }
117+
118+ ctx , cancel := context .WithCancel (context .Background ())
119+ defer cancel ()
120+
121+ // Start will fail when trying to start backends, but we can check the config before that
122+ err = orbAgent .Start (ctx , cancel )
123+ // We expect an error because there are no actual backends configured
124+ // But the important thing is that the config was modified
125+ require .Error (t , err )
126+
127+ // Verify the config was modified by checking backendsCommon which is set in startBackends
128+ // The OTLP configuration happens before startBackends, so backendsCommon should have the updated value
129+ assert .Equal (t , "grpc://localhost:4317" , orbAgent .backendsCommon .Otlp .Grpc )
130+ }
131+
132+ func TestStart_FleetConfig_CreatesOTLPSectionWhenMissing (t * testing.T ) {
133+ logger := slog .New (slog .NewTextHandler (os .Stderr , nil ))
134+ repo , err := policies .NewMemRepo ()
135+ require .NoError (t , err )
136+
137+ cfg := config.Config {
138+ OrbAgent : config.OrbAgent {
139+ Backends : map [string ]any {
140+ "common" : map [string ]any {
141+ "other" : "value" ,
142+ },
143+ },
144+ ConfigManager : config.ManagerConfig {
145+ Active : "fleet" ,
146+ },
147+ SecretsManager : config.ManagerSecrets {
148+ Active : "" ,
149+ },
150+ },
151+ }
152+
153+ agent , err := New (logger , cfg )
154+ require .NoError (t , err )
155+
156+ orbAgent := agent .(* orbAgent )
157+ orbAgent .secretsManager = & mockSecretsManager {}
158+ orbAgent .policyManager = & mockPolicyManager {repo : repo }
159+
160+ ctx , cancel := context .WithCancel (context .Background ())
161+ defer cancel ()
162+
163+ err = orbAgent .Start (ctx , cancel )
164+ require .Error (t , err ) // Expected to fail when starting backends
165+
166+ // Verify the config was modified by checking backendsCommon which is set in startBackends
167+ // The OTLP configuration happens before startBackends, so backendsCommon should have the updated value
168+ assert .Equal (t , "grpc://localhost:4317" , orbAgent .backendsCommon .Otlp .Grpc )
169+ }
170+
171+ func TestStart_FleetConfig_CreatesCommonBackendWhenMissing (t * testing.T ) {
172+ logger := slog .New (slog .NewTextHandler (os .Stderr , nil ))
173+ repo , err := policies .NewMemRepo ()
174+ require .NoError (t , err )
175+
176+ cfg := config.Config {
177+ OrbAgent : config.OrbAgent {
178+ Backends : map [string ]any {},
179+ ConfigManager : config.ManagerConfig {
180+ Active : "fleet" ,
181+ },
182+ SecretsManager : config.ManagerSecrets {
183+ Active : "" ,
184+ },
185+ },
186+ }
187+
188+ agent , err := New (logger , cfg )
189+ require .NoError (t , err )
190+
191+ orbAgent := agent .(* orbAgent )
192+ orbAgent .secretsManager = & mockSecretsManager {}
193+ orbAgent .policyManager = & mockPolicyManager {repo : repo }
194+
195+ ctx , cancel := context .WithCancel (context .Background ())
196+ defer cancel ()
197+
198+ err = orbAgent .Start (ctx , cancel )
199+ require .Error (t , err ) // Expected to fail when starting backends
200+
201+ // Verify the config was modified by checking backendsCommon which is set in startBackends
202+ // The OTLP configuration happens before startBackends, so backendsCommon should have the updated value
203+ assert .Equal (t , "grpc://localhost:4317" , orbAgent .backendsCommon .Otlp .Grpc )
204+ }
205+
206+ func TestStart_NonFleetConfig_DoesNotModifyConfig (t * testing.T ) {
207+ logger := slog .New (slog .NewTextHandler (os .Stderr , nil ))
208+ repo , err := policies .NewMemRepo ()
209+ require .NoError (t , err )
210+
211+ originalGrpcURL := "original:4317"
212+ cfg := config.Config {
213+ OrbAgent : config.OrbAgent {
214+ Backends : map [string ]any {
215+ "common" : map [string ]any {
216+ "otlp" : map [string ]any {
217+ "grpc" : originalGrpcURL ,
218+ },
219+ },
220+ },
221+ ConfigManager : config.ManagerConfig {
222+ Active : "local" , // Not fleet
223+ },
224+ SecretsManager : config.ManagerSecrets {
225+ Active : "" ,
226+ },
227+ },
228+ }
229+
230+ agent , err := New (logger , cfg )
231+ require .NoError (t , err )
232+
233+ orbAgent := agent .(* orbAgent )
234+ orbAgent .secretsManager = & mockSecretsManager {}
235+ orbAgent .policyManager = & mockPolicyManager {repo : repo }
236+
237+ ctx , cancel := context .WithCancel (context .Background ())
238+ defer cancel ()
239+
240+ err = orbAgent .Start (ctx , cancel )
241+ require .Error (t , err ) // Expected to fail when starting backends
242+
243+ // Verify the config was NOT modified by checking backendsCommon which is set in startBackends
244+ // For non-fleet config, the original value should remain
245+ assert .Equal (t , originalGrpcURL , orbAgent .backendsCommon .Otlp .Grpc , "grpc URL should remain unchanged for non-fleet config" )
246+ }
0 commit comments