1
// Copyright 2014 ALTOROS
2
// Licensed under the AGPLv3, see LICENSE file for details.
9
"github.com/altoros/gosigma/data"
10
"github.com/altoros/gosigma/mock"
13
func TestClientServersEmpty(t *testing.T) {
16
cli, err := createTestClient(t)
17
if err != nil || cli == nil {
18
t.Error("NewClient() failed:", err, cli)
22
check := func(rqspec RequestSpec) {
23
servers, err := cli.Servers(rqspec)
28
t.Errorf("%v", servers)
36
func TestClientServers(t *testing.T) {
42
cli, err := createTestClient(t)
48
servers, err := cli.Servers(true)
54
if len(servers) != 1 {
55
t.Errorf("invalid len: %v", servers)
62
t.Error("Empty string representation")
66
checkv := func(v, wants string) {
68
t.Errorf("value %s, wants %s", v, wants)
71
checkv(s.Name(), "name")
72
checkv(s.URI(), "uri")
73
checkv(s.Status(), "status")
74
checkv(s.UUID(), "uuid")
76
checkg := func(s Server, k, wants string) {
77
if v, ok := s.Get(k); !ok || v != wants {
78
t.Errorf("value of Get(%q) = %q, %v; wants %s", k, v, ok, wants)
81
checkg(s, "key1", "value1")
82
checkg(s, "key2", "value2")
88
ds.Meta["key1"] = "value11"
89
ds.Meta["key2"] = "value22"
90
ds.Meta["key3"] = "value33"
93
ds.CPUsInsteadOfCores = true
94
ds.CPUModel = "cpu_model"
95
if err := s.Refresh(); err != nil {
99
checkv(s.Name(), "name1")
100
checkv(s.URI(), "uri1")
101
checkv(s.Status(), "status1")
102
checkg(s, "key1", "value11")
103
checkg(s, "key2", "value22")
104
checkg(s, "key3", "value33")
105
if v := s.Context(); v != true {
106
t.Errorf("Server.Context() failed")
108
if v := s.CPU(); v != 100 {
109
t.Errorf("Server.CPU() failed")
111
if v := s.CPUsInsteadOfCores(); v != true {
112
t.Errorf("Server.CPUsInsteadOfCores() failed")
114
if v := s.CPUModel(); v != "cpu_model" {
115
t.Errorf("Server.CPUModel() failed")
120
if err := s.Refresh(); err == nil {
121
t.Error("Server refresh must fail")
128
func TestClientServer(t *testing.T) {
131
ds := newDataServer()
134
cli, err := createTestClient(t)
140
if s, err := cli.Server(""); err == nil {
141
t.Errorf("Server() returned valid result for empty uuid: %#v", s)
145
s, err := cli.Server("uuid")
151
if s.String() == "" {
152
t.Error("Empty string representation")
155
checkv := func(v, wants string) {
157
t.Errorf("value %s, wants %s", v, wants)
160
checkv(s.Name(), "name")
161
checkv(s.URI(), "uri")
162
checkv(s.Status(), "status")
163
checkv(s.UUID(), "uuid")
165
checkg := func(s Server, k, wants string) {
166
if v, ok := s.Get(k); !ok || v != wants {
167
t.Errorf("value of Get(%q) = %q, %v; wants %s", k, v, ok, wants)
170
checkg(s, "key1", "value1")
171
checkg(s, "key2", "value2")
176
ds.Status = "status1"
177
ds.Meta["key1"] = "value11"
178
ds.Meta["key2"] = "value22"
179
ds.Meta["key3"] = "value33"
180
if err := s.Refresh(); err != nil {
183
checkv(s.Name(), "name1")
184
checkv(s.URI(), "uri1")
185
checkv(s.Status(), "status1")
186
checkg(s, "key1", "value11")
187
checkg(s, "key2", "value22")
188
checkg(s, "key3", "value33")
192
if err := s.Refresh(); err == nil {
193
t.Error("Server refresh must fail")
197
func TestClientServerNotFound(t *testing.T) {
200
cli, err := createTestClient(t)
206
s, err := cli.Server("uuid1234567")
208
t.Errorf("found server %#v", s)
212
cs, ok := err.(*Error)
214
t.Error("error required to be gosigma.Error")
216
if cs.ServiceError.Message != "notfound" {
217
t.Error("invalid error message from mock server")
221
func TestClientServersShort(t *testing.T) {
224
ds := newDataServer()
227
cli, err := createTestClient(t)
233
ss, err := cli.Servers(false)
239
if v, ok := ss[0].Get("key1"); ok || len(v) > 0 {
240
t.Error("Error getting short server list")
243
ss, err = cli.Servers(true)
248
if v, ok := ss[0].Get("key1"); !ok || len(v) == 0 {
249
t.Error("Error getting detailed server list")
255
func TestClientStartServerInvalidUUID(t *testing.T) {
258
cli, err := createTestClient(t)
265
if err := cli.StartServer("uuid-123", nil); err == nil {
266
t.Error("Start server must fail here")
268
t.Log("Start server:", err)
271
// No Server with empty non-nil avoid
272
if err := cli.StartServer("uuid-123", []string{}); err == nil {
273
t.Error("Start server must fail here")
275
t.Log("Start server:", err)
278
// No Server with non-empty non-nil avoid
279
if err := cli.StartServer("uuid-123", []string{"non-uuid"}); err == nil {
280
t.Error("Start server must fail here")
282
t.Log("Start server:", err)
286
func TestClientStartServer(t *testing.T) {
289
ds := newDataServer()
290
ds.Status = "stopped"
293
cli, err := createTestClient(t)
299
s, err := cli.Server("uuid")
305
if err := s.Start(); err != nil {
310
for i := 0; i < 10 && s.Status() != ServerRunning; i++ {
311
if err := s.Refresh(); err != nil {
317
if s.Status() != ServerRunning {
318
t.Error("Server status must be running")
322
func TestClientStopServer(t *testing.T) {
325
ds := newDataServer()
326
ds.Status = "running"
329
cli, err := createTestClient(t)
335
s, err := cli.Server("uuid")
341
if err := s.Stop(); err != nil {
346
for i := 0; i < 10 && s.Status() != ServerStopped; i++ {
347
if err := s.Refresh(); err != nil {
353
if s.Status() != ServerStopped {
354
t.Error("Server status must be stopped")
358
func TestClientCreateServer(t *testing.T) {
361
cli, err := createTestClient(t)
372
c.SetVNCPassword("testserver")
373
c.NetworkDHCP4("virtio")
374
c.NetworkManual4("virtio")
375
c.NetworkStatic4("virtio", "ipaddr")
376
c.NetworkVLan("virtio", "vlanid")
377
c.AttachDrive(1, "0:0", "virtio", "uuid")
379
s, err := cli.CreateServer(c)
385
if s.Name() != "test" {
386
t.Error("Invalid name")
389
t.Error("Invalid cpu")
391
if s.Mem() != 2147483648 {
392
t.Error("Invalid mem")
395
t.Error("Invalid mem")
397
if s.Status() != ServerStopped {
398
t.Error("Server status must be stopped")
400
if s.VNCPassword() != "testserver" {
401
t.Error("VNCPassword invalid")
403
if v := s.IPv4(); len(v) != 0 {
404
t.Error("IPv4 invalid:", v)
409
t.Errorf("NICs error: %#v", nics)
413
if c := n.IPv4().Conf(); c != "dhcp" {
414
t.Errorf("NIC.Conf [0]: %q", c)
416
if n.Model() != "virtio" {
417
t.Errorf("NIC.Model [0]: %q", n.Model())
420
t.Errorf("NIC.MAC [0]: %q", n.MAC())
422
if v := n.VLAN(); v != nil {
423
t.Errorf("NIC.VLAN [0] must be nil, %v", v)
427
if c := n.IPv4().Conf(); c != "manual" {
428
t.Errorf("NIC.Conf [1]: %q", c)
430
if n.Model() != "virtio" {
431
t.Errorf("NIC.Model [1]: %q", n.Model())
434
t.Errorf("NIC.MAC [1]: %q", n.MAC())
436
if v := n.VLAN(); v != nil {
437
t.Errorf("NIC.VLAN [1] must be nil, %v", v)
441
if c := n.IPv4().Conf(); c != "static" {
442
t.Errorf("NIC.Conf [2]: %q", c)
444
if n.Model() != "virtio" {
445
t.Errorf("NIC.Model [2]: %q", n.Model())
448
t.Errorf("NIC.MAC [2]: %q", n.MAC())
450
if v := n.VLAN(); v != nil {
451
t.Errorf("NIC.VLAN [2] must be nil, %v", v)
455
if v := n.IPv4(); v != nil {
456
t.Errorf("NIC.IPV4 [3]: %q", v)
458
if n.Model() != "virtio" {
459
t.Errorf("NIC.Model [3]: %q", n.Model())
462
t.Errorf("NIC.MAC [3]: %q", n.MAC())
464
if v := n.VLAN(); v == nil {
465
t.Error("NIC.VLAN [3] must be not nil")
466
} else if vv := v.UUID(); vv != "vlanid" {
467
t.Errorf("NIC.VLAN [3]: %q", vv)
471
if len(drives) != 1 {
472
t.Errorf("Drives error: %#v", drives)
476
if v := dd.BootOrder(); v != 1 {
477
t.Errorf("ServerDrive.BootOrder: %#v", v)
479
if v := dd.Channel(); v != "0:0" {
480
t.Errorf("ServerDrive.BootOrder: %#v", v)
482
if v := dd.Device(); v != "virtio" {
483
t.Errorf("ServerDrive.Device: %#v", v)
485
if v := dd.UUID(); v != "uuid" {
486
t.Errorf("ServerDrive.UUID: %#v", v)
488
if v := dd.URI(); v != "/api/2.0/drives/uuid/" {
489
t.Errorf("ServerDrive.URI: %#v", v)
491
if v := dd.String(); v != `{BootOrder: 1, Channel: "0:0", Device: "virtio", UUID: "uuid"}` {
492
t.Errorf("ServerDrive.String: %#v", v)
496
if v := ddd.UUID(); v != "uuid" {
497
t.Errorf("Drive.UUID: %#v", v)
499
if v := ddd.URI(); v != data.MakeDriveResource("uuid").URI {
500
t.Errorf("Drive.URI: %#v", v)
502
if v := ddd.Name(); v != "" {
503
t.Errorf("Drive.Name: %#v", v)
505
if v := ddd.Status(); v != "" {
506
t.Errorf("Drive.Status: %#v", v)
508
if v := ddd.Media(); v != "" {
509
t.Errorf("Drive.Media: %#v", v)
511
if v := ddd.StorageType(); v != "" {
512
t.Errorf("Drive.StorageType: %#v", v)
514
if v := ddd.Size(); v != 0 {
515
t.Errorf("Drive.Size: %#v", v)
519
func TestServerIPv4(t *testing.T) {
520
s := &server{obj: &data.Server{
523
data.NIC{Runtime: &data.RuntimeNetwork{}},
527
if ips := s.IPv4(); len(ips) != 0 {
528
t.Errorf("invalid Server.IPv4(): %v", ips)
531
nic0 := data.NIC{Runtime: &data.RuntimeNetwork{
532
IPv4: data.MakeIPResource("0.1.2.3"),
534
s.obj.NICs = append(s.obj.NICs, nic0)
536
if ips := s.IPv4(); len(ips) != 1 || ips[0] != "0.1.2.3" {
537
t.Errorf("invalid Server.IPv4(): %v", ips)
540
nic1 := data.NIC{Runtime: &data.RuntimeNetwork{
541
IPv4: data.MakeIPResource("0.2.3.4"),
543
s.obj.NICs = append(s.obj.NICs, nic1)
545
if ips := s.IPv4(); len(ips) != 2 || ips[0] != "0.1.2.3" || ips[1] != "0.2.3.4" {
546
t.Errorf("invalid Server.IPv4(): %v", ips)