github.com/Axway/agent-sdk@v1.1.101/pkg/agent/agent_test.go (about) 1 package agent 2 3 import ( 4 "encoding/json" 5 "net/http" 6 "net/http/httptest" 7 "strings" 8 "testing" 9 10 "github.com/Axway/agent-sdk/pkg/apic" 11 "github.com/Axway/agent-sdk/pkg/apic/definitions" 12 13 "github.com/Axway/agent-sdk/pkg/util/log" 14 15 v1 "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/api/v1" 16 management "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/management/v1alpha1" 17 "github.com/Axway/agent-sdk/pkg/config" 18 "github.com/stretchr/testify/assert" 19 ) 20 21 func resetResources() { 22 agent.agentResourceManager = nil 23 if agent.cacheManager != nil { 24 agent.cacheManager.ApplyResourceReadLock() 25 defer agent.cacheManager.ReleaseResourceReadLock() 26 agent.cacheManager = nil 27 } 28 agent.isInitialized = false 29 agent.apicClient = nil 30 agent.agentFeaturesCfg = nil 31 } 32 33 func createCentralCfg(url, env string) *config.CentralConfiguration { 34 cfg := config.NewCentralConfig(config.DiscoveryAgent).(*config.CentralConfiguration) 35 cfg.URL = url 36 cfg.SingleURL = url 37 cfg.TenantID = "123456" 38 cfg.Environment = env 39 cfg.APICDeployment = "apic" 40 authCfg := cfg.Auth.(*config.AuthConfiguration) 41 authCfg.URL = url + "/auth" 42 authCfg.Realm = "Broker" 43 authCfg.ClientID = "serviceaccount_1111" 44 authCfg.PrivateKey = "../transaction/testdata/private_key.pem" 45 authCfg.PublicKey = "../transaction/testdata/public_key" 46 return cfg 47 } 48 49 func createOfflineCentralCfg(url, env string) *config.CentralConfiguration { 50 cfg := config.NewCentralConfig(config.TraceabilityAgent).(*config.CentralConfiguration) 51 cfg.EnvironmentID = "abc123" 52 cfg.UsageReporting.(*config.UsageReportingConfiguration).Offline = true 53 return cfg 54 } 55 56 func createDiscoveryAgentRes(id, name, dataplane, filter string) *v1.ResourceInstance { 57 res := &management.DiscoveryAgent{ 58 ResourceMeta: v1.ResourceMeta{ 59 Name: name, 60 Metadata: v1.Metadata{ 61 ID: id, 62 }, 63 }, 64 Spec: management.DiscoveryAgentSpec{ 65 DataplaneType: dataplane, 66 Config: management.DiscoveryAgentSpecConfig{ 67 Filter: filter, 68 }, 69 }, 70 } 71 instance, _ := res.AsInstance() 72 return instance 73 } 74 75 func createTraceabilityAgentRes(id, name, dataplane string, processHeaders bool) *v1.ResourceInstance { 76 res := &management.TraceabilityAgent{ 77 ResourceMeta: v1.ResourceMeta{ 78 Name: name, 79 Metadata: v1.Metadata{ 80 ID: id, 81 }, 82 }, 83 Spec: management.TraceabilityAgentSpec{ 84 DataplaneType: dataplane, 85 Config: management.TraceabilityAgentSpecConfig{ 86 ProcessHeaders: processHeaders, 87 }, 88 }, 89 } 90 instance, _ := res.AsInstance() 91 return instance 92 } 93 94 type TestConfig struct { 95 resourceChanged bool 96 } 97 98 func (a *TestConfig) ApplyResources(agentResource *v1.ResourceInstance) error { 99 a.resourceChanged = true 100 return nil 101 } 102 103 func TestAgentInitialize(t *testing.T) { 104 const ( 105 daName = "discovery" 106 taName = "traceability" 107 ) 108 109 teams := []definitions.PlatformTeam{ 110 { 111 ID: "123", 112 Name: "name", 113 Default: true, 114 }, 115 } 116 environmentRes := &management.Environment{ 117 ResourceMeta: v1.ResourceMeta{ 118 Metadata: v1.Metadata{ID: "123"}, 119 Name: "v7", 120 Title: "v7", 121 }, 122 } 123 discoveryAgentRes := createDiscoveryAgentRes("111", daName, "v7-dataplane", "") 124 traceabilityAgentRes := createTraceabilityAgentRes("111", taName, "v7-dataplane", false) 125 126 s := httptest.NewServer(http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) { 127 if strings.Contains(req.RequestURI, "/auth") { 128 token := "{\"access_token\":\"somevalue\",\"expires_in\": 12235677}" 129 resp.Write([]byte(token)) 130 return 131 } 132 133 if strings.Contains(req.RequestURI, "/apis/management/v1alpha1/environments/v7/discoveryagents/"+daName) { 134 buf, err := json.Marshal(discoveryAgentRes) 135 log.Error(err) 136 resp.Write(buf) 137 return 138 } 139 140 if strings.Contains(req.RequestURI, "/apis/management/v1alpha1/environments/v7/traceabilityagents/"+taName) { 141 buf, err := json.Marshal(traceabilityAgentRes) 142 log.Error(err) 143 resp.Write(buf) 144 return 145 } 146 147 if strings.Contains(req.RequestURI, "/apis/management/v1alpha1/environments/v7") { 148 buf, _ := json.Marshal(environmentRes) 149 resp.Write(buf) 150 return 151 } 152 153 if strings.Contains(req.RequestURI, "/api/v1/platformTeams") { 154 buf, _ := json.Marshal(teams) 155 resp.Write(buf) 156 return 157 } 158 })) 159 160 defer s.Close() 161 162 cfg := createOfflineCentralCfg(s.URL, "v7") 163 // Test with offline mode 164 resetResources() 165 err := Initialize(cfg) 166 assert.Nil(t, err) 167 da := GetAgentResource() 168 assert.Nil(t, da) 169 170 cfg = createCentralCfg(s.URL, "v7") 171 // Test with no agent name - config to be validate successfully as no calls made to get agent and dataplane resource 172 resetResources() 173 err = Initialize(cfg) 174 assert.Nil(t, err) 175 da = GetAgentResource() 176 assert.Nil(t, da) 177 178 cfg.AgentType = config.DiscoveryAgent 179 AgentResourceType = management.DiscoveryAgentResourceName 180 cfg.AgentName = daName 181 resetResources() 182 err = Initialize(cfg) 183 assert.Nil(t, err) 184 185 da = GetAgentResource() 186 assertResource(t, da, discoveryAgentRes) 187 188 cfg.AgentType = config.TraceabilityAgent 189 AgentResourceType = management.TraceabilityAgentResourceName 190 cfg.AgentName = taName 191 resetResources() 192 err = Initialize(cfg) 193 assert.Nil(t, err) 194 195 da = GetAgentResource() 196 assertResource(t, da, traceabilityAgentRes) 197 198 agentCfg := &TestConfig{ 199 resourceChanged: false, 200 } 201 202 ApplyResourceToConfig(agentCfg) 203 204 assert.True(t, agentCfg.resourceChanged) 205 206 // Test for resource change 207 traceabilityAgentRes = createTraceabilityAgentRes("111", taName, "v7-dataplane", true) 208 resetResources() 209 210 agentResChangeHandlerCall := 0 211 OnAgentResourceChange(func() { agentResChangeHandlerCall++ }) 212 213 err = Initialize(cfg) 214 assert.Nil(t, err) 215 216 da = GetAgentResource() 217 assertResource(t, da, traceabilityAgentRes) 218 assert.Equal(t, 0, agentResChangeHandlerCall) 219 } 220 221 func TestInitEnvironment(t *testing.T) { 222 teams := []definitions.PlatformTeam{ 223 { 224 ID: "123", 225 Name: "name", 226 Default: true, 227 }, 228 } 229 environmentRes := management.NewEnvironment("v7") 230 environmentRes.Title = "v7" 231 environmentRes.Metadata.ID = "123" 232 233 s := httptest.NewServer(http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) { 234 if strings.Contains(req.RequestURI, "/auth") { 235 token := "{\"access_token\":\"somevalue\",\"expires_in\": 12235677}" 236 resp.Write([]byte(token)) 237 return 238 } 239 240 if strings.Contains(req.RequestURI, "/apis/management/v1alpha1/environments/v7") { 241 if req.Method == "GET" { 242 buf, _ := json.Marshal(environmentRes) 243 resp.Write(buf) 244 } else if req.Method == "PUT" { 245 subRes := &management.Environment{} 246 json.NewDecoder(req.Body).Decode(subRes) 247 environmentRes.ResourceMeta.SubResources = subRes.ResourceMeta.SubResources 248 } 249 return 250 } 251 252 if strings.Contains(req.RequestURI, "/api/v1/platformTeams") { 253 buf, _ := json.Marshal(teams) 254 resp.Write(buf) 255 return 256 } 257 })) 258 259 defer s.Close() 260 261 cfg := createCentralCfg(s.URL, "v7") 262 cfg.AgentType = config.GenericService 263 agent.cfg = cfg 264 initializeTokenRequester(agent.cfg) 265 apiClient := apic.New(agent.cfg, agent.tokenRequester, agent.cacheManager) 266 // Test with no agent name - config to be validate successfully as no calls made to get agent and dataplane resource 267 268 defer resetResources() 269 err := initEnvResources(agent.cfg, apiClient) 270 assert.Nil(t, err) 271 272 cfg = createCentralCfg(s.URL, "v7") 273 cfg.AgentType = config.DiscoveryAgent 274 agent.cfg = cfg 275 err = initEnvResources(agent.cfg, apiClient) 276 assert.Nil(t, err) 277 278 cfg = createCentralCfg(s.URL, "v7") 279 cfg.AgentType = config.TraceabilityAgent 280 agent.cfg = cfg 281 err = initEnvResources(agent.cfg, apiClient) 282 assert.Nil(t, err) 283 } 284 285 func TestAgentConfigOverride(t *testing.T) { 286 const ( 287 daName = "discovery" 288 taName = "traceability" 289 ) 290 291 teams := []definitions.PlatformTeam{ 292 { 293 ID: "123", 294 Name: "name", 295 Default: true, 296 }, 297 } 298 environmentRes := &management.Environment{ 299 ResourceMeta: v1.ResourceMeta{ 300 Metadata: v1.Metadata{ID: "123"}, 301 Name: "v7", 302 Title: "v7", 303 }, 304 } 305 discoveryAgentRes := createDiscoveryAgentRes("111", daName, "v7-dataplane", "") 306 traceabilityAgentRes := createTraceabilityAgentRes("111", taName, "v7-dataplane", false) 307 308 s := httptest.NewServer(http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) { 309 if strings.Contains(req.RequestURI, "/auth") { 310 token := "{\"access_token\":\"somevalue\",\"expires_in\": 12235677}" 311 resp.Write([]byte(token)) 312 } 313 314 if strings.Contains(req.RequestURI, "/apis/management/v1alpha1/environments/v7/discoveryagents/"+daName) { 315 buf, _ := json.Marshal(discoveryAgentRes) 316 resp.Write(buf) 317 return 318 } 319 320 if strings.Contains(req.RequestURI, "/apis/management/v1alpha1/environments/v7/traceabilityagents/"+taName) { 321 buf, _ := json.Marshal(traceabilityAgentRes) 322 resp.Write(buf) 323 return 324 } 325 326 if strings.Contains(req.RequestURI, "/apis/management/v1alpha1/environments/v7") { 327 buf, _ := json.Marshal(environmentRes) 328 resp.Write(buf) 329 return 330 } 331 332 if strings.Contains(req.RequestURI, "/api/v1/platformTeams") { 333 buf, _ := json.Marshal(teams) 334 resp.Write(buf) 335 return 336 } 337 })) 338 339 defer s.Close() 340 341 cfg := createCentralCfg(s.URL, "v7") 342 343 AgentResourceType = management.DiscoveryAgentResourceName 344 cfg.AgentName = "discovery" 345 resetResources() 346 err := Initialize(cfg) 347 assert.Nil(t, err) 348 349 da := GetAgentResource() 350 assertResource(t, da, discoveryAgentRes) 351 352 } 353 354 func TestAgentAgentFeaturesOnByDefault(t *testing.T) { 355 cfg := createCentralCfg("http://test", "v7") 356 resetResources() 357 err := Initialize(cfg) 358 assert.NoError(t, err) 359 360 // Assert the agent features are on by default 361 assert.True(t, agent.agentFeaturesCfg.ConnectionToCentralEnabled()) 362 assert.True(t, agent.agentFeaturesCfg.ProcessSystemSignalsEnabled()) 363 assert.True(t, agent.agentFeaturesCfg.VersionCheckerEnabled()) 364 365 assert.NotNil(t, agent.apicClient) 366 } 367 368 func TestAgentAgentFeaturesDisabled(t *testing.T) { 369 // Create invalid Central config 370 cfg := config.NewCentralConfig(config.GenericService).(*config.CentralConfiguration) 371 resetResources() 372 agentFeatures := &config.AgentFeaturesConfiguration{ 373 ConnectToCentral: false, 374 ProcessSystemSignals: false, 375 VersionChecker: false, 376 } 377 err := InitializeWithAgentFeatures(cfg, agentFeatures) 378 assert.NoError(t, err) // This asserts central config is not being validated as ConnectToCentral is false 379 380 assert.False(t, agent.agentFeaturesCfg.ConnectionToCentralEnabled()) 381 assert.False(t, agent.agentFeaturesCfg.ProcessSystemSignalsEnabled()) 382 assert.False(t, agent.agentFeaturesCfg.VersionCheckerEnabled()) 383 384 // Assert no api client 385 assert.Nil(t, agent.apicClient) 386 } 387 388 func assertResource(t *testing.T, res, expectedRes *v1.ResourceInstance) { 389 assert.Equal(t, expectedRes.Group, res.Group) 390 assert.Equal(t, expectedRes.Kind, res.Kind) 391 assert.Equal(t, expectedRes.Name, res.Name) 392 assert.Equal(t, expectedRes.Metadata.ID, res.Metadata.ID) 393 assert.Equal(t, expectedRes.Spec, res.Spec) 394 }