github.com/sacloud/iaas-api-go@v1.12.0/test/local_router_op_test.go (about)

     1  // Copyright 2022-2023 The sacloud/iaas-api-go Authors
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package test
    16  
    17  import (
    18  	"testing"
    19  
    20  	"github.com/sacloud/iaas-api-go"
    21  	"github.com/sacloud/iaas-api-go/testutil"
    22  	"github.com/sacloud/iaas-api-go/types"
    23  )
    24  
    25  func TestLocalRouterOp_CRUD(t *testing.T) {
    26  	testutil.RunCRUD(t, &testutil.CRUDTestCase{
    27  		Parallel:           true,
    28  		SetupAPICallerFunc: singletonAPICaller,
    29  		Setup: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) error {
    30  			swOp := iaas.NewSwitchOp(caller)
    31  			sw, err := swOp.Create(ctx, testZone, &iaas.SwitchCreateRequest{
    32  				Name: testutil.ResourceName("switch-for-local-router"),
    33  			})
    34  			if err != nil {
    35  				return err
    36  			}
    37  
    38  			ctx.Values["localrouter/switch"] = sw.ID
    39  
    40  			updateLocalRouterParam.Switch.Code = sw.ID.String()
    41  			updateLocalRouterParam.Switch.ZoneID = testZone
    42  			updateLocalRouterExpected.Switch.Code = sw.ID.String()
    43  			updateLocalRouterExpected.Switch.ZoneID = testZone
    44  
    45  			updateLocalRouterSettingsParam.Switch.Code = sw.ID.String()
    46  			updateLocalRouterSettingsParam.Switch.ZoneID = testZone
    47  			updateLocalRouterSettingsExpected.Switch.Code = sw.ID.String()
    48  			updateLocalRouterSettingsExpected.Switch.ZoneID = testZone
    49  			return nil
    50  		},
    51  		Create: &testutil.CRUDTestFunc{
    52  			Func: testLocalRouterCreate,
    53  			CheckFunc: testutil.AssertEqualWithExpected(&testutil.CRUDTestExpect{
    54  				ExpectValue:  createLocalRouterExpected,
    55  				IgnoreFields: ignoreLocalRouterFields,
    56  			}),
    57  		},
    58  
    59  		Read: &testutil.CRUDTestFunc{
    60  			Func: testLocalRouterRead,
    61  			CheckFunc: testutil.AssertEqualWithExpected(&testutil.CRUDTestExpect{
    62  				ExpectValue:  createLocalRouterExpected,
    63  				IgnoreFields: ignoreLocalRouterFields,
    64  			}),
    65  		},
    66  
    67  		Updates: []*testutil.CRUDTestFunc{
    68  			{
    69  				Func: testLocalRouterUpdate,
    70  				CheckFunc: testutil.AssertEqualWithExpected(&testutil.CRUDTestExpect{
    71  					ExpectValue:  updateLocalRouterExpected,
    72  					IgnoreFields: ignoreLocalRouterFields,
    73  				}),
    74  			},
    75  			{
    76  				Func: testLocalRouterUpdateSettings,
    77  				CheckFunc: testutil.AssertEqualWithExpected(&testutil.CRUDTestExpect{
    78  					ExpectValue:  updateLocalRouterSettingsExpected,
    79  					IgnoreFields: ignoreLocalRouterFields,
    80  				}),
    81  			},
    82  		},
    83  
    84  		Delete: &testutil.CRUDTestDeleteFunc{
    85  			Func: testLocalRouterDelete,
    86  		},
    87  		Cleanup: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) error {
    88  			swOp := iaas.NewSwitchOp(caller)
    89  			switchID, ok := ctx.Values["localrouter/switch"]
    90  			if ok {
    91  				if err := swOp.Delete(ctx, testZone, switchID.(types.ID)); err != nil {
    92  					return err
    93  				}
    94  			}
    95  			return nil
    96  		},
    97  	})
    98  }
    99  
   100  var (
   101  	ignoreLocalRouterFields = []string{
   102  		"ID",
   103  		"Class",
   104  		"SettingsHash",
   105  		"CreatedAt",
   106  		"ModifiedAt",
   107  		"SecretKeys",
   108  	}
   109  	createLocalRouterParam = &iaas.LocalRouterCreateRequest{
   110  		Name:        testutil.ResourceName("container-registry"),
   111  		Description: "desc",
   112  		Tags:        []string{"tag1", "tag2"},
   113  	}
   114  	createLocalRouterExpected = &iaas.LocalRouter{
   115  		Name:         createLocalRouterParam.Name,
   116  		Description:  createLocalRouterParam.Description,
   117  		Tags:         createLocalRouterParam.Tags,
   118  		Availability: types.Availabilities.Available,
   119  	}
   120  	updateLocalRouterParam = &iaas.LocalRouterUpdateRequest{
   121  		Name:        testutil.ResourceName("container-registry-upd"),
   122  		Description: "desc-upd",
   123  		Tags:        []string{"tag1-upd", "tag2-upd"},
   124  		IconID:      testIconID,
   125  		Switch: &iaas.LocalRouterSwitch{
   126  			Category: "cloud",
   127  		},
   128  		Interface: &iaas.LocalRouterInterface{
   129  			VirtualIPAddress: "192.168.0.2",
   130  			IPAddress:        []string{"192.168.0.21", "192.168.0.22"},
   131  			NetworkMaskLen:   24,
   132  			VRID:             100,
   133  		},
   134  		StaticRoutes: []*iaas.LocalRouterStaticRoute{
   135  			{
   136  				Prefix:  "192.168.1.0/24",
   137  				NextHop: "192.168.0.201",
   138  			},
   139  			{
   140  				Prefix:  "192.168.2.0/24",
   141  				NextHop: "192.168.0.202",
   142  			},
   143  		},
   144  	}
   145  	updateLocalRouterExpected = &iaas.LocalRouter{
   146  		Name:         updateLocalRouterParam.Name,
   147  		Description:  updateLocalRouterParam.Description,
   148  		Tags:         updateLocalRouterParam.Tags,
   149  		Availability: types.Availabilities.Available,
   150  		IconID:       testIconID,
   151  		Switch:       updateLocalRouterParam.Switch,
   152  		Interface:    updateLocalRouterParam.Interface,
   153  		StaticRoutes: updateLocalRouterParam.StaticRoutes,
   154  	}
   155  
   156  	updateLocalRouterSettingsParam = &iaas.LocalRouterUpdateSettingsRequest{
   157  		Switch: &iaas.LocalRouterSwitch{
   158  			Category: "cloud",
   159  		},
   160  		Interface: &iaas.LocalRouterInterface{
   161  			VirtualIPAddress: "192.168.0.3",
   162  			IPAddress:        []string{"192.168.0.31", "192.168.0.32"},
   163  			NetworkMaskLen:   24,
   164  			VRID:             100,
   165  		},
   166  		StaticRoutes: []*iaas.LocalRouterStaticRoute{
   167  			{
   168  				Prefix:  "192.168.1.0/24",
   169  				NextHop: "192.168.0.231",
   170  			},
   171  			{
   172  				Prefix:  "192.168.2.0/24",
   173  				NextHop: "192.168.0.232",
   174  			},
   175  		},
   176  	}
   177  	updateLocalRouterSettingsExpected = &iaas.LocalRouter{
   178  		Name:         updateLocalRouterParam.Name,
   179  		Description:  updateLocalRouterParam.Description,
   180  		Tags:         updateLocalRouterParam.Tags,
   181  		Availability: types.Availabilities.Available,
   182  		IconID:       testIconID,
   183  		Switch:       updateLocalRouterSettingsParam.Switch,
   184  		Interface:    updateLocalRouterSettingsParam.Interface,
   185  		StaticRoutes: updateLocalRouterSettingsParam.StaticRoutes,
   186  	}
   187  )
   188  
   189  func testLocalRouterCreate(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   190  	client := iaas.NewLocalRouterOp(caller)
   191  	return client.Create(ctx, createLocalRouterParam)
   192  }
   193  
   194  func testLocalRouterRead(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   195  	client := iaas.NewLocalRouterOp(caller)
   196  	return client.Read(ctx, ctx.ID)
   197  }
   198  
   199  func testLocalRouterUpdate(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   200  	client := iaas.NewLocalRouterOp(caller)
   201  	return client.Update(ctx, ctx.ID, updateLocalRouterParam)
   202  }
   203  
   204  func testLocalRouterUpdateSettings(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   205  	client := iaas.NewLocalRouterOp(caller)
   206  	return client.UpdateSettings(ctx, ctx.ID, updateLocalRouterSettingsParam)
   207  }
   208  
   209  func testLocalRouterDelete(ctx *testutil.CRUDTestContext, caller iaas.APICaller) error {
   210  	client := iaas.NewLocalRouterOp(caller)
   211  	return client.Delete(ctx, ctx.ID)
   212  }
   213  
   214  func TestLocalRouter_peering(t *testing.T) {
   215  	var sw1ID, sw2ID types.ID
   216  	var peerLocalRouter1, peerLocalRouter2 *iaas.LocalRouter
   217  
   218  	testutil.RunCRUD(t, &testutil.CRUDTestCase{
   219  		Parallel:           true,
   220  		SetupAPICallerFunc: singletonAPICaller,
   221  		Setup: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) error {
   222  			swOp := iaas.NewSwitchOp(caller)
   223  			sw, err := swOp.Create(ctx, testZone, &iaas.SwitchCreateRequest{
   224  				Name: testutil.ResourceName("switch-for-local-router"),
   225  			})
   226  			if err != nil {
   227  				return err
   228  			}
   229  			sw1ID = sw.ID
   230  
   231  			sw2, err := swOp.Create(ctx, testZone, &iaas.SwitchCreateRequest{
   232  				Name: testutil.ResourceName("switch-for-local-router"),
   233  			})
   234  			if err != nil {
   235  				return err
   236  			}
   237  			sw2ID = sw2.ID
   238  
   239  			lr, err := iaas.NewLocalRouterOp(caller).Create(ctx, &iaas.LocalRouterCreateRequest{
   240  				Name: testutil.ResourceName("local-router"),
   241  			})
   242  			if err != nil {
   243  				return err
   244  			}
   245  			peerLocalRouter1 = lr
   246  			return nil
   247  		},
   248  		Create: &testutil.CRUDTestFunc{
   249  			Func: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   250  				lrOp := iaas.NewLocalRouterOp(caller)
   251  				lr, err := lrOp.Create(ctx, &iaas.LocalRouterCreateRequest{
   252  					Name: testutil.ResourceName("local-router"),
   253  				})
   254  				if err != nil {
   255  					return nil, err
   256  				}
   257  				peerLocalRouter2 = lr
   258  				return lr, nil
   259  			},
   260  		},
   261  
   262  		Read: &testutil.CRUDTestFunc{
   263  			Func: testLocalRouterRead,
   264  		},
   265  
   266  		Updates: []*testutil.CRUDTestFunc{
   267  			// connect to switches
   268  			{
   269  				Func: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   270  					lrOp := iaas.NewLocalRouterOp(caller)
   271  					lr1, err := lrOp.UpdateSettings(ctx, peerLocalRouter1.ID, &iaas.LocalRouterUpdateSettingsRequest{
   272  						Switch: &iaas.LocalRouterSwitch{
   273  							Code:     sw1ID.String(),
   274  							Category: "cloud",
   275  							ZoneID:   testZone,
   276  						},
   277  						Interface: &iaas.LocalRouterInterface{
   278  							VirtualIPAddress: "192.168.0.1",
   279  							IPAddress:        []string{"192.168.0.11", "192.168.0.12"},
   280  							NetworkMaskLen:   24,
   281  							VRID:             100,
   282  						},
   283  						SettingsHash: peerLocalRouter1.SettingsHash,
   284  					})
   285  					if err != nil {
   286  						return nil, err
   287  					}
   288  					peerLocalRouter1 = lr1
   289  
   290  					lr2, err := lrOp.UpdateSettings(ctx, peerLocalRouter2.ID, &iaas.LocalRouterUpdateSettingsRequest{
   291  						Switch: &iaas.LocalRouterSwitch{
   292  							Code:     sw2ID.String(),
   293  							Category: "cloud",
   294  							ZoneID:   testZone,
   295  						},
   296  						Interface: &iaas.LocalRouterInterface{
   297  							VirtualIPAddress: "192.168.1.1",
   298  							IPAddress:        []string{"192.168.1.11", "192.168.1.12"},
   299  							NetworkMaskLen:   24,
   300  							VRID:             100,
   301  						},
   302  						SettingsHash: peerLocalRouter2.SettingsHash,
   303  					})
   304  					if err != nil {
   305  						return nil, err
   306  					}
   307  					peerLocalRouter2 = lr2
   308  					return lr2, nil
   309  				},
   310  			},
   311  			// set peer
   312  			{
   313  				Func: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   314  					lrOp := iaas.NewLocalRouterOp(caller)
   315  					lr1, err := lrOp.UpdateSettings(ctx, peerLocalRouter1.ID, &iaas.LocalRouterUpdateSettingsRequest{
   316  						Switch:    peerLocalRouter1.Switch,
   317  						Interface: peerLocalRouter1.Interface,
   318  						Peers: []*iaas.LocalRouterPeer{
   319  							{
   320  								ID:          peerLocalRouter2.ID,
   321  								SecretKey:   peerLocalRouter2.SecretKeys[0],
   322  								Enabled:     true,
   323  								Description: "desc",
   324  							},
   325  						},
   326  						SettingsHash: peerLocalRouter1.SettingsHash,
   327  					})
   328  					if err != nil {
   329  						return nil, err
   330  					}
   331  					peerLocalRouter1 = lr1
   332  
   333  					lr2, err := lrOp.UpdateSettings(ctx, peerLocalRouter2.ID, &iaas.LocalRouterUpdateSettingsRequest{
   334  						Switch:    peerLocalRouter2.Switch,
   335  						Interface: peerLocalRouter2.Interface,
   336  						Peers: []*iaas.LocalRouterPeer{
   337  							{
   338  								ID:          peerLocalRouter1.ID,
   339  								SecretKey:   peerLocalRouter1.SecretKeys[0],
   340  								Enabled:     true,
   341  								Description: "desc",
   342  							},
   343  						},
   344  						SettingsHash: peerLocalRouter2.SettingsHash,
   345  					})
   346  					if err != nil {
   347  						return nil, err
   348  					}
   349  					peerLocalRouter2 = lr2
   350  					return lr2, nil
   351  				},
   352  				CheckFunc: func(t testutil.TestT, ctx *testutil.CRUDTestContext, _ interface{}) error {
   353  					return testutil.DoAsserts(
   354  						testutil.AssertNotNilFunc(t, peerLocalRouter1.Peers, "LocalRouter1.Peers"),
   355  						testutil.AssertNotNilFunc(t, peerLocalRouter2.Peers, "LocalRouter2.Peers"),
   356  						testutil.AssertEqualFunc(t, peerLocalRouter1.Peers[0].ID, peerLocalRouter2.ID, "LocalRouter2.Peers[0].ID"),
   357  						testutil.AssertEqualFunc(t, peerLocalRouter2.Peers[0].ID, peerLocalRouter1.ID, "LocalRouter2.Peers[0].ID"),
   358  					)
   359  				},
   360  			},
   361  			// clear peer
   362  			{
   363  				Func: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   364  					lrOp := iaas.NewLocalRouterOp(caller)
   365  					lr1, err := lrOp.UpdateSettings(ctx, peerLocalRouter1.ID, &iaas.LocalRouterUpdateSettingsRequest{
   366  						Switch:       peerLocalRouter1.Switch,
   367  						Interface:    peerLocalRouter1.Interface,
   368  						SettingsHash: peerLocalRouter1.SettingsHash,
   369  					})
   370  					if err != nil {
   371  						return nil, err
   372  					}
   373  					peerLocalRouter1 = lr1
   374  
   375  					lr2, err := lrOp.UpdateSettings(ctx, peerLocalRouter2.ID, &iaas.LocalRouterUpdateSettingsRequest{
   376  						Switch:       peerLocalRouter2.Switch,
   377  						Interface:    peerLocalRouter2.Interface,
   378  						SettingsHash: peerLocalRouter2.SettingsHash,
   379  					})
   380  					if err != nil {
   381  						return nil, err
   382  					}
   383  					peerLocalRouter2 = lr2
   384  					return lr2, nil
   385  				},
   386  				CheckFunc: func(t testutil.TestT, ctx *testutil.CRUDTestContext, _ interface{}) error {
   387  					return testutil.DoAsserts(
   388  						testutil.AssertNilFunc(t, peerLocalRouter1.Peers, "LocalRouter1.Peers"),
   389  						testutil.AssertNilFunc(t, peerLocalRouter2.Peers, "LocalRouter2.Peers"),
   390  					)
   391  				},
   392  			},
   393  			// disconnect from switches
   394  			{
   395  				Func: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) (interface{}, error) {
   396  					lrOp := iaas.NewLocalRouterOp(caller)
   397  					lr1, err := lrOp.UpdateSettings(ctx, peerLocalRouter1.ID, &iaas.LocalRouterUpdateSettingsRequest{
   398  						SettingsHash: peerLocalRouter1.SettingsHash,
   399  					})
   400  					if err != nil {
   401  						return nil, err
   402  					}
   403  					peerLocalRouter1 = lr1
   404  
   405  					lr2, err := lrOp.UpdateSettings(ctx, peerLocalRouter2.ID, &iaas.LocalRouterUpdateSettingsRequest{
   406  						SettingsHash: peerLocalRouter2.SettingsHash,
   407  					})
   408  					if err != nil {
   409  						return nil, err
   410  					}
   411  					peerLocalRouter2 = lr2
   412  					return lr2, nil
   413  				},
   414  				CheckFunc: func(t testutil.TestT, ctx *testutil.CRUDTestContext, _ interface{}) error {
   415  					return testutil.DoAsserts(
   416  						testutil.AssertNilFunc(t, peerLocalRouter1.Switch, "LocalRouter1.Switch"),
   417  						testutil.AssertNilFunc(t, peerLocalRouter2.Switch, "LocalRouter2.Switch"),
   418  					)
   419  				},
   420  			},
   421  		},
   422  
   423  		Delete: &testutil.CRUDTestDeleteFunc{
   424  			Func: func(ctx *testutil.CRUDTestContext, caller iaas.APICaller) error {
   425  				lrOp := iaas.NewLocalRouterOp(caller)
   426  				ids := []types.ID{peerLocalRouter1.ID, peerLocalRouter2.ID}
   427  				for _, id := range ids {
   428  					lrOp.Delete(ctx, id) //nolint
   429  				}
   430  
   431  				swOp := iaas.NewSwitchOp(caller)
   432  				ids = []types.ID{sw1ID, sw2ID}
   433  				for _, id := range ids {
   434  					swOp.Delete(ctx, testZone, id) //nolint
   435  				}
   436  				return nil
   437  			},
   438  		},
   439  	})
   440  }