github.com/vnpaycloud-console/gophercloud/v2@v2.0.5/internal/acceptance/openstack/loadbalancer/v2/loadbalancers_test.go (about)

     1  //go:build acceptance || networking || loadbalancer || loadbalancers
     2  
     3  package v2
     4  
     5  import (
     6  	"context"
     7  	"testing"
     8  
     9  	"github.com/vnpaycloud-console/gophercloud/v2/internal/acceptance/clients"
    10  	networking "github.com/vnpaycloud-console/gophercloud/v2/internal/acceptance/openstack/networking/v2"
    11  	"github.com/vnpaycloud-console/gophercloud/v2/internal/acceptance/openstack/networking/v2/extensions/qos/policies"
    12  	"github.com/vnpaycloud-console/gophercloud/v2/internal/acceptance/tools"
    13  	"github.com/vnpaycloud-console/gophercloud/v2/openstack/loadbalancer/v2/l7policies"
    14  	"github.com/vnpaycloud-console/gophercloud/v2/openstack/loadbalancer/v2/listeners"
    15  	"github.com/vnpaycloud-console/gophercloud/v2/openstack/loadbalancer/v2/loadbalancers"
    16  	"github.com/vnpaycloud-console/gophercloud/v2/openstack/loadbalancer/v2/monitors"
    17  	"github.com/vnpaycloud-console/gophercloud/v2/openstack/loadbalancer/v2/pools"
    18  	th "github.com/vnpaycloud-console/gophercloud/v2/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(context.TODO())
    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, "", nil)
    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(context.TODO())
    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(context.TODO())
    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(context.TODO())
    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(context.TODO())
    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, "", 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  	tags := []string{"test"}
   125  	policy, err := CreateL7Policy(t, lbClient, listener, lb, tags)
   126  	th.AssertNoErr(t, err)
   127  	defer DeleteL7Policy(t, lbClient, lb.ID, policy.ID)
   128  
   129  	tags = []string{"test", "test1"}
   130  	newDescription := ""
   131  	updateL7policyOpts := l7policies.UpdateOpts{
   132  		Description: &newDescription,
   133  		Tags:        &tags,
   134  	}
   135  	_, err = l7policies.Update(context.TODO(), lbClient, policy.ID, updateL7policyOpts).Extract()
   136  	th.AssertNoErr(t, err)
   137  
   138  	if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil {
   139  		t.Fatalf("Timed out waiting for loadbalancer to become active")
   140  	}
   141  
   142  	newPolicy, err := l7policies.Get(context.TODO(), lbClient, policy.ID).Extract()
   143  	th.AssertNoErr(t, err)
   144  
   145  	tools.PrintResource(t, newPolicy)
   146  
   147  	th.AssertEquals(t, newPolicy.Description, newDescription)
   148  	th.AssertDeepEquals(t, newPolicy.Tags, tags)
   149  
   150  	// L7 rule
   151  	tags = []string{"test"}
   152  	rule, err := CreateL7Rule(t, lbClient, newPolicy.ID, lb, tags)
   153  	th.AssertNoErr(t, err)
   154  	defer DeleteL7Rule(t, lbClient, lb.ID, policy.ID, rule.ID)
   155  
   156  	allPages, err := l7policies.ListRules(lbClient, policy.ID, l7policies.ListRulesOpts{}).AllPages(context.TODO())
   157  	th.AssertNoErr(t, err)
   158  	allRules, err := l7policies.ExtractRules(allPages)
   159  	th.AssertNoErr(t, err)
   160  	for _, rule := range allRules {
   161  		tools.PrintResource(t, rule)
   162  	}
   163  
   164  	tags = []string{"test", "test1"}
   165  	updateL7ruleOpts := l7policies.UpdateRuleOpts{
   166  		RuleType:    l7policies.TypePath,
   167  		CompareType: l7policies.CompareTypeRegex,
   168  		Value:       "/images/special*",
   169  		Tags:        &tags,
   170  	}
   171  	_, err = l7policies.UpdateRule(context.TODO(), lbClient, policy.ID, rule.ID, updateL7ruleOpts).Extract()
   172  	th.AssertNoErr(t, err)
   173  
   174  	if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil {
   175  		t.Fatalf("Timed out waiting for loadbalancer to become active")
   176  	}
   177  
   178  	newRule, err := l7policies.GetRule(context.TODO(), lbClient, newPolicy.ID, rule.ID).Extract()
   179  	th.AssertNoErr(t, err)
   180  
   181  	tools.PrintResource(t, newRule)
   182  
   183  	th.AssertDeepEquals(t, newRule.Tags, tags)
   184  
   185  	// Pool
   186  	pool, err := CreatePoolHTTP(t, lbClient, lb)
   187  	th.AssertNoErr(t, err)
   188  	defer DeletePool(t, lbClient, lb.ID, pool.ID)
   189  
   190  	poolName := ""
   191  	poolDescription := ""
   192  	updatePoolOpts := pools.UpdateOpts{
   193  		Name:        &poolName,
   194  		Description: &poolDescription,
   195  	}
   196  	_, err = pools.Update(context.TODO(), lbClient, pool.ID, updatePoolOpts).Extract()
   197  	th.AssertNoErr(t, err)
   198  
   199  	if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil {
   200  		t.Fatalf("Timed out waiting for loadbalancer to become active")
   201  	}
   202  
   203  	newPool, err := pools.Get(context.TODO(), lbClient, pool.ID).Extract()
   204  	th.AssertNoErr(t, err)
   205  
   206  	tools.PrintResource(t, newPool)
   207  	th.AssertEquals(t, newPool.Name, poolName)
   208  	th.AssertEquals(t, newPool.Description, poolDescription)
   209  
   210  	// Update L7policy to redirect to pool
   211  	newRedirectURL := ""
   212  	updateL7policyOpts = l7policies.UpdateOpts{
   213  		Action:         l7policies.ActionRedirectToPool,
   214  		RedirectPoolID: &newPool.ID,
   215  		RedirectURL:    &newRedirectURL,
   216  	}
   217  	_, err = l7policies.Update(context.TODO(), lbClient, policy.ID, updateL7policyOpts).Extract()
   218  	th.AssertNoErr(t, err)
   219  
   220  	if err := WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil {
   221  		t.Fatalf("Timed out waiting for loadbalancer to become active")
   222  	}
   223  
   224  	newPolicy, err = l7policies.Get(context.TODO(), lbClient, policy.ID).Extract()
   225  	th.AssertNoErr(t, err)
   226  
   227  	tools.PrintResource(t, newPolicy)
   228  
   229  	th.AssertEquals(t, newPolicy.Description, newDescription)
   230  	th.AssertEquals(t, newPolicy.Action, string(l7policies.ActionRedirectToPool))
   231  	th.AssertEquals(t, newPolicy.RedirectPoolID, newPool.ID)
   232  	th.AssertEquals(t, newPolicy.RedirectURL, newRedirectURL)
   233  
   234  	// Workaround for proper delete order
   235  	defer DeleteL7Policy(t, lbClient, lb.ID, policy.ID)
   236  	defer DeleteL7Rule(t, lbClient, lb.ID, policy.ID, rule.ID)
   237  
   238  	// Member
   239  	member, err := CreateMember(t, lbClient, lb, pool, subnet.ID, subnet.CIDR)
   240  	th.AssertNoErr(t, err)
   241  	defer DeleteMember(t, lbClient, lb.ID, pool.ID, member.ID)
   242  
   243  	monitor, err := CreateMonitor(t, lbClient, lb, pool)
   244  	th.AssertNoErr(t, err)
   245  	defer DeleteMonitor(t, lbClient, lb.ID, monitor.ID)
   246  }
   247  
   248  func TestLoadBalancerWithAdditionalVips(t *testing.T) {
   249  	clients.SkipReleasesBelow(t, "stable/zed")
   250  
   251  	netClient, err := clients.NewNetworkV2Client()
   252  	th.AssertNoErr(t, err)
   253  
   254  	lbClient, err := clients.NewLoadBalancerV2Client()
   255  	th.AssertNoErr(t, err)
   256  
   257  	network, err := networking.CreateNetwork(t, netClient)
   258  	th.AssertNoErr(t, err)
   259  	defer networking.DeleteNetwork(t, netClient, network.ID)
   260  
   261  	subnet, err := networking.CreateSubnetWithCIDR(t, netClient, network.ID, "192.168.1.0/24", "192.168.1.1")
   262  	th.AssertNoErr(t, err)
   263  	defer networking.DeleteSubnet(t, netClient, subnet.ID)
   264  
   265  	additionalSubnet, err := networking.CreateSubnetWithCIDR(t, netClient, network.ID, "192.168.2.0/24", "192.168.2.1")
   266  	th.AssertNoErr(t, err)
   267  	defer networking.DeleteSubnet(t, netClient, additionalSubnet.ID)
   268  
   269  	tags := []string{"test"}
   270  	// Octavia takes care of creating the port for the loadbalancer
   271  	additionalSubnetIP := "192.168.2.207"
   272  	lb, err := CreateLoadBalancer(t, lbClient, subnet.ID, tags, "", []loadbalancers.AdditionalVip{{SubnetID: additionalSubnet.ID, IPAddress: additionalSubnetIP}})
   273  	th.AssertNoErr(t, err)
   274  	th.AssertEquals(t, 1, len(lb.AdditionalVips))
   275  	th.AssertEquals(t, additionalSubnetIP, lb.AdditionalVips[0].IPAddress)
   276  	defer DeleteLoadBalancer(t, lbClient, lb.ID)
   277  }
   278  
   279  func TestLoadbalancersCRUD(t *testing.T) {
   280  	netClient, err := clients.NewNetworkV2Client()
   281  	th.AssertNoErr(t, err)
   282  
   283  	// Create QoS policy first as the loadbalancer and its port
   284  	// needs to be deleted before the QoS policy can be deleted
   285  	policy2, err := policies.CreateQoSPolicy(t, netClient)
   286  	th.AssertNoErr(t, err)
   287  	defer policies.DeleteQoSPolicy(t, netClient, policy2.ID)
   288  
   289  	lbClient, err := clients.NewLoadBalancerV2Client()
   290  	th.AssertNoErr(t, err)
   291  
   292  	network, err := networking.CreateNetwork(t, netClient)
   293  	th.AssertNoErr(t, err)
   294  	defer networking.DeleteNetwork(t, netClient, network.ID)
   295  
   296  	subnet, err := networking.CreateSubnetWithCIDR(t, netClient, network.ID, "192.168.1.0/24", "192.168.1.1")
   297  	th.AssertNoErr(t, err)
   298  	defer networking.DeleteSubnet(t, netClient, subnet.ID)
   299  
   300  	policy1, err := policies.CreateQoSPolicy(t, netClient)
   301  	th.AssertNoErr(t, err)
   302  	defer policies.DeleteQoSPolicy(t, netClient, policy1.ID)
   303  
   304  	tags := []string{"test"}
   305  	lb, err := CreateLoadBalancer(t, lbClient, subnet.ID, tags, policy1.ID, nil)
   306  	th.AssertNoErr(t, err)
   307  	th.AssertEquals(t, lb.VipQosPolicyID, policy1.ID)
   308  	defer DeleteLoadBalancer(t, lbClient, lb.ID)
   309  
   310  	lbDescription := ""
   311  	updateLoadBalancerOpts := loadbalancers.UpdateOpts{
   312  		Description:    &lbDescription,
   313  		VipQosPolicyID: &policy2.ID,
   314  	}
   315  	_, err = loadbalancers.Update(context.TODO(), lbClient, lb.ID, updateLoadBalancerOpts).Extract()
   316  	th.AssertNoErr(t, err)
   317  
   318  	if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil {
   319  		t.Fatalf("Timed out waiting for loadbalancer to become active")
   320  	}
   321  
   322  	newLB, err := loadbalancers.Get(context.TODO(), lbClient, lb.ID).Extract()
   323  	th.AssertNoErr(t, err)
   324  
   325  	tools.PrintResource(t, newLB)
   326  
   327  	th.AssertEquals(t, newLB.Description, lbDescription)
   328  	th.AssertEquals(t, newLB.VipQosPolicyID, policy2.ID)
   329  
   330  	lbStats, err := loadbalancers.GetStats(context.TODO(), lbClient, lb.ID).Extract()
   331  	th.AssertNoErr(t, err)
   332  
   333  	tools.PrintResource(t, lbStats)
   334  
   335  	// Because of the time it takes to create a loadbalancer,
   336  	// this test will include some other resources.
   337  
   338  	// Listener
   339  	listener, err := CreateListener(t, lbClient, lb)
   340  	th.AssertNoErr(t, err)
   341  	defer DeleteListener(t, lbClient, lb.ID, listener.ID)
   342  
   343  	listenerName := ""
   344  	listenerDescription := ""
   345  	updateListenerOpts := listeners.UpdateOpts{
   346  		Name:        &listenerName,
   347  		Description: &listenerDescription,
   348  	}
   349  	_, err = listeners.Update(context.TODO(), lbClient, listener.ID, updateListenerOpts).Extract()
   350  	th.AssertNoErr(t, err)
   351  
   352  	if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil {
   353  		t.Fatalf("Timed out waiting for loadbalancer to become active")
   354  	}
   355  
   356  	newListener, err := listeners.Get(context.TODO(), lbClient, listener.ID).Extract()
   357  	th.AssertNoErr(t, err)
   358  
   359  	tools.PrintResource(t, newListener)
   360  
   361  	th.AssertEquals(t, newListener.Name, listenerName)
   362  	th.AssertEquals(t, newListener.Description, listenerDescription)
   363  
   364  	listenerStats, err := listeners.GetStats(context.TODO(), lbClient, listener.ID).Extract()
   365  	th.AssertNoErr(t, err)
   366  
   367  	tools.PrintResource(t, listenerStats)
   368  
   369  	// Pool
   370  	pool, err := CreatePool(t, lbClient, lb)
   371  	th.AssertNoErr(t, err)
   372  	defer DeletePool(t, lbClient, lb.ID, pool.ID)
   373  
   374  	// Update listener's default pool ID.
   375  	updateListenerOpts = listeners.UpdateOpts{
   376  		DefaultPoolID: &pool.ID,
   377  	}
   378  	_, err = listeners.Update(context.TODO(), lbClient, listener.ID, updateListenerOpts).Extract()
   379  	th.AssertNoErr(t, err)
   380  
   381  	if err := WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil {
   382  		t.Fatalf("Timed out waiting for loadbalancer to become active")
   383  	}
   384  
   385  	newListener, err = listeners.Get(context.TODO(), lbClient, listener.ID).Extract()
   386  	th.AssertNoErr(t, err)
   387  
   388  	tools.PrintResource(t, newListener)
   389  
   390  	th.AssertEquals(t, newListener.DefaultPoolID, pool.ID)
   391  
   392  	// Remove listener's default pool ID
   393  	emptyPoolID := ""
   394  	updateListenerOpts = listeners.UpdateOpts{
   395  		DefaultPoolID: &emptyPoolID,
   396  	}
   397  	_, err = listeners.Update(context.TODO(), lbClient, listener.ID, updateListenerOpts).Extract()
   398  	th.AssertNoErr(t, err)
   399  
   400  	if err := WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil {
   401  		t.Fatalf("Timed out waiting for loadbalancer to become active")
   402  	}
   403  
   404  	newListener, err = listeners.Get(context.TODO(), lbClient, listener.ID).Extract()
   405  	th.AssertNoErr(t, err)
   406  
   407  	tools.PrintResource(t, newListener)
   408  
   409  	th.AssertEquals(t, newListener.DefaultPoolID, "")
   410  
   411  	// Member
   412  	member, err := CreateMember(t, lbClient, lb, pool, subnet.ID, subnet.CIDR)
   413  	th.AssertNoErr(t, err)
   414  	defer DeleteMember(t, lbClient, lb.ID, pool.ID, member.ID)
   415  
   416  	memberName := ""
   417  	newWeight := tools.RandomInt(11, 100)
   418  	updateMemberOpts := pools.UpdateMemberOpts{
   419  		Name:   &memberName,
   420  		Weight: &newWeight,
   421  	}
   422  	_, err = pools.UpdateMember(context.TODO(), lbClient, pool.ID, member.ID, updateMemberOpts).Extract()
   423  	th.AssertNoErr(t, err)
   424  
   425  	if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil {
   426  		t.Fatalf("Timed out waiting for loadbalancer to become active")
   427  	}
   428  
   429  	newMember, err := pools.GetMember(context.TODO(), lbClient, pool.ID, member.ID).Extract()
   430  	th.AssertNoErr(t, err)
   431  
   432  	tools.PrintResource(t, newMember)
   433  	th.AssertEquals(t, newMember.Name, memberName)
   434  
   435  	newWeight = tools.RandomInt(11, 100)
   436  	memberOpts := pools.BatchUpdateMemberOpts{
   437  		Address:      member.Address,
   438  		ProtocolPort: member.ProtocolPort,
   439  		Weight:       &newWeight,
   440  	}
   441  	batchMembers := []pools.BatchUpdateMemberOpts{memberOpts}
   442  	if err = pools.BatchUpdateMembers(context.TODO(), lbClient, pool.ID, batchMembers).ExtractErr(); err != nil {
   443  		t.Fatalf("Unable to batch update members")
   444  	}
   445  
   446  	if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil {
   447  		t.Fatalf("Timed out waiting for loadbalancer to become active")
   448  	}
   449  
   450  	newMember, err = pools.GetMember(context.TODO(), lbClient, pool.ID, member.ID).Extract()
   451  	th.AssertNoErr(t, err)
   452  
   453  	tools.PrintResource(t, newMember)
   454  
   455  	pool, err = pools.Get(context.TODO(), lbClient, pool.ID).Extract()
   456  	th.AssertNoErr(t, err)
   457  
   458  	tools.PrintResource(t, pool)
   459  
   460  	// Monitor
   461  	monitor, err := CreateMonitor(t, lbClient, lb, pool)
   462  	th.AssertNoErr(t, err)
   463  	defer DeleteMonitor(t, lbClient, lb.ID, monitor.ID)
   464  
   465  	monName := ""
   466  	newDelay := tools.RandomInt(20, 30)
   467  	newMaxRetriesDown := tools.RandomInt(4, 10)
   468  	updateMonitorOpts := monitors.UpdateOpts{
   469  		Name:           &monName,
   470  		Delay:          newDelay,
   471  		MaxRetriesDown: newMaxRetriesDown,
   472  	}
   473  	_, err = monitors.Update(context.TODO(), lbClient, monitor.ID, updateMonitorOpts).Extract()
   474  	th.AssertNoErr(t, err)
   475  
   476  	if err = WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil {
   477  		t.Fatalf("Timed out waiting for loadbalancer to become active")
   478  	}
   479  
   480  	newMonitor, err := monitors.Get(context.TODO(), lbClient, monitor.ID).Extract()
   481  	th.AssertNoErr(t, err)
   482  
   483  	tools.PrintResource(t, newMonitor)
   484  
   485  	th.AssertEquals(t, newMonitor.Name, monName)
   486  	th.AssertEquals(t, newMonitor.Delay, newDelay)
   487  	th.AssertEquals(t, newMonitor.MaxRetriesDown, newMaxRetriesDown)
   488  }
   489  
   490  func TestLoadbalancersCascadeCRUD(t *testing.T) {
   491  	netClient, err := clients.NewNetworkV2Client()
   492  	th.AssertNoErr(t, err)
   493  
   494  	lbClient, err := clients.NewLoadBalancerV2Client()
   495  	th.AssertNoErr(t, err)
   496  
   497  	network, err := networking.CreateNetwork(t, netClient)
   498  	th.AssertNoErr(t, err)
   499  	defer networking.DeleteNetwork(t, netClient, network.ID)
   500  
   501  	subnet, err := networking.CreateSubnet(t, netClient, network.ID)
   502  	th.AssertNoErr(t, err)
   503  	defer networking.DeleteSubnet(t, netClient, subnet.ID)
   504  
   505  	tags := []string{"test"}
   506  	lb, err := CreateLoadBalancer(t, lbClient, subnet.ID, tags, "", nil)
   507  	th.AssertNoErr(t, err)
   508  	defer CascadeDeleteLoadBalancer(t, lbClient, lb.ID)
   509  
   510  	newLB, err := loadbalancers.Get(context.TODO(), lbClient, lb.ID).Extract()
   511  	th.AssertNoErr(t, err)
   512  
   513  	tools.PrintResource(t, newLB)
   514  
   515  	// Because of the time it takes to create a loadbalancer,
   516  	// this test will include some other resources.
   517  
   518  	// Listener
   519  	listener, err := CreateListener(t, lbClient, lb)
   520  	th.AssertNoErr(t, err)
   521  
   522  	listenerDescription := "Some listener description"
   523  	updateListenerOpts := listeners.UpdateOpts{
   524  		Description: &listenerDescription,
   525  	}
   526  	_, err = listeners.Update(context.TODO(), lbClient, listener.ID, updateListenerOpts).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  	newListener, err := listeners.Get(context.TODO(), lbClient, listener.ID).Extract()
   534  	th.AssertNoErr(t, err)
   535  
   536  	tools.PrintResource(t, newListener)
   537  
   538  	// Pool
   539  	pool, err := CreatePool(t, lbClient, lb)
   540  	th.AssertNoErr(t, err)
   541  
   542  	poolDescription := "Some pool description"
   543  	updatePoolOpts := pools.UpdateOpts{
   544  		Description: &poolDescription,
   545  	}
   546  	_, err = pools.Update(context.TODO(), lbClient, pool.ID, updatePoolOpts).Extract()
   547  	th.AssertNoErr(t, err)
   548  
   549  	if err := WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil {
   550  		t.Fatalf("Timed out waiting for loadbalancer to become active")
   551  	}
   552  
   553  	newPool, err := pools.Get(context.TODO(), lbClient, pool.ID).Extract()
   554  	th.AssertNoErr(t, err)
   555  
   556  	tools.PrintResource(t, newPool)
   557  
   558  	// Member
   559  	member, err := CreateMember(t, lbClient, lb, newPool, subnet.ID, subnet.CIDR)
   560  	th.AssertNoErr(t, err)
   561  
   562  	newWeight := tools.RandomInt(11, 100)
   563  	updateMemberOpts := pools.UpdateMemberOpts{
   564  		Weight: &newWeight,
   565  	}
   566  	_, err = pools.UpdateMember(context.TODO(), lbClient, pool.ID, member.ID, updateMemberOpts).Extract()
   567  	th.AssertNoErr(t, err)
   568  
   569  	if err := WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil {
   570  		t.Fatalf("Timed out waiting for loadbalancer to become active")
   571  	}
   572  
   573  	newMember, err := pools.GetMember(context.TODO(), lbClient, pool.ID, member.ID).Extract()
   574  	th.AssertNoErr(t, err)
   575  
   576  	tools.PrintResource(t, newMember)
   577  
   578  	// Monitor
   579  	monitor, err := CreateMonitor(t, lbClient, lb, newPool)
   580  	th.AssertNoErr(t, err)
   581  
   582  	newDelay := tools.RandomInt(20, 30)
   583  	newMaxRetriesDown := tools.RandomInt(4, 10)
   584  	updateMonitorOpts := monitors.UpdateOpts{
   585  		Delay:          newDelay,
   586  		MaxRetriesDown: newMaxRetriesDown,
   587  	}
   588  	_, err = monitors.Update(context.TODO(), lbClient, monitor.ID, updateMonitorOpts).Extract()
   589  	th.AssertNoErr(t, err)
   590  
   591  	if err := WaitForLoadBalancerState(lbClient, lb.ID, "ACTIVE"); err != nil {
   592  		t.Fatalf("Timed out waiting for loadbalancer to become active")
   593  	}
   594  
   595  	newMonitor, err := monitors.Get(context.TODO(), lbClient, monitor.ID).Extract()
   596  	th.AssertNoErr(t, err)
   597  
   598  	tools.PrintResource(t, newMonitor)
   599  
   600  	th.AssertEquals(t, newMonitor.Delay, newDelay)
   601  	th.AssertEquals(t, newMonitor.MaxRetriesDown, newMaxRetriesDown)
   602  }
   603  
   604  func TestLoadbalancersFullyPopulatedCRUD(t *testing.T) {
   605  	netClient, err := clients.NewNetworkV2Client()
   606  	th.AssertNoErr(t, err)
   607  
   608  	lbClient, err := clients.NewLoadBalancerV2Client()
   609  	th.AssertNoErr(t, err)
   610  
   611  	network, err := networking.CreateNetwork(t, netClient)
   612  	th.AssertNoErr(t, err)
   613  	defer networking.DeleteNetwork(t, netClient, network.ID)
   614  
   615  	subnet, err := networking.CreateSubnet(t, netClient, network.ID)
   616  	th.AssertNoErr(t, err)
   617  	defer networking.DeleteSubnet(t, netClient, subnet.ID)
   618  
   619  	tags := []string{"test"}
   620  	lb, err := CreateLoadBalancerFullyPopulated(t, lbClient, subnet.ID, tags)
   621  	th.AssertNoErr(t, err)
   622  	defer CascadeDeleteLoadBalancer(t, lbClient, lb.ID)
   623  
   624  	newLB, err := loadbalancers.Get(context.TODO(), lbClient, lb.ID).Extract()
   625  	th.AssertNoErr(t, err)
   626  
   627  	tools.PrintResource(t, newLB)
   628  }