github.com/1and1/oneandone-cloudserver-sdk-go@v1.4.1/loadbalancers_test.go (about)

     1  package oneandone
     2  
     3  import (
     4  	"fmt"
     5  	"math/rand"
     6  	"sync"
     7  	"testing"
     8  	"time"
     9  )
    10  
    11  var (
    12  	set_lb       sync.Once
    13  	test_lb_name string
    14  	test_lb_desc string
    15  	test_lb      *LoadBalancer
    16  )
    17  
    18  const (
    19  	lb_round_robin = "ROUND_ROBIN"
    20  	lb_least_con   = "LEAST_CONNECTIONS"
    21  )
    22  
    23  // Helper functions
    24  
    25  func create_load_balancer() *LoadBalancer {
    26  	rand.Seed(time.Now().UnixNano())
    27  	rint := rand.Intn(999)
    28  	test_lb_name = fmt.Sprintf("LoadBalancer_%d", rint)
    29  	test_lb_desc = fmt.Sprintf("LoadBalancer_%d description", rint)
    30  	req := LoadBalancerRequest{
    31  		Name:                test_lb_name,
    32  		Description:         test_lb_desc,
    33  		Method:              lb_round_robin,
    34  		Persistence:         Bool2Pointer(true),
    35  		PersistenceTime:     Int2Pointer(60),
    36  		HealthCheckTest:     "TCP",
    37  		HealthCheckInterval: Int2Pointer(300),
    38  		Rules: []LoadBalancerRule{
    39  			{
    40  				Protocol:     "TCP",
    41  				PortBalancer: 8080,
    42  				PortServer:   8089,
    43  				Source:       "0.0.0.0",
    44  			},
    45  		},
    46  	}
    47  	fmt.Printf("Creating new load balancer '%s'...\n", test_lb_name)
    48  	lb_id, lb, err := api.CreateLoadBalancer(&req)
    49  	if err != nil {
    50  		fmt.Printf("Unable to create a load balancer. Error: %s", err.Error())
    51  		return nil
    52  	}
    53  	if lb_id == "" || lb.Id == "" {
    54  		fmt.Printf("Unable to create load balancer '%s'.", test_lb_name)
    55  		return nil
    56  	}
    57  
    58  	api.WaitForState(lb, "ACTIVE", 10, 30)
    59  	return lb
    60  }
    61  
    62  func set_load_balancer() {
    63  	test_lb = create_load_balancer()
    64  }
    65  
    66  // /load_balancers tests
    67  
    68  func TestCreateLoadBalancer(t *testing.T) {
    69  	set_lb.Do(set_load_balancer)
    70  
    71  	if test_lb == nil {
    72  		t.Errorf("CreateLoadBalancer failed.")
    73  	}
    74  	if test_lb.Id == "" {
    75  		t.Errorf("Missing load balancer ID.")
    76  	}
    77  	if test_lb.Name != test_lb_name {
    78  		t.Errorf("Wrong name of the load balancer.")
    79  	}
    80  	if test_lb.Description != test_lb_desc {
    81  		t.Errorf("Wrong load balancer description.")
    82  	}
    83  	if !test_lb.Persistence {
    84  		t.Errorf("Wrong load balancer persistence.")
    85  	}
    86  	if test_lb.PersistenceTime != 60 {
    87  		t.Errorf("Wrong persistence time for load balancer '%s'.", test_lb.Name)
    88  	}
    89  	if test_lb.HealthCheckInterval != 300 {
    90  		t.Errorf("Wrong health check interval for load balancer '%s'.", test_lb.Name)
    91  	}
    92  	if test_lb.HealthCheckTest != "TCP" {
    93  		t.Errorf("Wrong health check test for load balancer '%s'.", test_lb.Name)
    94  	}
    95  	if test_lb.Method != lb_round_robin {
    96  		t.Errorf("Wrong method for load balancer '%s'.", test_lb.Name)
    97  	}
    98  	if len(test_lb.Rules) != 1 {
    99  		t.Errorf("Wrong number of load balancer '%s' rules.", test_lb.Name)
   100  	} else {
   101  		if test_lb.Rules[0].Protocol != "TCP" {
   102  			t.Errorf("Wrong protocol of load balancer '%s' rule.", test_lb.Name)
   103  		}
   104  		if test_lb.Rules[0].PortBalancer != 8080 {
   105  			t.Errorf("Wrong rule balancer port of load balancer '%s'.", test_lb.Name)
   106  		}
   107  		if test_lb.Rules[0].PortServer != 8089 {
   108  			t.Errorf("Wrong rule server port of load balancer '%s'.", test_lb.Name)
   109  		}
   110  		if test_lb.Rules[0].Source != "0.0.0.0" {
   111  			t.Errorf("Wrong source in load balancer '%s' rule.", test_lb.Name)
   112  		}
   113  	}
   114  }
   115  
   116  func TestGetLoadBalancer(t *testing.T) {
   117  	set_lb.Do(set_load_balancer)
   118  
   119  	fmt.Printf("Getting load balancer '%s'...\n", test_lb.Name)
   120  	lb, err := api.GetLoadBalancer(test_lb.Id)
   121  
   122  	if err != nil {
   123  		t.Errorf("GetLoadBalancer failed. Error: " + err.Error())
   124  	}
   125  	if lb.Id != test_lb.Id {
   126  		t.Errorf("Wrong load balancer ID.")
   127  	}
   128  }
   129  
   130  func TestListLoadBalancers(t *testing.T) {
   131  	set_lb.Do(set_load_balancer)
   132  	fmt.Println("Listing all load balancers...")
   133  
   134  	res, err := api.ListLoadBalancers()
   135  	if err != nil {
   136  		t.Errorf("ListLoadBalancers failed. Error: " + err.Error())
   137  	}
   138  	if len(res) == 0 {
   139  		t.Errorf("No load balancer found.")
   140  	}
   141  
   142  	res, err = api.ListLoadBalancers(1, 1, "", "", "id,name")
   143  
   144  	if err != nil {
   145  		t.Errorf("ListLoadBalancers with parameter options failed. Error: " + err.Error())
   146  	}
   147  	if len(res) == 0 {
   148  		t.Errorf("No load balancer found.")
   149  	}
   150  	if len(res) > 1 {
   151  		t.Errorf("Wrong number of objects per page.")
   152  	}
   153  	if res[0].Id == "" {
   154  		t.Errorf("Filtering parameters failed.")
   155  	}
   156  	if res[0].Name == "" {
   157  		t.Errorf("Filtering parameters failed.")
   158  	}
   159  	if res[0].State != "" {
   160  		t.Errorf("Filtering parameters failed.")
   161  	}
   162  	// Test for error response
   163  	res, err = api.ListLoadBalancers(0, "name")
   164  	if res != nil || err == nil {
   165  		t.Errorf("ListLoadBalancers failed to handle incorrect argument type.")
   166  	}
   167  
   168  	res, err = api.ListLoadBalancers(0, 0, "", test_lb.Name, "")
   169  
   170  	if err != nil {
   171  		t.Errorf("ListLoadBalancers with parameter options failed. Error: " + err.Error())
   172  	}
   173  	if len(res) != 1 {
   174  		t.Errorf("Search parameter failed.")
   175  	}
   176  	if res[0].Name != test_lb.Name {
   177  		t.Errorf("Search parameter failed.")
   178  	}
   179  }
   180  
   181  func TestAddLoadBalancerServerIps(t *testing.T) {
   182  	set_lb.Do(set_load_balancer)
   183  	sync_server.Do(func() { deploy_test_server(false) })
   184  
   185  	fmt.Printf("Assigning server IPs to load balancer '%s'...\n", test_lb.Name)
   186  
   187  	test_server, _ = api.GetServer(test_server.Id)
   188  
   189  	ips := []string{test_server.Ips[0].Id}
   190  	lb, err := api.AddLoadBalancerServerIps(test_lb.Id, ips)
   191  
   192  	if err != nil {
   193  		t.Errorf("AddLoadBalancerServerIps failed. Error: " + err.Error())
   194  	}
   195  
   196  	api.WaitForState(lb, "ACTIVE", 10, 60)
   197  	lb, _ = api.GetLoadBalancer(lb.Id)
   198  
   199  	if len(lb.ServerIps) != 1 {
   200  		t.Errorf("Found no server IP attached to the load balancer.")
   201  	}
   202  	if lb.ServerIps[0].Id != test_server.Ips[0].Id {
   203  		t.Errorf("Wrong server IP attached to the load balancer.")
   204  	}
   205  	test_lb = lb
   206  }
   207  
   208  func TestGetLoadBalancerServerIp(t *testing.T) {
   209  	set_lb.Do(set_load_balancer)
   210  
   211  	fmt.Printf("Getting server IPs of load balancer '%s'...\n", test_lb.Name)
   212  	lb_ser_ip, err := api.GetLoadBalancerServerIp(test_lb.Id, test_lb.ServerIps[0].Id)
   213  
   214  	if err != nil {
   215  		t.Errorf("GetLoadBalancerServerIp failed. Error: " + err.Error())
   216  	}
   217  	if lb_ser_ip.Id != test_lb.ServerIps[0].Id {
   218  		t.Errorf("Wrong ID of the server IP attached to load balancer '%s'.", test_lb.Name)
   219  	}
   220  	if lb_ser_ip.Ip != test_lb.ServerIps[0].Ip {
   221  		t.Errorf("Wrong server IP address attached to load balancer '%s'.", test_lb.Name)
   222  	}
   223  }
   224  
   225  func TestListLoadBalancerServerIps(t *testing.T) {
   226  	set_lb.Do(set_load_balancer)
   227  	sync_server.Do(func() { deploy_test_server(false) })
   228  
   229  	fmt.Printf("Listing server IPs of load balancer '%s'...\n", test_lb.Name)
   230  	lb_ips, err := api.ListLoadBalancerServerIps(test_lb.Id)
   231  
   232  	if err != nil {
   233  		t.Errorf("ListLoadBalancerServerIps failed. Error: " + err.Error())
   234  	}
   235  	if len(lb_ips) != 1 {
   236  		t.Errorf("Wrong number of server IPs added to load balancer '%s'.", test_lb.Name)
   237  	}
   238  	if lb_ips[0].Id != test_server.Ips[0].Id {
   239  		t.Errorf("Wrong server IP added to load balancer '%s'.", test_lb.Name)
   240  	}
   241  }
   242  
   243  func TestDeleteLoadBalancerServerIp(t *testing.T) {
   244  	set_lb.Do(set_load_balancer)
   245  	sync_server.Do(func() { deploy_test_server(false) })
   246  
   247  	fmt.Printf("Deleting server IP from load balancer '%s'...\n", test_lb.Name)
   248  	lb, err := api.DeleteLoadBalancerServerIp(test_lb.Id, test_server.Ips[0].Id)
   249  
   250  	if err != nil {
   251  		t.Errorf("DeleteLoadBalancerServerIp failed. Error: " + err.Error())
   252  	}
   253  
   254  	api.WaitForState(lb, "ACTIVE", 10, 60)
   255  	lb, err = api.GetLoadBalancer(lb.Id)
   256  
   257  	if err != nil {
   258  		t.Errorf("Deleting server IP from the load balancer failed.")
   259  	}
   260  	if len(lb.ServerIps) > 0 {
   261  		t.Errorf("IP not deleted from the load balancer.")
   262  	}
   263  }
   264  
   265  func TestGetLoadBalancerRule(t *testing.T) {
   266  	set_lb.Do(set_load_balancer)
   267  
   268  	fmt.Printf("Getting the rule of load balancer '%s'...\n", test_lb.Name)
   269  	lb_rule, err := api.GetLoadBalancerRule(test_lb.Id, test_lb.Rules[0].Id)
   270  
   271  	if err != nil {
   272  		t.Errorf("GetLoadBalancerRule failed. Error: " + err.Error())
   273  	}
   274  	if lb_rule.Id != test_lb.Rules[0].Id {
   275  		t.Errorf("Wrong rule ID.")
   276  	}
   277  	if lb_rule.PortBalancer != test_lb.Rules[0].PortBalancer {
   278  		t.Errorf("Wrong rule port_balancer field.")
   279  	}
   280  	if lb_rule.PortServer != test_lb.Rules[0].PortServer {
   281  		t.Errorf("Wrong rule port_server field.")
   282  	}
   283  	if lb_rule.Protocol != test_lb.Rules[0].Protocol {
   284  		t.Errorf("Wrong rule protocol.")
   285  	}
   286  	if lb_rule.Source != test_lb.Rules[0].Source {
   287  		t.Errorf("Wrong rule source IP.")
   288  	}
   289  }
   290  
   291  func TestAddLoadBalancerRules(t *testing.T) {
   292  	set_lb.Do(set_load_balancer)
   293  
   294  	fmt.Printf("Adding rules to load balancer '%s'...\n", test_lb.Name)
   295  	rules := []LoadBalancerRule{
   296  		{
   297  			Protocol:     "TCP",
   298  			PortBalancer: 35367,
   299  			PortServer:   35367,
   300  			Source:       "0.0.0.0",
   301  		},
   302  		{
   303  			Protocol:     "TCP",
   304  			PortBalancer: 815,
   305  			PortServer:   815,
   306  		},
   307  	}
   308  	lb, err := api.AddLoadBalancerRules(test_lb.Id, rules)
   309  
   310  	if err != nil {
   311  		t.Errorf("AddLoadBalancerRules failed. Error: " + err.Error())
   312  	} else {
   313  		api.WaitForState(lb, "ACTIVE", 10, 60)
   314  	}
   315  	lb, _ = api.GetLoadBalancer(lb.Id)
   316  	if len(lb.Rules) != 3 {
   317  		t.Errorf("Unable to add rules to load balancer '%s'.\n", test_lb.Name)
   318  	}
   319  }
   320  
   321  func TestListLoadBalancerRules(t *testing.T) {
   322  	set_lb.Do(set_load_balancer)
   323  
   324  	fmt.Printf("Listing load balancer '%s' rules...\n", test_lb.Name)
   325  	lb_rules, err := api.ListLoadBalancerRules(test_lb.Id)
   326  
   327  	if err != nil {
   328  		t.Errorf("ListLoadBalancerRules failed. Error: " + err.Error())
   329  	}
   330  	if len(lb_rules) != 3 {
   331  		t.Errorf("Wrong number of rules found at load balancer '%s'.", test_lb.Name)
   332  	}
   333  }
   334  
   335  func TestDeleteLoadBalancerRule(t *testing.T) {
   336  	set_lb.Do(set_load_balancer)
   337  
   338  	lbr, _ := api.ListLoadBalancerRules(test_lb.Id)
   339  	fmt.Printf("Deleting rule '%s' from load balancer '%s'...\n", lbr[0].Id, test_lb.Name)
   340  	lb, err := api.DeleteLoadBalancerRule(test_lb.Id, lbr[0].Id)
   341  
   342  	if err != nil {
   343  		t.Errorf("DeleteLoadBalancerRule failed. Error: " + err.Error())
   344  	}
   345  
   346  	api.WaitForState(lb, "ACTIVE", 10, 60)
   347  	lb, err = api.GetLoadBalancer(lb.Id)
   348  
   349  	if err != nil {
   350  		t.Errorf("Deleting rule from the load balancer failed.")
   351  	}
   352  	if len(lb.Rules) != 2 {
   353  		t.Errorf("Rule not deleted from the load balancer.")
   354  	}
   355  	for _, rule := range lb.Rules {
   356  		if rule.Id == lbr[0].Id {
   357  			t.Errorf("Rule not deleted from the load balancer.")
   358  		}
   359  	}
   360  }
   361  
   362  func TestUpdateLoadBalancer(t *testing.T) {
   363  	set_lb.Do(set_load_balancer)
   364  
   365  	fmt.Printf("Updating load balancer '%s'...\n", test_lb.Name)
   366  	new_name := test_lb.Name + "_updated"
   367  	new_desc := test_lb.Description + "_updated"
   368  	lbu := LoadBalancerRequest{
   369  		Name:        new_name,
   370  		Description: new_desc,
   371  		Method:      lb_least_con,
   372  		Persistence: Bool2Pointer(false),
   373  	}
   374  	lb, err := api.UpdateLoadBalancer(test_lb.Id, &lbu)
   375  
   376  	if err != nil {
   377  		t.Errorf("UpdateLoadBalancer failed. Error: " + err.Error())
   378  	} else {
   379  		api.WaitForState(lb, "ACTIVE", 10, 30)
   380  	}
   381  	lb, _ = api.GetLoadBalancer(lb.Id)
   382  	if lb.Name != new_name {
   383  		t.Errorf("Failed to update load balancer name.")
   384  	}
   385  	if lb.Description != new_desc {
   386  		t.Errorf("Failed to update load balancer description.")
   387  	}
   388  	if lb.Method != lb_least_con {
   389  		t.Errorf("Failed to update load balancer method.")
   390  	}
   391  	if lb.Persistence {
   392  		t.Errorf("Failed to update load balancer persistence.")
   393  	}
   394  }
   395  
   396  func TestDeleteLoadBalancer(t *testing.T) {
   397  	set_lb.Do(set_load_balancer)
   398  
   399  	fmt.Printf("Deleting load balancer '%s'...\n", test_lb.Name)
   400  	lb, err := api.DeleteLoadBalancer(test_lb.Id)
   401  
   402  	if err != nil {
   403  		t.Errorf("DeleteLoadBalancer failed. Error: " + err.Error())
   404  	} else {
   405  		api.WaitUntilDeleted(lb)
   406  	}
   407  	lb, err = api.GetLoadBalancer(lb.Id)
   408  
   409  	if lb != nil {
   410  		t.Errorf("Unable to delete the load balancer.")
   411  	} else {
   412  		test_lb = nil
   413  	}
   414  }