blob: aed802a54db3a15ebf601c27e9508e1d25c1a618 [file] [log] [blame]
Jamie Hannafordbef53932014-11-05 12:39:30 +01001// +build acceptance lbs
2
3package v1
4
5import (
6 "os"
7 "testing"
8
9 "github.com/rackspace/gophercloud"
10 "github.com/rackspace/gophercloud/acceptance/tools"
11 "github.com/rackspace/gophercloud/openstack/compute/v2/extensions/diskconfig"
12 "github.com/rackspace/gophercloud/pagination"
13 "github.com/rackspace/gophercloud/rackspace/compute/v2/servers"
14 "github.com/rackspace/gophercloud/rackspace/lb/v1/lbs"
15 "github.com/rackspace/gophercloud/rackspace/lb/v1/nodes"
16 th "github.com/rackspace/gophercloud/testhelper"
17)
18
19func TestNodes(t *testing.T) {
20 client := setup(t)
21
22 serverIP := findServer(t)
23 ids := createLB(t, client, 1)
24 lbID := ids[0]
25
26 nodeID := addNodes(t, client, lbID, serverIP)
27
28 listNodes(t, client, lbID)
29
30 getNode(t, client, lbID, nodeID)
31
32 updateNode(t, client, lbID, nodeID)
33
34 listEvents(t, client, lbID)
35
36 deleteNode(t, client, lbID, nodeID)
37}
38
39func findServer(t *testing.T) string {
40 var serverIP string
41
42 client, err := newComputeClient()
43 th.AssertNoErr(t, err)
44
45 err = servers.List(client, nil).EachPage(func(page pagination.Page) (bool, error) {
46 sList, err := servers.ExtractServers(page)
47 th.AssertNoErr(t, err)
48
49 for _, s := range sList {
50 serverIP = s.AccessIPv4
51 t.Logf("Found an existing server: ID [%s] Public IP [%s]", s.ID, serverIP)
52 break
53 }
54
55 return true, nil
56 })
57 th.AssertNoErr(t, err)
58
59 if serverIP == "" {
60 t.Log("No server found, creating one")
61
62 imageRef := os.Getenv("RS_IMAGE_ID")
63 if imageRef == "" {
64 t.Fatalf("OS var RS_IMAGE_ID undefined")
65 }
66 flavorRef := os.Getenv("RS_FLAVOR_ID")
67 if flavorRef == "" {
68 t.Fatalf("OS var RS_FLAVOR_ID undefined")
69 }
70
71 opts := &servers.CreateOpts{
72 Name: tools.RandomString("lb_test_", 5),
73 ImageRef: imageRef,
74 FlavorRef: flavorRef,
75 DiskConfig: diskconfig.Manual,
76 }
77
78 s, err := servers.Create(client, opts).Extract()
79 th.AssertNoErr(t, err)
80 serverIP = s.AccessIPv4
81
82 t.Logf("Created server %s, waiting for it to build", s.ID)
83 err = servers.WaitForStatus(client, s.ID, "ACTIVE", 300)
84 th.AssertNoErr(t, err)
85 t.Logf("Server created successfully.")
86 }
87
88 return serverIP
89}
90
91func addNodes(t *testing.T, client *gophercloud.ServiceClient, lbID int, serverIP string) int {
92 opts := nodes.CreateOpts{
93 nodes.CreateOpt{
94 Address: serverIP,
95 Port: 80,
96 Condition: nodes.ENABLED,
97 Type: nodes.PRIMARY,
98 },
99 }
100
101 page := nodes.Create(client, lbID, opts)
102
103 nodeList, err := page.ExtractNodes()
104 th.AssertNoErr(t, err)
105
106 var nodeID int
107 for _, n := range nodeList {
108 nodeID = n.ID
109 }
110 if nodeID == 0 {
111 t.Fatalf("nodeID could not be extracted from create response")
112 }
113
114 t.Logf("Added node %d to LB %d", nodeID, lbID)
115 waitForLB(client, lbID, lbs.ACTIVE)
116
117 return nodeID
118}
119
120func listNodes(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
121 err := nodes.List(client, lbID, nil).EachPage(func(page pagination.Page) (bool, error) {
122 nodeList, err := nodes.ExtractNodes(page)
123 th.AssertNoErr(t, err)
124
125 for _, n := range nodeList {
126 t.Logf("Listing node: ID [%d] Address [%s:%d] Status [%s]", n.ID, n.Address, n.Port, n.Status)
127 }
128
129 return true, nil
130 })
131 th.AssertNoErr(t, err)
132}
133
134func getNode(t *testing.T, client *gophercloud.ServiceClient, lbID int, nodeID int) {
135 node, err := nodes.Get(client, lbID, nodeID).Extract()
136 th.AssertNoErr(t, err)
137 t.Logf("Getting node %d: Type [%s] Weight [%d]", nodeID, node.Type, node.Weight)
138}
139
140func updateNode(t *testing.T, client *gophercloud.ServiceClient, lbID int, nodeID int) {
141 opts := nodes.UpdateOpts{
142 Weight: nodes.IntToPointer(10),
143 Condition: nodes.DRAINING,
144 Type: nodes.SECONDARY,
145 }
146 err := nodes.Update(client, lbID, nodeID, opts).ExtractErr()
147 th.AssertNoErr(t, err)
148 t.Logf("Updated node %d", nodeID)
149 waitForLB(client, lbID, lbs.ACTIVE)
150}
151
152func listEvents(t *testing.T, client *gophercloud.ServiceClient, lbID int) {
153 pager := nodes.ListEvents(client, lbID, nodes.ListEventsOpts{})
154 err := pager.EachPage(func(page pagination.Page) (bool, error) {
155 eventList, err := nodes.ExtractNodeEvents(page)
156 th.AssertNoErr(t, err)
157
158 for _, e := range eventList {
159 t.Logf("Listing events for node %d: Type [%s] Msg [%s] Severity [%s] Date [%s]",
160 e.NodeID, e.Type, e.DetailedMessage, e.Severity, e.Created)
161 }
162
163 return true, nil
164 })
165 th.AssertNoErr(t, err)
166}
167
168func deleteNode(t *testing.T, client *gophercloud.ServiceClient, lbID int, nodeID int) {
169 err := nodes.Delete(client, lbID, nodeID).ExtractErr()
170 th.AssertNoErr(t, err)
171 t.Logf("Deleted node %d", nodeID)
172}