github.com/gophercloud/gophercloud@v1.11.0/openstack/compute/v2/servers/testing/requests_test.go (about) 1 package testing 2 3 import ( 4 "encoding/base64" 5 "encoding/json" 6 "net/http" 7 "testing" 8 9 "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones" 10 "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/diskconfig" 11 "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/extendedstatus" 12 "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" 13 "github.com/gophercloud/gophercloud/pagination" 14 th "github.com/gophercloud/gophercloud/testhelper" 15 "github.com/gophercloud/gophercloud/testhelper/client" 16 ) 17 18 func TestListServers(t *testing.T) { 19 th.SetupHTTP() 20 defer th.TeardownHTTP() 21 HandleServerListSuccessfully(t) 22 23 pages := 0 24 err := servers.List(client.ServiceClient(), servers.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) { 25 pages++ 26 27 actual, err := servers.ExtractServers(page) 28 if err != nil { 29 return false, err 30 } 31 32 if len(actual) != 3 { 33 t.Fatalf("Expected 3 servers, got %d", len(actual)) 34 } 35 th.CheckDeepEquals(t, ServerHerp, actual[0]) 36 th.CheckDeepEquals(t, ServerDerp, actual[1]) 37 th.CheckDeepEquals(t, ServerMerp, actual[2]) 38 39 return true, nil 40 }) 41 42 th.AssertNoErr(t, err) 43 44 if pages != 1 { 45 t.Errorf("Expected 1 page, saw %d", pages) 46 } 47 } 48 49 func TestListAllServers(t *testing.T) { 50 th.SetupHTTP() 51 defer th.TeardownHTTP() 52 HandleServerListSimpleSuccessfully(t) 53 54 allPages, err := servers.ListSimple(client.ServiceClient(), servers.ListOpts{}).AllPages() 55 th.AssertNoErr(t, err) 56 actual, err := servers.ExtractServers(allPages) 57 th.AssertNoErr(t, err) 58 th.CheckDeepEquals(t, ServerHerp, actual[0]) 59 th.CheckDeepEquals(t, ServerDerp, actual[1]) 60 } 61 62 func TestListAllServersWithExtensions(t *testing.T) { 63 th.SetupHTTP() 64 defer th.TeardownHTTP() 65 HandleServerListSuccessfully(t) 66 67 type ServerWithExt struct { 68 servers.Server 69 availabilityzones.ServerAvailabilityZoneExt 70 extendedstatus.ServerExtendedStatusExt 71 diskconfig.ServerDiskConfigExt 72 } 73 74 allPages, err := servers.List(client.ServiceClient(), servers.ListOpts{}).AllPages() 75 th.AssertNoErr(t, err) 76 77 var actual []ServerWithExt 78 err = servers.ExtractServersInto(allPages, &actual) 79 th.AssertNoErr(t, err) 80 th.AssertEquals(t, 3, len(actual)) 81 th.AssertEquals(t, "nova", actual[0].AvailabilityZone) 82 th.AssertEquals(t, "RUNNING", actual[0].PowerState.String()) 83 th.AssertEquals(t, "", actual[0].TaskState) 84 th.AssertEquals(t, "active", actual[0].VmState) 85 th.AssertEquals(t, diskconfig.Manual, actual[0].DiskConfig) 86 } 87 88 func TestCreateServer(t *testing.T) { 89 th.SetupHTTP() 90 defer th.TeardownHTTP() 91 HandleServerCreationSuccessfully(t, SingleServerBody) 92 93 actual, err := servers.Create(client.ServiceClient(), servers.CreateOpts{ 94 Name: "derp", 95 ImageRef: "f90f6034-2570-4974-8351-6b49732ef2eb", 96 FlavorRef: "1", 97 }).Extract() 98 th.AssertNoErr(t, err) 99 100 th.CheckDeepEquals(t, ServerDerp, *actual) 101 } 102 103 func TestCreateServerNoNetwork(t *testing.T) { 104 th.SetupHTTP() 105 defer th.TeardownHTTP() 106 HandleServerNoNetworkCreationSuccessfully(t, SingleServerBody) 107 108 actual, err := servers.Create(client.ServiceClient(), servers.CreateOpts{ 109 Name: "derp", 110 ImageRef: "f90f6034-2570-4974-8351-6b49732ef2eb", 111 FlavorRef: "1", 112 Networks: "none", 113 }).Extract() 114 th.AssertNoErr(t, err) 115 116 th.CheckDeepEquals(t, ServerDerp, *actual) 117 } 118 119 func TestCreateServers(t *testing.T) { 120 th.SetupHTTP() 121 defer th.TeardownHTTP() 122 HandleServersCreationSuccessfully(t, SingleServerBody) 123 124 actual, err := servers.Create(client.ServiceClient(), servers.CreateOpts{ 125 Name: "derp", 126 ImageRef: "f90f6034-2570-4974-8351-6b49732ef2eb", 127 FlavorRef: "1", 128 Min: 3, 129 Max: 3, 130 }).Extract() 131 th.AssertNoErr(t, err) 132 133 th.CheckDeepEquals(t, ServerDerp, *actual) 134 } 135 136 func TestCreateServerWithCustomField(t *testing.T) { 137 th.SetupHTTP() 138 defer th.TeardownHTTP() 139 HandleServerCreationWithCustomFieldSuccessfully(t, SingleServerBody) 140 141 actual, err := servers.Create(client.ServiceClient(), CreateOptsWithCustomField{ 142 CreateOpts: servers.CreateOpts{ 143 Name: "derp", 144 ImageRef: "f90f6034-2570-4974-8351-6b49732ef2eb", 145 FlavorRef: "1", 146 }, 147 Foo: "bar", 148 }).Extract() 149 th.AssertNoErr(t, err) 150 151 th.CheckDeepEquals(t, ServerDerp, *actual) 152 } 153 154 func TestCreateServerWithMetadata(t *testing.T) { 155 th.SetupHTTP() 156 defer th.TeardownHTTP() 157 HandleServerCreationWithMetadata(t, SingleServerBody) 158 159 actual, err := servers.Create(client.ServiceClient(), servers.CreateOpts{ 160 Name: "derp", 161 ImageRef: "f90f6034-2570-4974-8351-6b49732ef2eb", 162 FlavorRef: "1", 163 Metadata: map[string]string{ 164 "abc": "def", 165 }, 166 }).Extract() 167 th.AssertNoErr(t, err) 168 169 th.CheckDeepEquals(t, ServerDerp, *actual) 170 } 171 172 func TestCreateServerWithUserdataString(t *testing.T) { 173 th.SetupHTTP() 174 defer th.TeardownHTTP() 175 HandleServerCreationWithUserdata(t, SingleServerBody) 176 177 actual, err := servers.Create(client.ServiceClient(), servers.CreateOpts{ 178 Name: "derp", 179 ImageRef: "f90f6034-2570-4974-8351-6b49732ef2eb", 180 FlavorRef: "1", 181 UserData: []byte("userdata string"), 182 }).Extract() 183 th.AssertNoErr(t, err) 184 185 th.CheckDeepEquals(t, ServerDerp, *actual) 186 } 187 188 func TestCreateServerWithUserdataEncoded(t *testing.T) { 189 th.SetupHTTP() 190 defer th.TeardownHTTP() 191 HandleServerCreationWithUserdata(t, SingleServerBody) 192 193 encoded := base64.StdEncoding.EncodeToString([]byte("userdata string")) 194 195 actual, err := servers.Create(client.ServiceClient(), servers.CreateOpts{ 196 Name: "derp", 197 ImageRef: "f90f6034-2570-4974-8351-6b49732ef2eb", 198 FlavorRef: "1", 199 UserData: []byte(encoded), 200 }).Extract() 201 th.AssertNoErr(t, err) 202 203 th.CheckDeepEquals(t, ServerDerp, *actual) 204 } 205 206 func TestDeleteServer(t *testing.T) { 207 th.SetupHTTP() 208 defer th.TeardownHTTP() 209 HandleServerDeletionSuccessfully(t) 210 211 res := servers.Delete(client.ServiceClient(), "asdfasdfasdf") 212 th.AssertNoErr(t, res.Err) 213 } 214 215 func TestForceDeleteServer(t *testing.T) { 216 th.SetupHTTP() 217 defer th.TeardownHTTP() 218 HandleServerForceDeletionSuccessfully(t) 219 220 res := servers.ForceDelete(client.ServiceClient(), "asdfasdfasdf") 221 th.AssertNoErr(t, res.Err) 222 } 223 224 func TestGetServer(t *testing.T) { 225 th.SetupHTTP() 226 defer th.TeardownHTTP() 227 HandleServerGetSuccessfully(t) 228 229 client := client.ServiceClient() 230 actual, err := servers.Get(client, "1234asdf").Extract() 231 if err != nil { 232 t.Fatalf("Unexpected Get error: %v", err) 233 } 234 235 th.CheckDeepEquals(t, ServerDerp, *actual) 236 } 237 238 func TestGetFaultyServer(t *testing.T) { 239 th.SetupHTTP() 240 defer th.TeardownHTTP() 241 HandleServerGetFaultSuccessfully(t) 242 243 client := client.ServiceClient() 244 actual, err := servers.Get(client, "1234asdf").Extract() 245 if err != nil { 246 t.Fatalf("Unexpected Get error: %v", err) 247 } 248 249 FaultyServer := ServerDerp 250 FaultyServer.Fault = DerpFault 251 th.CheckDeepEquals(t, FaultyServer, *actual) 252 } 253 254 func TestGetServerWithExtensions(t *testing.T) { 255 th.SetupHTTP() 256 defer th.TeardownHTTP() 257 HandleServerGetSuccessfully(t) 258 259 var s struct { 260 servers.Server 261 availabilityzones.ServerAvailabilityZoneExt 262 extendedstatus.ServerExtendedStatusExt 263 diskconfig.ServerDiskConfigExt 264 } 265 266 err := servers.Get(client.ServiceClient(), "1234asdf").ExtractInto(&s) 267 th.AssertNoErr(t, err) 268 th.AssertEquals(t, "nova", s.AvailabilityZone) 269 th.AssertEquals(t, "RUNNING", s.PowerState.String()) 270 th.AssertEquals(t, "", s.TaskState) 271 th.AssertEquals(t, "active", s.VmState) 272 th.AssertEquals(t, diskconfig.Manual, s.DiskConfig) 273 274 err = servers.Get(client.ServiceClient(), "1234asdf").ExtractInto(s) 275 if err == nil { 276 t.Errorf("Expected error when providing non-pointer struct") 277 } 278 } 279 280 func TestUpdateServer(t *testing.T) { 281 th.SetupHTTP() 282 defer th.TeardownHTTP() 283 HandleServerUpdateSuccessfully(t) 284 285 client := client.ServiceClient() 286 actual, err := servers.Update(client, "1234asdf", servers.UpdateOpts{Name: "new-name"}).Extract() 287 if err != nil { 288 t.Fatalf("Unexpected Update error: %v", err) 289 } 290 291 th.CheckDeepEquals(t, ServerDerp, *actual) 292 } 293 294 func TestChangeServerAdminPassword(t *testing.T) { 295 th.SetupHTTP() 296 defer th.TeardownHTTP() 297 HandleAdminPasswordChangeSuccessfully(t) 298 299 res := servers.ChangeAdminPassword(client.ServiceClient(), "1234asdf", "new-password") 300 th.AssertNoErr(t, res.Err) 301 } 302 303 func TestShowConsoleOutput(t *testing.T) { 304 th.SetupHTTP() 305 defer th.TeardownHTTP() 306 HandleShowConsoleOutputSuccessfully(t, ConsoleOutputBody) 307 308 outputOpts := &servers.ShowConsoleOutputOpts{ 309 Length: 50, 310 } 311 actual, err := servers.ShowConsoleOutput(client.ServiceClient(), "1234asdf", outputOpts).Extract() 312 313 th.AssertNoErr(t, err) 314 th.AssertByteArrayEquals(t, []byte(ConsoleOutput), []byte(actual)) 315 } 316 317 func TestGetPassword(t *testing.T) { 318 th.SetupHTTP() 319 defer th.TeardownHTTP() 320 HandlePasswordGetSuccessfully(t) 321 322 res := servers.GetPassword(client.ServiceClient(), "1234asdf") 323 th.AssertNoErr(t, res.Err) 324 } 325 326 func TestRebootServer(t *testing.T) { 327 th.SetupHTTP() 328 defer th.TeardownHTTP() 329 HandleRebootSuccessfully(t) 330 331 res := servers.Reboot(client.ServiceClient(), "1234asdf", servers.RebootOpts{ 332 Type: servers.SoftReboot, 333 }) 334 th.AssertNoErr(t, res.Err) 335 } 336 337 func TestRebuildServer(t *testing.T) { 338 th.SetupHTTP() 339 defer th.TeardownHTTP() 340 HandleRebuildSuccessfully(t, SingleServerBody) 341 342 opts := servers.RebuildOpts{ 343 Name: "new-name", 344 AdminPass: "swordfish", 345 ImageRef: "f90f6034-2570-4974-8351-6b49732ef2eb", 346 AccessIPv4: "1.2.3.4", 347 } 348 349 actual, err := servers.Rebuild(client.ServiceClient(), "1234asdf", opts).Extract() 350 th.AssertNoErr(t, err) 351 352 th.CheckDeepEquals(t, ServerDerp, *actual) 353 } 354 355 func TestResizeServer(t *testing.T) { 356 th.SetupHTTP() 357 defer th.TeardownHTTP() 358 359 th.Mux.HandleFunc("/servers/1234asdf/action", func(w http.ResponseWriter, r *http.Request) { 360 th.TestMethod(t, r, "POST") 361 th.TestHeader(t, r, "X-Auth-Token", client.TokenID) 362 th.TestJSONRequest(t, r, `{ "resize": { "flavorRef": "2" } }`) 363 364 w.WriteHeader(http.StatusAccepted) 365 }) 366 367 res := servers.Resize(client.ServiceClient(), "1234asdf", servers.ResizeOpts{FlavorRef: "2"}) 368 th.AssertNoErr(t, res.Err) 369 } 370 371 func TestConfirmResize(t *testing.T) { 372 th.SetupHTTP() 373 defer th.TeardownHTTP() 374 375 th.Mux.HandleFunc("/servers/1234asdf/action", func(w http.ResponseWriter, r *http.Request) { 376 th.TestMethod(t, r, "POST") 377 th.TestHeader(t, r, "X-Auth-Token", client.TokenID) 378 th.TestJSONRequest(t, r, `{ "confirmResize": null }`) 379 380 w.WriteHeader(http.StatusNoContent) 381 }) 382 383 res := servers.ConfirmResize(client.ServiceClient(), "1234asdf") 384 th.AssertNoErr(t, res.Err) 385 } 386 387 func TestRevertResize(t *testing.T) { 388 th.SetupHTTP() 389 defer th.TeardownHTTP() 390 391 th.Mux.HandleFunc("/servers/1234asdf/action", func(w http.ResponseWriter, r *http.Request) { 392 th.TestMethod(t, r, "POST") 393 th.TestHeader(t, r, "X-Auth-Token", client.TokenID) 394 th.TestJSONRequest(t, r, `{ "revertResize": null }`) 395 396 w.WriteHeader(http.StatusAccepted) 397 }) 398 399 res := servers.RevertResize(client.ServiceClient(), "1234asdf") 400 th.AssertNoErr(t, res.Err) 401 } 402 403 func TestGetMetadatum(t *testing.T) { 404 th.SetupHTTP() 405 defer th.TeardownHTTP() 406 407 HandleMetadatumGetSuccessfully(t) 408 409 expected := map[string]string{"foo": "bar"} 410 actual, err := servers.Metadatum(client.ServiceClient(), "1234asdf", "foo").Extract() 411 th.AssertNoErr(t, err) 412 th.AssertDeepEquals(t, expected, actual) 413 } 414 415 func TestCreateMetadatum(t *testing.T) { 416 th.SetupHTTP() 417 defer th.TeardownHTTP() 418 419 HandleMetadatumCreateSuccessfully(t) 420 421 expected := map[string]string{"foo": "bar"} 422 actual, err := servers.CreateMetadatum(client.ServiceClient(), "1234asdf", servers.MetadatumOpts{"foo": "bar"}).Extract() 423 th.AssertNoErr(t, err) 424 th.AssertDeepEquals(t, expected, actual) 425 } 426 427 func TestDeleteMetadatum(t *testing.T) { 428 th.SetupHTTP() 429 defer th.TeardownHTTP() 430 431 HandleMetadatumDeleteSuccessfully(t) 432 433 err := servers.DeleteMetadatum(client.ServiceClient(), "1234asdf", "foo").ExtractErr() 434 th.AssertNoErr(t, err) 435 } 436 437 func TestGetMetadata(t *testing.T) { 438 th.SetupHTTP() 439 defer th.TeardownHTTP() 440 441 HandleMetadataGetSuccessfully(t) 442 443 expected := map[string]string{"foo": "bar", "this": "that"} 444 actual, err := servers.Metadata(client.ServiceClient(), "1234asdf").Extract() 445 th.AssertNoErr(t, err) 446 th.AssertDeepEquals(t, expected, actual) 447 } 448 449 func TestResetMetadata(t *testing.T) { 450 th.SetupHTTP() 451 defer th.TeardownHTTP() 452 453 HandleMetadataResetSuccessfully(t) 454 455 expected := map[string]string{"foo": "bar", "this": "that"} 456 actual, err := servers.ResetMetadata(client.ServiceClient(), "1234asdf", servers.MetadataOpts{ 457 "foo": "bar", 458 "this": "that", 459 }).Extract() 460 th.AssertNoErr(t, err) 461 th.AssertDeepEquals(t, expected, actual) 462 } 463 464 func TestUpdateMetadata(t *testing.T) { 465 th.SetupHTTP() 466 defer th.TeardownHTTP() 467 468 HandleMetadataUpdateSuccessfully(t) 469 470 expected := map[string]string{"foo": "baz", "this": "those"} 471 actual, err := servers.UpdateMetadata(client.ServiceClient(), "1234asdf", servers.MetadataOpts{ 472 "foo": "baz", 473 "this": "those", 474 }).Extract() 475 th.AssertNoErr(t, err) 476 th.AssertDeepEquals(t, expected, actual) 477 } 478 479 func TestListAddresses(t *testing.T) { 480 th.SetupHTTP() 481 defer th.TeardownHTTP() 482 HandleAddressListSuccessfully(t) 483 484 expected := ListAddressesExpected 485 pages := 0 486 err := servers.ListAddresses(client.ServiceClient(), "asdfasdfasdf").EachPage(func(page pagination.Page) (bool, error) { 487 pages++ 488 489 actual, err := servers.ExtractAddresses(page) 490 th.AssertNoErr(t, err) 491 492 if len(actual) != 2 { 493 t.Fatalf("Expected 2 networks, got %d", len(actual)) 494 } 495 th.CheckDeepEquals(t, expected, actual) 496 497 return true, nil 498 }) 499 th.AssertNoErr(t, err) 500 th.CheckEquals(t, 1, pages) 501 } 502 503 func TestListAddressesByNetwork(t *testing.T) { 504 th.SetupHTTP() 505 defer th.TeardownHTTP() 506 HandleNetworkAddressListSuccessfully(t) 507 508 expected := ListNetworkAddressesExpected 509 pages := 0 510 err := servers.ListAddressesByNetwork(client.ServiceClient(), "asdfasdfasdf", "public").EachPage(func(page pagination.Page) (bool, error) { 511 pages++ 512 513 actual, err := servers.ExtractNetworkAddresses(page) 514 th.AssertNoErr(t, err) 515 516 if len(actual) != 2 { 517 t.Fatalf("Expected 2 addresses, got %d", len(actual)) 518 } 519 th.CheckDeepEquals(t, expected, actual) 520 521 return true, nil 522 }) 523 th.AssertNoErr(t, err) 524 th.CheckEquals(t, 1, pages) 525 } 526 527 func TestCreateServerImage(t *testing.T) { 528 th.SetupHTTP() 529 defer th.TeardownHTTP() 530 HandleCreateServerImageSuccessfully(t) 531 532 _, err := servers.CreateImage(client.ServiceClient(), "serverimage", servers.CreateImageOpts{Name: "test"}).ExtractImageID() 533 th.AssertNoErr(t, err) 534 } 535 536 func TestMarshalPersonality(t *testing.T) { 537 name := "/etc/test" 538 contents := []byte("asdfasdf") 539 540 personality := servers.Personality{ 541 &servers.File{ 542 Path: name, 543 Contents: contents, 544 }, 545 } 546 547 data, err := json.Marshal(personality) 548 if err != nil { 549 t.Fatal(err) 550 } 551 552 var actual []map[string]string 553 err = json.Unmarshal(data, &actual) 554 if err != nil { 555 t.Fatal(err) 556 } 557 558 if len(actual) != 1 { 559 t.Fatal("expected personality length 1") 560 } 561 562 if actual[0]["path"] != name { 563 t.Fatal("file path incorrect") 564 } 565 566 if actual[0]["contents"] != base64.StdEncoding.EncodeToString(contents) { 567 t.Fatal("file contents incorrect") 568 } 569 } 570 571 func TestCreateServerWithTags(t *testing.T) { 572 th.SetupHTTP() 573 defer th.TeardownHTTP() 574 HandleServerWithTagsCreationSuccessfully(t) 575 576 c := client.ServiceClient() 577 c.Microversion = "2.52" 578 579 tags := []string{"foo", "bar"} 580 ServerDerpTags := ServerDerp 581 ServerDerpTags.Tags = &tags 582 583 createOpts := servers.CreateOpts{ 584 Name: "derp", 585 ImageRef: "f90f6034-2570-4974-8351-6b49732ef2eb", 586 FlavorRef: "1", 587 Tags: tags, 588 } 589 res := servers.Create(c, createOpts) 590 th.AssertNoErr(t, res.Err) 591 actualServer, err := res.Extract() 592 th.AssertNoErr(t, err) 593 th.CheckDeepEquals(t, ServerDerpTags, *actualServer) 594 }