github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/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/opentelekomcloud/gophertelekomcloud/openstack/compute/v2/extensions/availabilityzones" 10 "github.com/opentelekomcloud/gophertelekomcloud/openstack/compute/v2/extensions/diskconfig" 11 "github.com/opentelekomcloud/gophertelekomcloud/openstack/compute/v2/extensions/extendedstatus" 12 "github.com/opentelekomcloud/gophertelekomcloud/openstack/compute/v2/servers" 13 "github.com/opentelekomcloud/gophertelekomcloud/pagination" 14 th "github.com/opentelekomcloud/gophertelekomcloud/testhelper" 15 "github.com/opentelekomcloud/gophertelekomcloud/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 HandleServerListSuccessfully(t) 53 54 allPages, err := servers.List(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 TestCreateServerWithCustomField(t *testing.T) { 104 th.SetupHTTP() 105 defer th.TeardownHTTP() 106 HandleServerCreationWithCustomFieldSuccessfully(t, SingleServerBody) 107 108 actual, err := servers.Create(client.ServiceClient(), CreateOptsWithCustomField{ 109 CreateOpts: servers.CreateOpts{ 110 Name: "derp", 111 ImageRef: "f90f6034-2570-4974-8351-6b49732ef2eb", 112 FlavorRef: "1", 113 }, 114 Foo: "bar", 115 }).Extract() 116 th.AssertNoErr(t, err) 117 118 th.CheckDeepEquals(t, ServerDerp, *actual) 119 } 120 121 func TestCreateServerWithMetadata(t *testing.T) { 122 th.SetupHTTP() 123 defer th.TeardownHTTP() 124 HandleServerCreationWithMetadata(t, SingleServerBody) 125 126 actual, err := servers.Create(client.ServiceClient(), servers.CreateOpts{ 127 Name: "derp", 128 ImageRef: "f90f6034-2570-4974-8351-6b49732ef2eb", 129 FlavorRef: "1", 130 Metadata: map[string]string{ 131 "abc": "def", 132 }, 133 }).Extract() 134 th.AssertNoErr(t, err) 135 136 th.CheckDeepEquals(t, ServerDerp, *actual) 137 } 138 139 func TestCreateServerWithUserdataString(t *testing.T) { 140 th.SetupHTTP() 141 defer th.TeardownHTTP() 142 HandleServerCreationWithUserdata(t, SingleServerBody) 143 144 actual, err := servers.Create(client.ServiceClient(), servers.CreateOpts{ 145 Name: "derp", 146 ImageRef: "f90f6034-2570-4974-8351-6b49732ef2eb", 147 FlavorRef: "1", 148 UserData: []byte("userdata string"), 149 }).Extract() 150 th.AssertNoErr(t, err) 151 152 th.CheckDeepEquals(t, ServerDerp, *actual) 153 } 154 155 func TestCreateServerWithUserdataEncoded(t *testing.T) { 156 th.SetupHTTP() 157 defer th.TeardownHTTP() 158 HandleServerCreationWithUserdata(t, SingleServerBody) 159 160 encoded := base64.StdEncoding.EncodeToString([]byte("userdata string")) 161 162 actual, err := servers.Create(client.ServiceClient(), servers.CreateOpts{ 163 Name: "derp", 164 ImageRef: "f90f6034-2570-4974-8351-6b49732ef2eb", 165 FlavorRef: "1", 166 UserData: []byte(encoded), 167 }).Extract() 168 th.AssertNoErr(t, err) 169 170 th.CheckDeepEquals(t, ServerDerp, *actual) 171 } 172 173 func TestDeleteServer(t *testing.T) { 174 th.SetupHTTP() 175 defer th.TeardownHTTP() 176 HandleServerDeletionSuccessfully(t) 177 178 res := servers.Delete(client.ServiceClient(), "asdfasdfasdf") 179 th.AssertNoErr(t, res.Err) 180 } 181 182 func TestForceDeleteServer(t *testing.T) { 183 th.SetupHTTP() 184 defer th.TeardownHTTP() 185 HandleServerForceDeletionSuccessfully(t) 186 187 res := servers.ForceDelete(client.ServiceClient(), "asdfasdfasdf") 188 th.AssertNoErr(t, res.Err) 189 } 190 191 func TestGetServer(t *testing.T) { 192 th.SetupHTTP() 193 defer th.TeardownHTTP() 194 HandleServerGetSuccessfully(t) 195 196 serviceClient := client.ServiceClient() 197 actual, err := servers.Get(serviceClient, "1234asdf").Extract() 198 if err != nil { 199 t.Fatalf("Unexpected Get error: %v", err) 200 } 201 202 th.CheckDeepEquals(t, ServerDerp, *actual) 203 } 204 205 func TestGetFaultyServer(t *testing.T) { 206 th.SetupHTTP() 207 defer th.TeardownHTTP() 208 HandleServerGetFaultSuccessfully(t) 209 210 serviceClient := client.ServiceClient() 211 actual, err := servers.Get(serviceClient, "1234asdf").Extract() 212 if err != nil { 213 t.Fatalf("Unexpected Get error: %v", err) 214 } 215 216 FaultyServer := ServerDerp 217 FaultyServer.Fault = DerpFault 218 th.CheckDeepEquals(t, FaultyServer, *actual) 219 } 220 221 func TestGetServerWithExtensions(t *testing.T) { 222 th.SetupHTTP() 223 defer th.TeardownHTTP() 224 HandleServerGetSuccessfully(t) 225 226 var s struct { 227 servers.Server 228 availabilityzones.ServerAvailabilityZoneExt 229 extendedstatus.ServerExtendedStatusExt 230 diskconfig.ServerDiskConfigExt 231 } 232 233 err := servers.Get(client.ServiceClient(), "1234asdf").ExtractInto(&s) 234 th.AssertNoErr(t, err) 235 th.AssertEquals(t, "nova", s.AvailabilityZone) 236 th.AssertEquals(t, "RUNNING", s.PowerState.String()) 237 th.AssertEquals(t, "", s.TaskState) 238 th.AssertEquals(t, "active", s.VmState) 239 th.AssertEquals(t, diskconfig.Manual, s.DiskConfig) 240 241 err = servers.Get(client.ServiceClient(), "1234asdf").ExtractInto(s) 242 if err == nil { 243 t.Errorf("Expected error when providing non-pointer struct") 244 } 245 } 246 247 func TestUpdateServer(t *testing.T) { 248 th.SetupHTTP() 249 defer th.TeardownHTTP() 250 HandleServerUpdateSuccessfully(t) 251 252 serviceClient := client.ServiceClient() 253 actual, err := servers.Update(serviceClient, "1234asdf", servers.UpdateOpts{Name: "new-name"}).Extract() 254 if err != nil { 255 t.Fatalf("Unexpected Update error: %v", err) 256 } 257 258 th.CheckDeepEquals(t, ServerDerp, *actual) 259 } 260 261 func TestChangeServerAdminPassword(t *testing.T) { 262 th.SetupHTTP() 263 defer th.TeardownHTTP() 264 HandleAdminPasswordChangeSuccessfully(t) 265 266 res := servers.ChangeAdminPassword(client.ServiceClient(), "1234asdf", "new-password") 267 th.AssertNoErr(t, res.Err) 268 } 269 270 func TestShowConsoleOutput(t *testing.T) { 271 th.SetupHTTP() 272 defer th.TeardownHTTP() 273 HandleShowConsoleOutputSuccessfully(t, ConsoleOutputBody) 274 275 outputOpts := &servers.ShowConsoleOutputOpts{ 276 Length: 50, 277 } 278 actual, err := servers.ShowConsoleOutput(client.ServiceClient(), "1234asdf", outputOpts).Extract() 279 280 th.AssertNoErr(t, err) 281 th.AssertByteArrayEquals(t, []byte(ConsoleOutput), []byte(actual)) 282 } 283 284 func TestGetPassword(t *testing.T) { 285 th.SetupHTTP() 286 defer th.TeardownHTTP() 287 HandlePasswordGetSuccessfully(t) 288 289 res := servers.GetPassword(client.ServiceClient(), "1234asdf") 290 th.AssertNoErr(t, res.Err) 291 } 292 293 func TestRebootServer(t *testing.T) { 294 th.SetupHTTP() 295 defer th.TeardownHTTP() 296 HandleRebootSuccessfully(t) 297 298 res := servers.Reboot(client.ServiceClient(), "1234asdf", servers.RebootOpts{ 299 Type: servers.SoftReboot, 300 }) 301 th.AssertNoErr(t, res.Err) 302 } 303 304 func TestRebuildServer(t *testing.T) { 305 th.SetupHTTP() 306 defer th.TeardownHTTP() 307 HandleRebuildSuccessfully(t, SingleServerBody) 308 309 opts := servers.RebuildOpts{ 310 Name: "new-name", 311 AdminPass: "swordfish", 312 ImageID: "http://104.130.131.164:8774/fcad67a6189847c4aecfa3c81a05783b/images/f90f6034-2570-4974-8351-6b49732ef2eb", 313 AccessIPv4: "1.2.3.4", 314 } 315 316 actual, err := servers.Rebuild(client.ServiceClient(), "1234asdf", opts).Extract() 317 th.AssertNoErr(t, err) 318 319 th.CheckDeepEquals(t, ServerDerp, *actual) 320 } 321 322 func TestResizeServer(t *testing.T) { 323 th.SetupHTTP() 324 defer th.TeardownHTTP() 325 326 th.Mux.HandleFunc("/servers/1234asdf/action", func(w http.ResponseWriter, r *http.Request) { 327 th.TestMethod(t, r, "POST") 328 th.TestHeader(t, r, "X-Auth-Token", client.TokenID) 329 th.TestJSONRequest(t, r, `{ "resize": { "flavorRef": "2" } }`) 330 331 w.WriteHeader(http.StatusAccepted) 332 }) 333 334 res := servers.Resize(client.ServiceClient(), "1234asdf", servers.ResizeOpts{FlavorRef: "2"}) 335 th.AssertNoErr(t, res.Err) 336 } 337 338 func TestConfirmResize(t *testing.T) { 339 th.SetupHTTP() 340 defer th.TeardownHTTP() 341 342 th.Mux.HandleFunc("/servers/1234asdf/action", func(w http.ResponseWriter, r *http.Request) { 343 th.TestMethod(t, r, "POST") 344 th.TestHeader(t, r, "X-Auth-Token", client.TokenID) 345 th.TestJSONRequest(t, r, `{ "confirmResize": null }`) 346 347 w.WriteHeader(http.StatusNoContent) 348 }) 349 350 res := servers.ConfirmResize(client.ServiceClient(), "1234asdf") 351 th.AssertNoErr(t, res.Err) 352 } 353 354 func TestRevertResize(t *testing.T) { 355 th.SetupHTTP() 356 defer th.TeardownHTTP() 357 358 th.Mux.HandleFunc("/servers/1234asdf/action", func(w http.ResponseWriter, r *http.Request) { 359 th.TestMethod(t, r, "POST") 360 th.TestHeader(t, r, "X-Auth-Token", client.TokenID) 361 th.TestJSONRequest(t, r, `{ "revertResize": null }`) 362 363 w.WriteHeader(http.StatusAccepted) 364 }) 365 366 res := servers.RevertResize(client.ServiceClient(), "1234asdf") 367 th.AssertNoErr(t, res.Err) 368 } 369 370 func TestGetMetadatum(t *testing.T) { 371 th.SetupHTTP() 372 defer th.TeardownHTTP() 373 374 HandleMetadatumGetSuccessfully(t) 375 376 expected := map[string]string{"foo": "bar"} 377 actual, err := servers.Metadatum(client.ServiceClient(), "1234asdf", "foo").Extract() 378 th.AssertNoErr(t, err) 379 th.AssertDeepEquals(t, expected, actual) 380 } 381 382 func TestCreateMetadatum(t *testing.T) { 383 th.SetupHTTP() 384 defer th.TeardownHTTP() 385 386 HandleMetadatumCreateSuccessfully(t) 387 388 expected := map[string]string{"foo": "bar"} 389 actual, err := servers.CreateMetadatum(client.ServiceClient(), "1234asdf", servers.MetadatumOpts{"foo": "bar"}).Extract() 390 th.AssertNoErr(t, err) 391 th.AssertDeepEquals(t, expected, actual) 392 } 393 394 func TestDeleteMetadatum(t *testing.T) { 395 th.SetupHTTP() 396 defer th.TeardownHTTP() 397 398 HandleMetadatumDeleteSuccessfully(t) 399 400 err := servers.DeleteMetadatum(client.ServiceClient(), "1234asdf", "foo").ExtractErr() 401 th.AssertNoErr(t, err) 402 } 403 404 func TestGetMetadata(t *testing.T) { 405 th.SetupHTTP() 406 defer th.TeardownHTTP() 407 408 HandleMetadataGetSuccessfully(t) 409 410 expected := map[string]string{"foo": "bar", "this": "that"} 411 actual, err := servers.Metadata(client.ServiceClient(), "1234asdf").Extract() 412 th.AssertNoErr(t, err) 413 th.AssertDeepEquals(t, expected, actual) 414 } 415 416 func TestResetMetadata(t *testing.T) { 417 th.SetupHTTP() 418 defer th.TeardownHTTP() 419 420 HandleMetadataResetSuccessfully(t) 421 422 expected := map[string]string{"foo": "bar", "this": "that"} 423 actual, err := servers.ResetMetadata(client.ServiceClient(), "1234asdf", servers.MetadataOpts{ 424 "foo": "bar", 425 "this": "that", 426 }).Extract() 427 th.AssertNoErr(t, err) 428 th.AssertDeepEquals(t, expected, actual) 429 } 430 431 func TestUpdateMetadata(t *testing.T) { 432 th.SetupHTTP() 433 defer th.TeardownHTTP() 434 435 HandleMetadataUpdateSuccessfully(t) 436 437 expected := map[string]string{"foo": "baz", "this": "those"} 438 actual, err := servers.UpdateMetadata(client.ServiceClient(), "1234asdf", servers.MetadataOpts{ 439 "foo": "baz", 440 "this": "those", 441 }).Extract() 442 th.AssertNoErr(t, err) 443 th.AssertDeepEquals(t, expected, actual) 444 } 445 446 func TestListAddresses(t *testing.T) { 447 th.SetupHTTP() 448 defer th.TeardownHTTP() 449 HandleAddressListSuccessfully(t) 450 451 expected := ListAddressesExpected 452 pages := 0 453 err := servers.ListAddresses(client.ServiceClient(), "asdfasdfasdf").EachPage(func(page pagination.Page) (bool, error) { 454 pages++ 455 456 actual, err := servers.ExtractAddresses(page) 457 th.AssertNoErr(t, err) 458 459 if len(actual) != 2 { 460 t.Fatalf("Expected 2 networks, got %d", len(actual)) 461 } 462 th.CheckDeepEquals(t, expected, actual) 463 464 return true, nil 465 }) 466 th.AssertNoErr(t, err) 467 th.CheckEquals(t, 1, pages) 468 } 469 470 func TestListAddressesByNetwork(t *testing.T) { 471 th.SetupHTTP() 472 defer th.TeardownHTTP() 473 HandleNetworkAddressListSuccessfully(t) 474 475 expected := ListNetworkAddressesExpected 476 pages := 0 477 err := servers.ListAddressesByNetwork(client.ServiceClient(), "asdfasdfasdf", "public").EachPage(func(page pagination.Page) (bool, error) { 478 pages++ 479 480 actual, err := servers.ExtractNetworkAddresses(page) 481 th.AssertNoErr(t, err) 482 483 if len(actual) != 2 { 484 t.Fatalf("Expected 2 addresses, got %d", len(actual)) 485 } 486 th.CheckDeepEquals(t, expected, actual) 487 488 return true, nil 489 }) 490 th.AssertNoErr(t, err) 491 th.CheckEquals(t, 1, pages) 492 } 493 494 func TestCreateServerImage(t *testing.T) { 495 th.SetupHTTP() 496 defer th.TeardownHTTP() 497 HandleCreateServerImageSuccessfully(t) 498 499 _, err := servers.CreateImage(client.ServiceClient(), "serverimage", servers.CreateImageOpts{Name: "test"}).ExtractImageID() 500 th.AssertNoErr(t, err) 501 } 502 503 func TestMarshalPersonality(t *testing.T) { 504 name := "/etc/test" 505 contents := []byte("asdfasdf") 506 507 personality := servers.Personality{ 508 &servers.File{ 509 Path: name, 510 Contents: contents, 511 }, 512 } 513 514 data, err := json.Marshal(personality) 515 if err != nil { 516 t.Fatal(err) 517 } 518 519 var actual []map[string]string 520 err = json.Unmarshal(data, &actual) 521 if err != nil { 522 t.Fatal(err) 523 } 524 525 if len(actual) != 1 { 526 t.Fatal("expected personality length 1") 527 } 528 529 if actual[0]["path"] != name { 530 t.Fatal("file path incorrect") 531 } 532 533 if actual[0]["contents"] != base64.StdEncoding.EncodeToString(contents) { 534 t.Fatal("file contents incorrect") 535 } 536 }