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 }