blob: 6bdc9e973caa13b608d5097af35cf0e475c7b3dd [file] [log] [blame]
Jamie Hannaford2d480372014-10-22 10:47:09 +02001// +build acceptance compute servers
Ash Wilsonfd566482014-09-23 15:47:35 -04002
3package v2
4
5import (
6 "fmt"
Jon Perritt2a7797d2014-10-21 15:08:43 -05007 "os"
Ash Wilsonfd566482014-09-23 15:47:35 -04008 "testing"
9
10 "github.com/rackspace/gophercloud"
11 "github.com/rackspace/gophercloud/acceptance/tools"
Jon Perritt2a7797d2014-10-21 15:08:43 -050012 "github.com/rackspace/gophercloud/openstack"
Ash Wilsonfd566482014-09-23 15:47:35 -040013 "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
Jon Perritt2a7797d2014-10-21 15:08:43 -050014 "github.com/rackspace/gophercloud/openstack/networking/v2/networks"
Ash Wilsonfd566482014-09-23 15:47:35 -040015 "github.com/rackspace/gophercloud/pagination"
16)
17
18func TestListServers(t *testing.T) {
19 client, err := newClient()
20 if err != nil {
21 t.Fatalf("Unable to create a compute client: %v", err)
22 }
23
24 t.Logf("ID\tRegion\tName\tStatus\tIPv4\tIPv6")
25
Jamie Hannaford1e7841b2014-10-16 12:45:49 +020026 pager := servers.List(client, servers.ListOpts{})
Ash Wilsonfd566482014-09-23 15:47:35 -040027 count, pages := 0, 0
28 pager.EachPage(func(page pagination.Page) (bool, error) {
29 pages++
30 t.Logf("---")
31
32 servers, err := servers.ExtractServers(page)
33 if err != nil {
34 return false, err
35 }
36
37 for _, s := range servers {
38 t.Logf("%s\t%s\t%s\t%s\t%s\t\n", s.ID, s.Name, s.Status, s.AccessIPv4, s.AccessIPv6)
39 count++
40 }
41
42 return true, nil
43 })
44
45 fmt.Printf("--------\n%d servers listed on %d pages.\n", count, pages)
46}
47
Jon Perritt2a7797d2014-10-21 15:08:43 -050048func networkingClient() (*gophercloud.ServiceClient, error) {
Ash Wilson1904fce2014-10-22 15:50:48 -040049 opts, err := openstack.AuthOptionsFromEnv()
Jon Perritt2a7797d2014-10-21 15:08:43 -050050 if err != nil {
51 return nil, err
52 }
53
54 provider, err := openstack.AuthenticatedClient(opts)
55 if err != nil {
56 return nil, err
57 }
58
59 return openstack.NewNetworkV2(provider, gophercloud.EndpointOpts{
60 Name: "neutron",
61 Region: os.Getenv("OS_REGION_NAME"),
62 })
63}
64
Ash Wilsonfd566482014-09-23 15:47:35 -040065func createServer(t *testing.T, client *gophercloud.ServiceClient, choices *ComputeChoices) (*servers.Server, error) {
Jon Perritt8135c6f2014-10-23 12:29:14 -050066 if testing.Short(){
67 t.Skip("Skipping test that requires server creation in short mode.")
68 }
69
Jon Perritt2a7797d2014-10-21 15:08:43 -050070 var network networks.Network
71
72 networkingClient, err := networkingClient()
73 if err != nil {
74 t.Fatalf("Unable to create a networking client: %v", err)
75 }
76
77 pager := networks.List(networkingClient, networks.ListOpts{Name: "public", Limit: 1})
78 pager.EachPage(func(page pagination.Page) (bool, error) {
79 networks, err := networks.ExtractNetworks(page)
80 if err != nil {
81 t.Errorf("Failed to extract networks: %v", err)
82 return false, err
83 }
84
85 if len(networks) == 0 {
Jon Perritt3525c642014-10-21 17:12:06 -050086 t.Fatalf("No networks to attach to server")
Jon Perritt2a7797d2014-10-21 15:08:43 -050087 return false, err
88 }
89
90 network = networks[0]
91
92 return false, nil
93 })
94
Ash Wilsonfd566482014-09-23 15:47:35 -040095 name := tools.RandomString("ACPTTEST", 16)
96 t.Logf("Attempting to create server: %s\n", name)
97
Ash Wilson488e7302014-10-02 11:04:25 -040098 server, err := servers.Create(client, servers.CreateOpts{
Ash Wilsone8458512014-09-29 08:50:09 -040099 Name: name,
100 FlavorRef: choices.FlavorID,
101 ImageRef: choices.ImageID,
Jon Perritt2a7797d2014-10-21 15:08:43 -0500102 Networks: []servers.Network{
103 servers.Network{UUID: network.ID},
104 },
Ash Wilson89734d02014-09-25 13:50:08 -0400105 }).Extract()
Ash Wilsonfd566482014-09-23 15:47:35 -0400106 if err != nil {
107 t.Fatalf("Unable to create server: %v", err)
108 }
109
Ash Wilson89734d02014-09-25 13:50:08 -0400110 return server, err
Ash Wilsonfd566482014-09-23 15:47:35 -0400111}
112
113func TestCreateDestroyServer(t *testing.T) {
114 choices, err := ComputeChoicesFromEnv()
115 if err != nil {
116 t.Fatal(err)
117 }
118
119 client, err := newClient()
120 if err != nil {
121 t.Fatalf("Unable to create a compute client: %v", err)
122 }
123
Ash Wilsonfd566482014-09-23 15:47:35 -0400124 server, err := createServer(t, client, choices)
125 if err != nil {
126 t.Fatalf("Unable to create server: %v", err)
127 }
128 defer func() {
129 servers.Delete(client, server.ID)
130 t.Logf("Server deleted.")
131 }()
132
133 if err = waitForStatus(client, server, "ACTIVE"); err != nil {
134 t.Fatalf("Unable to wait for server: %v", err)
135 }
136}
137
138func TestUpdateServer(t *testing.T) {
139 client, err := newClient()
140 if err != nil {
141 t.Fatalf("Unable to create a compute client: %v", err)
142 }
143
144 choices, err := ComputeChoicesFromEnv()
145 if err != nil {
146 t.Fatal(err)
147 }
148
149 server, err := createServer(t, client, choices)
150 if err != nil {
151 t.Fatal(err)
152 }
153 defer servers.Delete(client, server.ID)
154
155 if err = waitForStatus(client, server, "ACTIVE"); err != nil {
156 t.Fatal(err)
157 }
158
159 alternateName := tools.RandomString("ACPTTEST", 16)
160 for alternateName == server.Name {
161 alternateName = tools.RandomString("ACPTTEST", 16)
162 }
163
164 t.Logf("Attempting to rename the server to %s.", alternateName)
165
Ash Wilsondcbc8fb2014-09-29 09:05:44 -0400166 updated, err := servers.Update(client, server.ID, servers.UpdateOpts{Name: alternateName}).Extract()
Ash Wilsonfd566482014-09-23 15:47:35 -0400167 if err != nil {
168 t.Fatalf("Unable to rename server: %v", err)
169 }
Ash Wilsonfd566482014-09-23 15:47:35 -0400170
171 if updated.ID != server.ID {
172 t.Errorf("Updated server ID [%s] didn't match original server ID [%s]!", updated.ID, server.ID)
173 }
174
175 err = tools.WaitFor(func() (bool, error) {
Ash Wilson89734d02014-09-25 13:50:08 -0400176 latest, err := servers.Get(client, updated.ID).Extract()
Ash Wilsonfd566482014-09-23 15:47:35 -0400177 if err != nil {
178 return false, err
179 }
180
181 return latest.Name == alternateName, nil
182 })
183}
184
185func TestActionChangeAdminPassword(t *testing.T) {
186 t.Parallel()
187
188 client, err := newClient()
189 if err != nil {
190 t.Fatalf("Unable to create a compute client: %v", err)
191 }
192
193 choices, err := ComputeChoicesFromEnv()
194 if err != nil {
195 t.Fatal(err)
196 }
197
198 server, err := createServer(t, client, choices)
199 if err != nil {
200 t.Fatal(err)
201 }
202 defer servers.Delete(client, server.ID)
203
204 if err = waitForStatus(client, server, "ACTIVE"); err != nil {
205 t.Fatal(err)
206 }
207
208 randomPassword := tools.MakeNewPassword(server.AdminPass)
Jon Perritt2a7797d2014-10-21 15:08:43 -0500209 res := servers.ChangeAdminPassword(client, server.ID, randomPassword)
Jamie Hannaforda2621742014-10-16 14:35:49 +0200210 if res.Err != nil {
Ash Wilsonfd566482014-09-23 15:47:35 -0400211 t.Fatal(err)
212 }
213
214 if err = waitForStatus(client, server, "PASSWORD"); err != nil {
215 t.Fatal(err)
216 }
217
218 if err = waitForStatus(client, server, "ACTIVE"); err != nil {
219 t.Fatal(err)
220 }
221}
222
223func TestActionReboot(t *testing.T) {
224 t.Parallel()
225
226 client, err := newClient()
227 if err != nil {
228 t.Fatalf("Unable to create a compute client: %v", err)
229 }
230
231 choices, err := ComputeChoicesFromEnv()
232 if err != nil {
233 t.Fatal(err)
234 }
235
236 server, err := createServer(t, client, choices)
237 if err != nil {
238 t.Fatal(err)
239 }
240 defer servers.Delete(client, server.ID)
241
242 if err = waitForStatus(client, server, "ACTIVE"); err != nil {
243 t.Fatal(err)
244 }
245
Jon Perritt2a7797d2014-10-21 15:08:43 -0500246 res := servers.Reboot(client, server.ID, "aldhjflaskhjf")
Jamie Hannaforda2621742014-10-16 14:35:49 +0200247 if res.Err == nil {
Ash Wilsonfd566482014-09-23 15:47:35 -0400248 t.Fatal("Expected the SDK to provide an ArgumentError here")
249 }
250
251 t.Logf("Attempting reboot of server %s", server.ID)
Jamie Hannaforda2621742014-10-16 14:35:49 +0200252 res = servers.Reboot(client, server.ID, servers.OSReboot)
253 if res.Err != nil {
Ash Wilsonfd566482014-09-23 15:47:35 -0400254 t.Fatalf("Unable to reboot server: %v", err)
255 }
256
257 if err = waitForStatus(client, server, "REBOOT"); err != nil {
258 t.Fatal(err)
259 }
260
261 if err = waitForStatus(client, server, "ACTIVE"); err != nil {
262 t.Fatal(err)
263 }
264}
265
266func TestActionRebuild(t *testing.T) {
267 t.Parallel()
268
269 client, err := newClient()
270 if err != nil {
271 t.Fatalf("Unable to create a compute client: %v", err)
272 }
273
274 choices, err := ComputeChoicesFromEnv()
275 if err != nil {
276 t.Fatal(err)
277 }
278
279 server, err := createServer(t, client, choices)
280 if err != nil {
281 t.Fatal(err)
282 }
283 defer servers.Delete(client, server.ID)
284
285 if err = waitForStatus(client, server, "ACTIVE"); err != nil {
286 t.Fatal(err)
287 }
288
289 t.Logf("Attempting to rebuild server %s", server.ID)
290
Jamie Hannaford5bfa2e82014-10-16 16:32:42 +0200291 rebuildOpts := servers.RebuildOpts{
292 Name: tools.RandomString("ACPTTEST", 16),
293 AdminPass: tools.MakeNewPassword(server.AdminPass),
294 ImageID: choices.ImageID,
295 }
296
297 rebuilt, err := servers.Rebuild(client, server.ID, rebuildOpts).Extract()
Ash Wilsonfd566482014-09-23 15:47:35 -0400298 if err != nil {
299 t.Fatal(err)
300 }
301
Ash Wilsonfd566482014-09-23 15:47:35 -0400302 if rebuilt.ID != server.ID {
303 t.Errorf("Expected rebuilt server ID of [%s]; got [%s]", server.ID, rebuilt.ID)
304 }
305
306 if err = waitForStatus(client, rebuilt, "REBUILD"); err != nil {
307 t.Fatal(err)
308 }
309
310 if err = waitForStatus(client, rebuilt, "ACTIVE"); err != nil {
311 t.Fatal(err)
312 }
313}
314
Ash Wilsondc7daa82014-09-23 16:34:42 -0400315func resizeServer(t *testing.T, client *gophercloud.ServiceClient, server *servers.Server, choices *ComputeChoices) {
316 if err := waitForStatus(client, server, "ACTIVE"); err != nil {
Ash Wilsonfd566482014-09-23 15:47:35 -0400317 t.Fatal(err)
318 }
319
320 t.Logf("Attempting to resize server [%s]", server.ID)
321
Jamie Hannaforda2621742014-10-16 14:35:49 +0200322 if res := servers.Resize(client, server.ID, choices.FlavorIDResize); res.Err != nil {
Jon Perritt2a7797d2014-10-21 15:08:43 -0500323 t.Fatal(res.Err)
Ash Wilsonfd566482014-09-23 15:47:35 -0400324 }
325
Ash Wilsondc7daa82014-09-23 16:34:42 -0400326 if err := waitForStatus(client, server, "VERIFY_RESIZE"); err != nil {
Ash Wilsonfd566482014-09-23 15:47:35 -0400327 t.Fatal(err)
328 }
Ash Wilsonfd566482014-09-23 15:47:35 -0400329}
330
331func TestActionResizeConfirm(t *testing.T) {
332 t.Parallel()
333
Ash Wilsondc7daa82014-09-23 16:34:42 -0400334 choices, err := ComputeChoicesFromEnv()
335 if err != nil {
336 t.Fatal(err)
337 }
338
Ash Wilsonfd566482014-09-23 15:47:35 -0400339 client, err := newClient()
340 if err != nil {
341 t.Fatalf("Unable to create a compute client: %v", err)
342 }
343
Ash Wilsondc7daa82014-09-23 16:34:42 -0400344 server, err := createServer(t, client, choices)
345 if err != nil {
346 t.Fatal(err)
347 }
Ash Wilsonfd566482014-09-23 15:47:35 -0400348 defer servers.Delete(client, server.ID)
Ash Wilsondc7daa82014-09-23 16:34:42 -0400349 resizeServer(t, client, server, choices)
Ash Wilsonfd566482014-09-23 15:47:35 -0400350
351 t.Logf("Attempting to confirm resize for server %s", server.ID)
352
Jamie Hannaforda2621742014-10-16 14:35:49 +0200353 if res := servers.ConfirmResize(client, server.ID); res.Err != nil {
Ash Wilsonfd566482014-09-23 15:47:35 -0400354 t.Fatal(err)
355 }
356
357 if err = waitForStatus(client, server, "ACTIVE"); err != nil {
358 t.Fatal(err)
359 }
360}
361
362func TestActionResizeRevert(t *testing.T) {
363 t.Parallel()
364
Ash Wilsondc7daa82014-09-23 16:34:42 -0400365 choices, err := ComputeChoicesFromEnv()
366 if err != nil {
367 t.Fatal(err)
368 }
369
Ash Wilsonfd566482014-09-23 15:47:35 -0400370 client, err := newClient()
371 if err != nil {
372 t.Fatalf("Unable to create a compute client: %v", err)
373 }
374
Ash Wilsondc7daa82014-09-23 16:34:42 -0400375 server, err := createServer(t, client, choices)
376 if err != nil {
Ash Wilsonfd566482014-09-23 15:47:35 -0400377 t.Fatal(err)
378 }
Ash Wilsondc7daa82014-09-23 16:34:42 -0400379 defer servers.Delete(client, server.ID)
380 resizeServer(t, client, server, choices)
Ash Wilsonfd566482014-09-23 15:47:35 -0400381
382 t.Logf("Attempting to revert resize for server %s", server.ID)
383
Jamie Hannaforda2621742014-10-16 14:35:49 +0200384 if res := servers.RevertResize(client, server.ID); res.Err != nil {
Ash Wilsonfd566482014-09-23 15:47:35 -0400385 t.Fatal(err)
386 }
387
Ash Wilsonfd566482014-09-23 15:47:35 -0400388 if err = waitForStatus(client, server, "ACTIVE"); err != nil {
389 t.Fatal(err)
390 }
391}