github.com/gophercloud/gophercloud@v1.11.0/internal/acceptance/openstack/loadbalancer/v2/loadbalancers_test.go (about) 1 //go:build acceptance || networking || loadbalancer || loadbalancers 2 // +build acceptance networking loadbalancer loadbalancers 3 4 package v2 5 6 import ( 7 "testing" 8 9 "github.com/gophercloud/gophercloud/internal/acceptance/clients" 10 networking "github.com/gophercloud/gophercloud/internal/acceptance/openstack/networking/v2" 11 "github.com/gophercloud/gophercloud/internal/acceptance/openstack/networking/v2/extensions/qos/policies" 12 "github.com/gophercloud/gophercloud/internal/acceptance/tools" 13 "github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/l7policies" 14 "github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/listeners" 15 "github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers" 16 "github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors" 17 "github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools" 18 th "github.com/gophercloud/gophercloud/testhelper" 19 ) 20 21 func TestLoadbalancersList(t *testing.T) { 22 client, err := clients.NewLoadBalancerV2Client() 23 th.AssertNoErr(t, err) 24 25 allPages, err := loadbalancers.List(client, nil).AllPages() 26 th.AssertNoErr(t, err) 27 28 allLoadbalancers, err := loadbalancers.ExtractLoadBalancers(allPages) 29 th.AssertNoErr(t, err) 30 31 for _, lb := range allLoadbalancers { 32 tools.PrintResource(t, lb) 33 } 34 } 35 36 func TestLoadbalancersListByTags(t *testing.T) { 37 netClient, err := clients.NewNetworkV2Client() 38 th.AssertNoErr(t, err) 39 40 lbClient, err := clients.NewLoadBalancerV2Client() 41 th.AssertNoErr(t, err) 42 43 network, err := networking.CreateNetwork(t, netClient) 44 th.AssertNoErr(t, err) 45 defer networking.DeleteNetwork(t, netClient, network.ID) 46 47 subnet, err := networking.CreateSubnet(t, netClient, network.ID) 48 th.AssertNoErr(t, err) 49 defer networking.DeleteSubnet(t, netClient, subnet.ID) 50 51 // Add "test" tag intentionally to test the "not-tags" parameter. Because "test" tag is also used in other test 52 // cases, we use "test" tag to exclude load balancers created by other test case. 53 tags := []string{"tag1", "tag2", "test"} 54 lb, err := CreateLoadBalancer(t, lbClient, subnet.ID, tags, "") 55 th.AssertNoErr(t, err) 56 defer DeleteLoadBalancer(t, lbClient, lb.ID) 57 58 tags = []string{"tag1"} 59 listOpts := loadbalancers.ListOpts{ 60 Tags: tags, 61 } 62 allPages, err := loadbalancers.List(lbClient, listOpts).AllPages() 63 th.AssertNoErr(t, err) 64 allLoadbalancers, err := loadbalancers.ExtractLoadBalancers(allPages) 65 th.AssertNoErr(t, err) 66 th.AssertEquals(t, 1, len(allLoadbalancers)) 67 68 tags = []string{"test"} 69 listOpts = loadbalancers.ListOpts{ 70 TagsNot: tags, 71 } 72 allPages, err = loadbalancers.List(lbClient, listOpts).AllPages() 73 th.AssertNoErr(t, err) 74 allLoadbalancers, err = loadbalancers.ExtractLoadBalancers(allPages) 75 th.AssertNoErr(t, err) 76 th.AssertEquals(t, 0, len(allLoadbalancers)) 77 78 tags = []string{"tag1", "tag3"} 79 listOpts = loadbalancers.ListOpts{ 80 TagsAny: tags, 81 } 82 allPages, err = loadbalancers.List(lbClient, listOpts).AllPages() 83 th.AssertNoErr(t, err) 84 allLoadbalancers, err = loadbalancers.ExtractLoadBalancers(allPages) 85 th.AssertNoErr(t, err) 86 th.AssertEquals(t, 1, len(allLoadbalancers)) 87 88 tags = []string{"tag1", "test"} 89 listOpts = loadbalancers.ListOpts{ 90 TagsNotAny: tags, 91 } 92 allPages, err = loadbalancers.List(lbClient, listOpts).AllPages() 93 th.AssertNoErr(t, err) 94 allLoadbalancers, err = loadbalancers.ExtractLoadBalancers(allPages) 95 th.AssertNoErr(t, err) 96 th.AssertEquals(t, 0, len(allLoadbalancers)) 97 } 98 99 func TestLoadbalancerHTTPCRUD(t *testing.T) { 100 netClient, err := clients.NewNetworkV2Client() 101 th.AssertNoErr(t, err) 102 103 lbClient, err := clients.NewLoadBalancerV2Client() 104 th.AssertNoErr(t, err) 105 106 network, err := networking.CreateNetwork(t, netClient) 107 th.AssertNoErr(t, err) 108 defer networking.DeleteNetwork(t, netClient, network.ID) 109 110 subnet, err := networking.CreateSubnet(t, netClient, network.ID) 111 th.AssertNoErr(t, err) 112 defer networking.DeleteSubnet(t, netClient, subnet.ID) 113 114 lb, err := CreateLoadBalancer(t, lbClient, subnet.ID, nil, "") 115 th.AssertNoErr(t, err) 116 defer DeleteLoadBalancer(t, lbClient, lb.ID) 117 118 // Listener 119 listener, err := CreateListenerHTTP(t, lbClient, lb) 120 th.AssertNoErr(t, err) 121 defer DeleteListener(t, lbClient, lb.ID, listener.ID) 122 123 // L7 policy 124 policy, err := CreateL7Policy(t, lbClient, listener, lb) 125 th.AssertNoErr(t, err) 126 defer DeleteL7Policy(t, lbClient, lb.ID, policy.ID) 127 128 newDescription := "" 129 updateL7policyOpts := l7policies.UpdateOpts{ 130 Description: &newDescription, 131 } 132 _, err = l7policies.Update(lbClient, policy.ID, updateL7policyOpts).Extract() 133 th.AssertNoErr(t, err) 134 135 if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil { 136 t.Fatalf("Timed out waiting for loadbalancer to become active") 137 } 138 139 newPolicy, err := l7policies.Get(lbClient, policy.ID).Extract() 140 th.AssertNoErr(t, err) 141 142 tools.PrintResource(t, newPolicy) 143 144 th.AssertEquals(t, newPolicy.Description, newDescription) 145 146 // L7 rule 147 rule, err := CreateL7Rule(t, lbClient, newPolicy.ID, lb) 148 th.AssertNoErr(t, err) 149 defer DeleteL7Rule(t, lbClient, lb.ID, policy.ID, rule.ID) 150 151 allPages, err := l7policies.ListRules(lbClient, policy.ID, l7policies.ListRulesOpts{}).AllPages() 152 th.AssertNoErr(t, err) 153 allRules, err := l7policies.ExtractRules(allPages) 154 th.AssertNoErr(t, err) 155 for _, rule := range allRules { 156 tools.PrintResource(t, rule) 157 } 158 159 updateL7ruleOpts := l7policies.UpdateRuleOpts{ 160 RuleType: l7policies.TypePath, 161 CompareType: l7policies.CompareTypeRegex, 162 Value: "/images/special*", 163 } 164 _, err = l7policies.UpdateRule(lbClient, policy.ID, rule.ID, updateL7ruleOpts).Extract() 165 th.AssertNoErr(t, err) 166 167 if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil { 168 t.Fatalf("Timed out waiting for loadbalancer to become active") 169 } 170 171 newRule, err := l7policies.GetRule(lbClient, newPolicy.ID, rule.ID).Extract() 172 th.AssertNoErr(t, err) 173 174 tools.PrintResource(t, newRule) 175 176 // Pool 177 pool, err := CreatePoolHTTP(t, lbClient, lb) 178 th.AssertNoErr(t, err) 179 defer DeletePool(t, lbClient, lb.ID, pool.ID) 180 181 poolName := "" 182 poolDescription := "" 183 updatePoolOpts := pools.UpdateOpts{ 184 Name: &poolName, 185 Description: &poolDescription, 186 } 187 _, err = pools.Update(lbClient, pool.ID, updatePoolOpts).Extract() 188 th.AssertNoErr(t, err) 189 190 if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil { 191 t.Fatalf("Timed out waiting for loadbalancer to become active") 192 } 193 194 newPool, err := pools.Get(lbClient, pool.ID).Extract() 195 th.AssertNoErr(t, err) 196 197 tools.PrintResource(t, newPool) 198 th.AssertEquals(t, newPool.Name, poolName) 199 th.AssertEquals(t, newPool.Description, poolDescription) 200 201 // Update L7policy to redirect to pool 202 newRedirectURL := "" 203 updateL7policyOpts = l7policies.UpdateOpts{ 204 Action: l7policies.ActionRedirectToPool, 205 RedirectPoolID: &newPool.ID, 206 RedirectURL: &newRedirectURL, 207 } 208 _, err = l7policies.Update(lbClient, policy.ID, updateL7policyOpts).Extract() 209 th.AssertNoErr(t, err) 210 211 if err := WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil { 212 t.Fatalf("Timed out waiting for loadbalancer to become active") 213 } 214 215 newPolicy, err = l7policies.Get(lbClient, policy.ID).Extract() 216 th.AssertNoErr(t, err) 217 218 tools.PrintResource(t, newPolicy) 219 220 th.AssertEquals(t, newPolicy.Description, newDescription) 221 th.AssertEquals(t, newPolicy.Action, string(l7policies.ActionRedirectToPool)) 222 th.AssertEquals(t, newPolicy.RedirectPoolID, newPool.ID) 223 th.AssertEquals(t, newPolicy.RedirectURL, newRedirectURL) 224 225 // Workaround for proper delete order 226 defer DeleteL7Policy(t, lbClient, lb.ID, policy.ID) 227 defer DeleteL7Rule(t, lbClient, lb.ID, policy.ID, rule.ID) 228 229 // Member 230 member, err := CreateMember(t, lbClient, lb, pool, subnet.ID, subnet.CIDR) 231 th.AssertNoErr(t, err) 232 defer DeleteMember(t, lbClient, lb.ID, pool.ID, member.ID) 233 234 monitor, err := CreateMonitor(t, lbClient, lb, pool) 235 th.AssertNoErr(t, err) 236 defer DeleteMonitor(t, lbClient, lb.ID, monitor.ID) 237 } 238 239 func TestLoadbalancersCRUD(t *testing.T) { 240 netClient, err := clients.NewNetworkV2Client() 241 th.AssertNoErr(t, err) 242 243 // Create QoS policy first as the loadbalancer and its port 244 //needs to be deleted before the QoS policy can be deleted 245 policy2, err := policies.CreateQoSPolicy(t, netClient) 246 th.AssertNoErr(t, err) 247 defer policies.DeleteQoSPolicy(t, netClient, policy2.ID) 248 249 lbClient, err := clients.NewLoadBalancerV2Client() 250 th.AssertNoErr(t, err) 251 252 network, err := networking.CreateNetwork(t, netClient) 253 th.AssertNoErr(t, err) 254 defer networking.DeleteNetwork(t, netClient, network.ID) 255 256 subnet, err := networking.CreateSubnet(t, netClient, network.ID) 257 th.AssertNoErr(t, err) 258 defer networking.DeleteSubnet(t, netClient, subnet.ID) 259 260 policy1, err := policies.CreateQoSPolicy(t, netClient) 261 th.AssertNoErr(t, err) 262 defer policies.DeleteQoSPolicy(t, netClient, policy1.ID) 263 264 tags := []string{"test"} 265 lb, err := CreateLoadBalancer(t, lbClient, subnet.ID, tags, policy1.ID) 266 th.AssertNoErr(t, err) 267 th.AssertEquals(t, lb.VipQosPolicyID, policy1.ID) 268 defer DeleteLoadBalancer(t, lbClient, lb.ID) 269 270 lbDescription := "" 271 updateLoadBalancerOpts := loadbalancers.UpdateOpts{ 272 Description: &lbDescription, 273 VipQosPolicyID: &policy2.ID, 274 } 275 _, err = loadbalancers.Update(lbClient, lb.ID, updateLoadBalancerOpts).Extract() 276 th.AssertNoErr(t, err) 277 278 if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil { 279 t.Fatalf("Timed out waiting for loadbalancer to become active") 280 } 281 282 newLB, err := loadbalancers.Get(lbClient, lb.ID).Extract() 283 th.AssertNoErr(t, err) 284 285 tools.PrintResource(t, newLB) 286 287 th.AssertEquals(t, newLB.Description, lbDescription) 288 th.AssertEquals(t, newLB.VipQosPolicyID, policy2.ID) 289 290 lbStats, err := loadbalancers.GetStats(lbClient, lb.ID).Extract() 291 th.AssertNoErr(t, err) 292 293 tools.PrintResource(t, lbStats) 294 295 // Because of the time it takes to create a loadbalancer, 296 // this test will include some other resources. 297 298 // Listener 299 listener, err := CreateListener(t, lbClient, lb) 300 th.AssertNoErr(t, err) 301 defer DeleteListener(t, lbClient, lb.ID, listener.ID) 302 303 listenerName := "" 304 listenerDescription := "" 305 updateListenerOpts := listeners.UpdateOpts{ 306 Name: &listenerName, 307 Description: &listenerDescription, 308 } 309 _, err = listeners.Update(lbClient, listener.ID, updateListenerOpts).Extract() 310 th.AssertNoErr(t, err) 311 312 if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil { 313 t.Fatalf("Timed out waiting for loadbalancer to become active") 314 } 315 316 newListener, err := listeners.Get(lbClient, listener.ID).Extract() 317 th.AssertNoErr(t, err) 318 319 tools.PrintResource(t, newListener) 320 321 th.AssertEquals(t, newListener.Name, listenerName) 322 th.AssertEquals(t, newListener.Description, listenerDescription) 323 324 listenerStats, err := listeners.GetStats(lbClient, listener.ID).Extract() 325 th.AssertNoErr(t, err) 326 327 tools.PrintResource(t, listenerStats) 328 329 // Pool 330 pool, err := CreatePool(t, lbClient, lb) 331 th.AssertNoErr(t, err) 332 defer DeletePool(t, lbClient, lb.ID, pool.ID) 333 334 // Update listener's default pool ID. 335 updateListenerOpts = listeners.UpdateOpts{ 336 DefaultPoolID: &pool.ID, 337 } 338 _, err = listeners.Update(lbClient, listener.ID, updateListenerOpts).Extract() 339 th.AssertNoErr(t, err) 340 341 if err := WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil { 342 t.Fatalf("Timed out waiting for loadbalancer to become active") 343 } 344 345 newListener, err = listeners.Get(lbClient, listener.ID).Extract() 346 th.AssertNoErr(t, err) 347 348 tools.PrintResource(t, newListener) 349 350 th.AssertEquals(t, newListener.DefaultPoolID, pool.ID) 351 352 // Remove listener's default pool ID 353 emptyPoolID := "" 354 updateListenerOpts = listeners.UpdateOpts{ 355 DefaultPoolID: &emptyPoolID, 356 } 357 _, err = listeners.Update(lbClient, listener.ID, updateListenerOpts).Extract() 358 th.AssertNoErr(t, err) 359 360 if err := WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil { 361 t.Fatalf("Timed out waiting for loadbalancer to become active") 362 } 363 364 newListener, err = listeners.Get(lbClient, listener.ID).Extract() 365 th.AssertNoErr(t, err) 366 367 tools.PrintResource(t, newListener) 368 369 th.AssertEquals(t, newListener.DefaultPoolID, "") 370 371 // Member 372 member, err := CreateMember(t, lbClient, lb, pool, subnet.ID, subnet.CIDR) 373 th.AssertNoErr(t, err) 374 defer DeleteMember(t, lbClient, lb.ID, pool.ID, member.ID) 375 376 memberName := "" 377 newWeight := tools.RandomInt(11, 100) 378 updateMemberOpts := pools.UpdateMemberOpts{ 379 Name: &memberName, 380 Weight: &newWeight, 381 } 382 _, err = pools.UpdateMember(lbClient, pool.ID, member.ID, updateMemberOpts).Extract() 383 th.AssertNoErr(t, err) 384 385 if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil { 386 t.Fatalf("Timed out waiting for loadbalancer to become active") 387 } 388 389 newMember, err := pools.GetMember(lbClient, pool.ID, member.ID).Extract() 390 th.AssertNoErr(t, err) 391 392 tools.PrintResource(t, newMember) 393 th.AssertEquals(t, newMember.Name, memberName) 394 395 newWeight = tools.RandomInt(11, 100) 396 memberOpts := pools.BatchUpdateMemberOpts{ 397 Address: member.Address, 398 ProtocolPort: member.ProtocolPort, 399 Weight: &newWeight, 400 } 401 batchMembers := []pools.BatchUpdateMemberOpts{memberOpts} 402 if err = pools.BatchUpdateMembers(lbClient, pool.ID, batchMembers).ExtractErr(); err != nil { 403 t.Fatalf("Unable to batch update members") 404 } 405 406 if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil { 407 t.Fatalf("Timed out waiting for loadbalancer to become active") 408 } 409 410 newMember, err = pools.GetMember(lbClient, pool.ID, member.ID).Extract() 411 th.AssertNoErr(t, err) 412 413 tools.PrintResource(t, newMember) 414 415 pool, err = pools.Get(lbClient, pool.ID).Extract() 416 th.AssertNoErr(t, err) 417 418 tools.PrintResource(t, pool) 419 420 // Monitor 421 monitor, err := CreateMonitor(t, lbClient, lb, pool) 422 th.AssertNoErr(t, err) 423 defer DeleteMonitor(t, lbClient, lb.ID, monitor.ID) 424 425 monName := "" 426 newDelay := tools.RandomInt(20, 30) 427 newMaxRetriesDown := tools.RandomInt(4, 10) 428 updateMonitorOpts := monitors.UpdateOpts{ 429 Name: &monName, 430 Delay: newDelay, 431 MaxRetriesDown: newMaxRetriesDown, 432 } 433 _, err = monitors.Update(lbClient, monitor.ID, updateMonitorOpts).Extract() 434 th.AssertNoErr(t, err) 435 436 if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil { 437 t.Fatalf("Timed out waiting for loadbalancer to become active") 438 } 439 440 newMonitor, err := monitors.Get(lbClient, monitor.ID).Extract() 441 th.AssertNoErr(t, err) 442 443 tools.PrintResource(t, newMonitor) 444 445 th.AssertEquals(t, newMonitor.Name, monName) 446 th.AssertEquals(t, newMonitor.Delay, newDelay) 447 th.AssertEquals(t, newMonitor.MaxRetriesDown, newMaxRetriesDown) 448 } 449 450 func TestLoadbalancersCascadeCRUD(t *testing.T) { 451 netClient, err := clients.NewNetworkV2Client() 452 th.AssertNoErr(t, err) 453 454 lbClient, err := clients.NewLoadBalancerV2Client() 455 th.AssertNoErr(t, err) 456 457 network, err := networking.CreateNetwork(t, netClient) 458 th.AssertNoErr(t, err) 459 defer networking.DeleteNetwork(t, netClient, network.ID) 460 461 subnet, err := networking.CreateSubnet(t, netClient, network.ID) 462 th.AssertNoErr(t, err) 463 defer networking.DeleteSubnet(t, netClient, subnet.ID) 464 465 tags := []string{"test"} 466 lb, err := CreateLoadBalancer(t, lbClient, subnet.ID, tags, "") 467 th.AssertNoErr(t, err) 468 defer CascadeDeleteLoadBalancer(t, lbClient, lb.ID) 469 470 newLB, err := loadbalancers.Get(lbClient, lb.ID).Extract() 471 th.AssertNoErr(t, err) 472 473 tools.PrintResource(t, newLB) 474 475 // Because of the time it takes to create a loadbalancer, 476 // this test will include some other resources. 477 478 // Listener 479 listener, err := CreateListener(t, lbClient, lb) 480 th.AssertNoErr(t, err) 481 482 listenerDescription := "Some listener description" 483 updateListenerOpts := listeners.UpdateOpts{ 484 Description: &listenerDescription, 485 } 486 _, err = listeners.Update(lbClient, listener.ID, updateListenerOpts).Extract() 487 th.AssertNoErr(t, err) 488 489 if err := WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil { 490 t.Fatalf("Timed out waiting for loadbalancer to become active") 491 } 492 493 newListener, err := listeners.Get(lbClient, listener.ID).Extract() 494 th.AssertNoErr(t, err) 495 496 tools.PrintResource(t, newListener) 497 498 // Pool 499 pool, err := CreatePool(t, lbClient, lb) 500 th.AssertNoErr(t, err) 501 502 poolDescription := "Some pool description" 503 updatePoolOpts := pools.UpdateOpts{ 504 Description: &poolDescription, 505 } 506 _, err = pools.Update(lbClient, pool.ID, updatePoolOpts).Extract() 507 th.AssertNoErr(t, err) 508 509 if err := WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil { 510 t.Fatalf("Timed out waiting for loadbalancer to become active") 511 } 512 513 newPool, err := pools.Get(lbClient, pool.ID).Extract() 514 th.AssertNoErr(t, err) 515 516 tools.PrintResource(t, newPool) 517 518 // Member 519 member, err := CreateMember(t, lbClient, lb, newPool, subnet.ID, subnet.CIDR) 520 th.AssertNoErr(t, err) 521 522 newWeight := tools.RandomInt(11, 100) 523 updateMemberOpts := pools.UpdateMemberOpts{ 524 Weight: &newWeight, 525 } 526 _, err = pools.UpdateMember(lbClient, pool.ID, member.ID, updateMemberOpts).Extract() 527 th.AssertNoErr(t, err) 528 529 if err := WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil { 530 t.Fatalf("Timed out waiting for loadbalancer to become active") 531 } 532 533 newMember, err := pools.GetMember(lbClient, pool.ID, member.ID).Extract() 534 th.AssertNoErr(t, err) 535 536 tools.PrintResource(t, newMember) 537 538 // Monitor 539 monitor, err := CreateMonitor(t, lbClient, lb, newPool) 540 th.AssertNoErr(t, err) 541 542 newDelay := tools.RandomInt(20, 30) 543 newMaxRetriesDown := tools.RandomInt(4, 10) 544 updateMonitorOpts := monitors.UpdateOpts{ 545 Delay: newDelay, 546 MaxRetriesDown: newMaxRetriesDown, 547 } 548 _, err = monitors.Update(lbClient, monitor.ID, updateMonitorOpts).Extract() 549 th.AssertNoErr(t, err) 550 551 if err := WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil { 552 t.Fatalf("Timed out waiting for loadbalancer to become active") 553 } 554 555 newMonitor, err := monitors.Get(lbClient, monitor.ID).Extract() 556 th.AssertNoErr(t, err) 557 558 tools.PrintResource(t, newMonitor) 559 560 th.AssertEquals(t, newMonitor.Delay, newDelay) 561 th.AssertEquals(t, newMonitor.MaxRetriesDown, newMaxRetriesDown) 562 } 563 564 func TestLoadbalancersFullyPopulatedCRUD(t *testing.T) { 565 netClient, err := clients.NewNetworkV2Client() 566 th.AssertNoErr(t, err) 567 568 lbClient, err := clients.NewLoadBalancerV2Client() 569 th.AssertNoErr(t, err) 570 571 network, err := networking.CreateNetwork(t, netClient) 572 th.AssertNoErr(t, err) 573 defer networking.DeleteNetwork(t, netClient, network.ID) 574 575 subnet, err := networking.CreateSubnet(t, netClient, network.ID) 576 th.AssertNoErr(t, err) 577 defer networking.DeleteSubnet(t, netClient, subnet.ID) 578 579 tags := []string{"test"} 580 lb, err := CreateLoadBalancerFullyPopulated(t, lbClient, subnet.ID, tags) 581 th.AssertNoErr(t, err) 582 defer CascadeDeleteLoadBalancer(t, lbClient, lb.ID) 583 584 newLB, err := loadbalancers.Get(lbClient, lb.ID).Extract() 585 th.AssertNoErr(t, err) 586 587 tools.PrintResource(t, newLB) 588 }