mosn.io/mosn@v1.6.0/pkg/router/routers_manager_test.go (about) 1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 // "routersMap" in "routersMangerInstance" stored all routers with "RouterConfigureName" as the unique identifier 19 20 // when update, update wrapper's routes 21 22 // when use, proxy's get wrapper's routers 23 24 package router 25 26 import ( 27 "context" 28 "testing" 29 30 v2 "mosn.io/mosn/pkg/config/v2" 31 "mosn.io/mosn/pkg/types" 32 "mosn.io/pkg/variable" 33 ) 34 35 var routerConfig = `{ 36 "router_config_name":"test_router", 37 "virtual_hosts": [ 38 { 39 "name": "test_virtual_host1", 40 "domains":["*"], 41 "virtual_clusters":[ 42 { 43 "name":"vc", 44 "pattern":"test" 45 } 46 ], 47 "routers":[ 48 { 49 "match": { 50 "prefix":"/", 51 "runtime": { 52 "default_value":10, 53 "runtime_key":"test" 54 }, 55 "headers":[ 56 { 57 "name":"service", 58 "value":"test" 59 } 60 ] 61 }, 62 "route":{ 63 "cluster_name":"cluster", 64 "weighted_clusters": [ 65 { 66 "cluster": { 67 "name": "test", 68 "weight":100, 69 "metadata_match": { 70 "filter_metadata": { 71 "mosn.lb": { 72 "test":"test" 73 } 74 } 75 } 76 } 77 } 78 ], 79 "metadata_match": { 80 "filter_metadata": { 81 "mosn.lb": { 82 "test":"test" 83 } 84 } 85 }, 86 "timeout": "1s", 87 "retry_policy":{ 88 "retry_on": true, 89 "retry_timeout": "1m", 90 "num_retries":10 91 } 92 }, 93 "redirect":{ 94 "host_redirect": "test", 95 "response_code": 302 96 }, 97 "metadata":{ 98 "filter_metadata": { 99 "mosn.lb": { 100 "test":"test" 101 } 102 } 103 }, 104 "decorator":"test" 105 } 106 ] 107 } 108 ] 109 }` 110 111 var routerConfig2 = `{ 112 "router_config_name":"test_router", 113 "virtual_hosts": [ 114 { 115 "name": "test_virtual_host2", 116 "domains":["www.antfin.com"], 117 "virtual_clusters":[ 118 { 119 "name":"vc", 120 "pattern":"test" 121 } 122 ], 123 "routers":[ 124 { 125 "match": { 126 "prefix":"/", 127 "runtime": { 128 "default_value":10, 129 "runtime_key":"test" 130 }, 131 "headers":[ 132 { 133 "name":"service", 134 "value":"test" 135 } 136 ] 137 }, 138 "route":{ 139 "cluster_name":"cluster", 140 "weighted_clusters": [ 141 { 142 "cluster": { 143 "name": "test", 144 "weight":100, 145 "metadata_match": { 146 "filter_metadata": { 147 "mosn.lb": { 148 "test":"test" 149 } 150 } 151 } 152 } 153 } 154 ], 155 "metadata_match": { 156 "filter_metadata": { 157 "mosn.lb": { 158 "test":"test" 159 } 160 } 161 }, 162 "timeout": "1s", 163 "retry_policy":{ 164 "retry_on": true, 165 "retry_timeout": "1m", 166 "num_retries":10 167 } 168 }, 169 "redirect":{ 170 "host_redirect": "test", 171 "response_code": 302 172 }, 173 "metadata":{ 174 "filter_metadata": { 175 "mosn.lb": { 176 "test":"test" 177 } 178 } 179 }, 180 "decorator":"test" 181 } 182 ] 183 } 184 ] 185 }` 186 187 func Test_NewRouterManager(t *testing.T) { 188 routerManager := NewRouterManager() 189 if routerManager == nil || routerManager != GetRoutersMangerInstance() { 190 t.Errorf("new router manager error") 191 } 192 } 193 194 func Test_GetRoutersMangerInstance(t *testing.T) { 195 routerManager := NewRouterManager() 196 if routerManager == nil || routerManager != GetRoutersMangerInstance() { 197 t.Errorf("get router manager error") 198 } 199 } 200 201 func Test_routersManager_AddOrUpdateRouters(t *testing.T) { 202 routerManager := NewRouterManager() 203 bytes := []byte(routerConfig) 204 router := &v2.RouterConfiguration{} 205 206 if err := json.Unmarshal(bytes, router); err != nil { 207 t.Errorf(err.Error()) 208 } 209 210 routerConfigName := "test_router" 211 212 if _, ok := routersManagerInstance.routersWrapperMap.Load(routerConfigName); ok { 213 t.Errorf("test_router already exist") 214 } 215 216 if err := routerManager.AddOrUpdateRouters(router); err != nil { 217 t.Errorf(err.Error()) 218 } else { 219 if value, ok := routersManagerInstance.routersWrapperMap.Load(routerConfigName); !ok { 220 t.Errorf("AddOrUpdateRouters error, %s not found", routerConfigName) 221 } else { 222 if primaryRouters, ok := value.(*RoutersWrapper); ok { 223 routerMatcher := primaryRouters.routers.(*routersImpl) 224 if routerMatcher.defaultVirtualHostIndex == -1 { 225 t.Error("AddOrUpdateRouters error") 226 } else if routerMatcher.virtualHosts[routerMatcher.defaultVirtualHostIndex].Name() != "test_virtual_host1" { 227 t.Error("AddOrUpdateRouters error") 228 } 229 } 230 } 231 } 232 } 233 234 func Test_routersManager_GetRouterWrapperByName(t *testing.T) { 235 236 bytes1 := []byte(routerConfig) 237 router1 := &v2.RouterConfiguration{} 238 239 bytes2 := []byte(routerConfig2) 240 router2 := &v2.RouterConfiguration{} 241 242 routerConfigName := "test_router" 243 244 router0 := &v2.RouterConfiguration{ 245 RouterConfigurationConfig: v2.RouterConfigurationConfig{ 246 RouterConfigName: routerConfigName, 247 }, 248 } 249 250 if err := json.Unmarshal(bytes1, router1); err != nil { 251 t.Errorf(err.Error()) 252 } 253 254 if err := json.Unmarshal(bytes2, router2); err != nil { 255 t.Errorf(err.Error()) 256 } 257 258 routerManager := NewRouterManager() 259 routerManager.AddOrUpdateRouters(router0) 260 routeWrapper0 := routerManager.GetRouterWrapperByName(routerConfigName) 261 routers0 := routeWrapper0.GetRouters() 262 263 // add routers1 to "test_router" 264 routerManager.AddOrUpdateRouters(router1) 265 routerWrapper1 := routerManager.GetRouterWrapperByName(routerConfigName) 266 routers1 := routerWrapper1.GetRouters() 267 268 // update "test_router" with router2 269 routerManager.AddOrUpdateRouters(router2) 270 routerWrapper2 := routerManager.GetRouterWrapperByName(routerConfigName) 271 routers2 := routerWrapper2.GetRouters() 272 273 routers0_ := routeWrapper0.GetRouters() 274 routers1_ := routerWrapper1.GetRouters() 275 276 // expect routers has been updated 277 if routers0 == routers1 || routers1 == routers2 { 278 t.Error("expect routers has been updated but not") 279 } 280 281 // expect wrapper still the same 282 if routeWrapper0 != routerWrapper1 || routerWrapper1 != routerWrapper2 { 283 t.Error("expect wrapper still the same but not") 284 } 285 286 // expect router has been updated for origin wrapper 287 if routers0_ != routers2 || routers1_ != routers2 { 288 t.Error("expect wrapper still the same but not ") 289 } 290 } 291 292 func Test_routersManager_AddRouter(t *testing.T) { 293 routerManager := NewRouterManager() 294 routerCfg := &v2.RouterConfiguration{ 295 RouterConfigurationConfig: v2.RouterConfigurationConfig{ 296 RouterConfigName: "test_addrouter", 297 }, 298 VirtualHosts: []v2.VirtualHost{ 299 { 300 Name: "test_addrouter_vh", 301 Domains: []string{"www.test.com"}, 302 // no touters 303 }, 304 { 305 Name: "test_default", 306 Domains: []string{"*"}, 307 }, 308 }, 309 } 310 if err := routerManager.AddOrUpdateRouters(routerCfg); err != nil { 311 t.Fatal("init router config failed") 312 } 313 rw := routerManager.GetRouterWrapperByName("test_addrouter") 314 if rw == nil { 315 t.Fatal("can not find router wrapper") 316 } 317 // test add router 318 routeCfg := &v2.Router{ 319 RouterConfig: v2.RouterConfig{ 320 Match: v2.RouterMatch{ 321 Headers: []v2.HeaderMatcher{ 322 { 323 Name: "service", 324 Value: "test", 325 }, 326 }, 327 }, 328 }, 329 } 330 if err := routerManager.AddRoute("test_addrouter", "www.test.com", routeCfg); err != nil { 331 t.Fatal("add router failed", err) 332 } 333 ctx := variable.NewVariableContext(context.Background()) 334 routers := rw.GetRouters() 335 // the wrapper can get the new router 336 variable.SetString(ctx, types.VarHost, "www.test.com") 337 if r := routers.MatchRouteFromHeaderKV(ctx, nil, "service", "test"); r == nil { 338 t.Fatal("added route, but can not find it") 339 } 340 variable.SetString(ctx, types.VarHost, "www.test.net") 341 if r := routers.MatchRouteFromHeaderKV(ctx, nil, "service", "test"); r != nil { 342 t.Fatal("not added route, but still find it") 343 } 344 // test config is expected changed 345 cfg := rw.GetRoutersConfig() 346 if len(cfg.VirtualHosts[0].Routers) != 1 || len(cfg.VirtualHosts[1].Routers) != 0 { 347 t.Fatal("route config is not changed") 348 } 349 350 // test add into default 351 if err := routerManager.AddRoute("test_addrouter", "", routeCfg); err != nil { 352 t.Fatal("add router failed", err) 353 } 354 // config is changed 355 cfgChanged := rw.GetRoutersConfig() 356 if len(cfgChanged.VirtualHosts[0].Routers) != 1 || len(cfgChanged.VirtualHosts[1].Routers) != 1 { 357 t.Fatal("default route config is not changed") 358 } 359 if len(cfgChanged.VirtualHosts[0].Routers[0].Match.Headers) != 1 { 360 t.Fatal("virtual host config routers is not expected") 361 } 362 routersChanged := rw.GetRouters() 363 // the wrapper can get the new router 364 if r := routersChanged.MatchRouteFromHeaderKV(ctx, nil, "service", "test"); r == nil { 365 t.Fatal("added route, but can not find it") 366 } 367 } 368 369 func Test_routersManager_RemoveAllRouter(t *testing.T) { 370 ctx := variable.NewVariableContext(context.Background()) 371 routerManager := NewRouterManager() 372 routerCfg := &v2.RouterConfiguration{ 373 RouterConfigurationConfig: v2.RouterConfigurationConfig{ 374 RouterConfigName: "test_remove_all_router", 375 }, 376 VirtualHosts: []v2.VirtualHost{ 377 { 378 Name: "test_addrouter_vh", 379 Domains: []string{"www.test.com"}, 380 Routers: []v2.Router{ 381 { 382 RouterConfig: v2.RouterConfig{ 383 Match: v2.RouterMatch{ 384 Headers: []v2.HeaderMatcher{ 385 { 386 Name: "service", 387 Value: "test", 388 }, 389 }, 390 }, 391 }, 392 }, 393 }, 394 }, 395 { 396 Name: "test_default", 397 Domains: []string{"*"}, 398 Routers: []v2.Router{ 399 { 400 RouterConfig: v2.RouterConfig{ 401 Match: v2.RouterMatch{ 402 Headers: []v2.HeaderMatcher{ 403 { 404 Name: "service", 405 Value: "test", 406 }, 407 }, 408 }, 409 }, 410 }, 411 }, 412 }, 413 }, 414 } 415 // init 416 if err := routerManager.AddOrUpdateRouters(routerCfg); err != nil { 417 t.Fatal("init router config failed") 418 } 419 rw := routerManager.GetRouterWrapperByName("test_remove_all_router") 420 if rw == nil { 421 t.Fatal("can not find router wrapper") 422 } 423 // remove 424 if err := routerManager.RemoveAllRoutes("test_remove_all_router", "www.test.com"); err != nil { 425 t.Fatal("remove all router failed", err) 426 } 427 routers := rw.GetRouters() 428 variable.SetString(ctx, types.VarHost, "www.test.com") 429 if r := routers.MatchRouteFromHeaderKV(ctx, nil, "service", "test"); r != nil { 430 t.Fatal("remove route, but still can matched") 431 } 432 ctx2 := variable.NewVariableContext(context.Background()) 433 variable.SetString(ctx2, types.VarHost, "www.test.net") 434 if r := routers.MatchRouteFromHeaderKV(ctx2, nil, "service", "test"); r == nil { 435 t.Fatal("route removed unexpected") 436 } 437 // test config is expected changed 438 cfg := rw.GetRoutersConfig() 439 if len(cfg.VirtualHosts[0].Routers) != 0 || len(cfg.VirtualHosts[1].Routers) != 1 { 440 t.Fatal("route config is not changed") 441 } 442 443 // test remove default 444 if err := routerManager.RemoveAllRoutes("test_remove_all_router", ""); err != nil { 445 t.Fatal("remove router failed", err) 446 } 447 // config is changed 448 cfgChanged := rw.GetRoutersConfig() 449 if len(cfgChanged.VirtualHosts[0].Routers) != 0 || len(cfgChanged.VirtualHosts[1].Routers) != 0 { 450 t.Fatal("default route config is not changed") 451 } 452 routersChanged := rw.GetRouters() 453 // the wrapper can get the new router 454 if r := routersChanged.MatchRouteFromHeaderKV(ctx2, nil, "service", "test"); r != nil { 455 t.Fatal("remove route, but still can matched") 456 } 457 }