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