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  }