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  }