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  }