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 }