github.com/vnpaycloud-console/gophercloud/v2@v2.0.5/internal/acceptance/openstack/compute/v2/servers_test.go (about)

     1  //go:build acceptance || compute || servers
     2  
     3  package v2
     4  
     5  import (
     6  	"context"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/vnpaycloud-console/gophercloud/v2"
    11  	"github.com/vnpaycloud-console/gophercloud/v2/internal/acceptance/clients"
    12  	networks "github.com/vnpaycloud-console/gophercloud/v2/internal/acceptance/openstack/networking/v2"
    13  	"github.com/vnpaycloud-console/gophercloud/v2/internal/acceptance/tools"
    14  	"github.com/vnpaycloud-console/gophercloud/v2/openstack/compute/v2/attachinterfaces"
    15  	"github.com/vnpaycloud-console/gophercloud/v2/openstack/compute/v2/servers"
    16  	"github.com/vnpaycloud-console/gophercloud/v2/openstack/compute/v2/tags"
    17  	th "github.com/vnpaycloud-console/gophercloud/v2/testhelper"
    18  )
    19  
    20  func TestServersCreateDestroy(t *testing.T) {
    21  	clients.RequireLong(t)
    22  
    23  	client, err := clients.NewComputeV2Client()
    24  	th.AssertNoErr(t, err)
    25  
    26  	choices, err := clients.AcceptanceTestChoicesFromEnv()
    27  	th.AssertNoErr(t, err)
    28  
    29  	server, err := CreateServer(t, client)
    30  	th.AssertNoErr(t, err)
    31  	defer DeleteServer(t, client, server)
    32  
    33  	allPages, err := servers.List(client, servers.ListOpts{}).AllPages(context.TODO())
    34  	th.AssertNoErr(t, err)
    35  
    36  	allServers, err := servers.ExtractServers(allPages)
    37  	th.AssertNoErr(t, err)
    38  
    39  	var found bool
    40  	for _, s := range allServers {
    41  		tools.PrintResource(t, server)
    42  
    43  		if s.ID == server.ID {
    44  			found = true
    45  		}
    46  	}
    47  
    48  	th.AssertEquals(t, true, found)
    49  
    50  	allAddressPages, err := servers.ListAddresses(client, server.ID).AllPages(context.TODO())
    51  	th.AssertNoErr(t, err)
    52  
    53  	allAddresses, err := servers.ExtractAddresses(allAddressPages)
    54  	th.AssertNoErr(t, err)
    55  
    56  	for network, address := range allAddresses {
    57  		t.Logf("Addresses on %s: %+v", network, address)
    58  	}
    59  
    60  	allInterfacePages, err := attachinterfaces.List(client, server.ID).AllPages(context.TODO())
    61  	th.AssertNoErr(t, err)
    62  
    63  	allInterfaces, err := attachinterfaces.ExtractInterfaces(allInterfacePages)
    64  	th.AssertNoErr(t, err)
    65  
    66  	for _, iface := range allInterfaces {
    67  		t.Logf("Interfaces: %+v", iface)
    68  	}
    69  
    70  	allNetworkAddressPages, err := servers.ListAddressesByNetwork(client, server.ID, choices.NetworkName).AllPages(context.TODO())
    71  	th.AssertNoErr(t, err)
    72  
    73  	allNetworkAddresses, err := servers.ExtractNetworkAddresses(allNetworkAddressPages)
    74  	th.AssertNoErr(t, err)
    75  
    76  	t.Logf("Addresses on %s:", choices.NetworkName)
    77  	for _, address := range allNetworkAddresses {
    78  		t.Logf("%+v", address)
    79  	}
    80  }
    81  
    82  func TestServersWithExtensionsCreateDestroy(t *testing.T) {
    83  	clients.RequireLong(t)
    84  
    85  	client, err := clients.NewComputeV2Client()
    86  	th.AssertNoErr(t, err)
    87  
    88  	server, err := CreateServer(t, client)
    89  	th.AssertNoErr(t, err)
    90  	defer DeleteServer(t, client, server)
    91  
    92  	created, err := servers.Get(context.TODO(), client, server.ID).Extract()
    93  	th.AssertNoErr(t, err)
    94  	tools.PrintResource(t, created)
    95  
    96  	th.AssertEquals(t, "nova", created.AvailabilityZone)
    97  	th.AssertEquals(t, servers.RUNNING, int(created.PowerState))
    98  	th.AssertEquals(t, "", created.TaskState)
    99  	th.AssertEquals(t, "active", created.VmState)
   100  	th.AssertEquals(t, false, created.LaunchedAt.IsZero())
   101  	th.AssertEquals(t, true, created.TerminatedAt.IsZero())
   102  }
   103  
   104  func TestServersWithoutImageRef(t *testing.T) {
   105  	client, err := clients.NewComputeV2Client()
   106  	th.AssertNoErr(t, err)
   107  
   108  	server, err := CreateServerWithoutImageRef(t, client)
   109  	if err != nil {
   110  		if err400, ok := err.(*gophercloud.ErrUnexpectedResponseCode); ok {
   111  			if !strings.Contains(string(err400.Body), "Missing imageRef attribute") {
   112  				defer DeleteServer(t, client, server)
   113  			}
   114  		}
   115  	}
   116  }
   117  
   118  func TestServersUpdate(t *testing.T) {
   119  	clients.RequireLong(t)
   120  
   121  	client, err := clients.NewComputeV2Client()
   122  	th.AssertNoErr(t, err)
   123  
   124  	server, err := CreateServer(t, client)
   125  	th.AssertNoErr(t, err)
   126  	defer DeleteServer(t, client, server)
   127  
   128  	alternateName := tools.RandomString("ACPTTEST", 16)
   129  	for alternateName == server.Name {
   130  		alternateName = tools.RandomString("ACPTTEST", 16)
   131  	}
   132  
   133  	t.Logf("Attempting to rename the server to %s.", alternateName)
   134  
   135  	updateOpts := servers.UpdateOpts{
   136  		Name: alternateName,
   137  	}
   138  
   139  	updated, err := servers.Update(context.TODO(), client, server.ID, updateOpts).Extract()
   140  	th.AssertNoErr(t, err)
   141  
   142  	th.AssertEquals(t, server.ID, updated.ID)
   143  
   144  	err = tools.WaitFor(func(ctx context.Context) (bool, error) {
   145  		latest, err := servers.Get(ctx, client, updated.ID).Extract()
   146  		if err != nil {
   147  			return false, err
   148  		}
   149  
   150  		return latest.Name == alternateName, nil
   151  	})
   152  	th.AssertNoErr(t, err)
   153  }
   154  
   155  func TestServersMetadata(t *testing.T) {
   156  	clients.RequireLong(t)
   157  
   158  	client, err := clients.NewComputeV2Client()
   159  	th.AssertNoErr(t, err)
   160  
   161  	server, err := CreateServer(t, client)
   162  	th.AssertNoErr(t, err)
   163  	defer DeleteServer(t, client, server)
   164  
   165  	tools.PrintResource(t, server)
   166  
   167  	metadata, err := servers.UpdateMetadata(context.TODO(), client, server.ID, servers.MetadataOpts{
   168  		"foo":  "bar",
   169  		"this": "that",
   170  	}).Extract()
   171  	th.AssertNoErr(t, err)
   172  	t.Logf("UpdateMetadata result: %+v\n", metadata)
   173  
   174  	server, err = servers.Get(context.TODO(), client, server.ID).Extract()
   175  	th.AssertNoErr(t, err)
   176  
   177  	tools.PrintResource(t, server)
   178  
   179  	expectedMetadata := map[string]string{
   180  		"abc":  "def",
   181  		"foo":  "bar",
   182  		"this": "that",
   183  	}
   184  	th.AssertDeepEquals(t, expectedMetadata, server.Metadata)
   185  
   186  	err = servers.DeleteMetadatum(context.TODO(), client, server.ID, "foo").ExtractErr()
   187  	th.AssertNoErr(t, err)
   188  
   189  	server, err = servers.Get(context.TODO(), client, server.ID).Extract()
   190  	th.AssertNoErr(t, err)
   191  
   192  	tools.PrintResource(t, server)
   193  
   194  	expectedMetadata = map[string]string{
   195  		"abc":  "def",
   196  		"this": "that",
   197  	}
   198  	th.AssertDeepEquals(t, expectedMetadata, server.Metadata)
   199  
   200  	metadata, err = servers.CreateMetadatum(context.TODO(), client, server.ID, servers.MetadatumOpts{
   201  		"foo": "baz",
   202  	}).Extract()
   203  	th.AssertNoErr(t, err)
   204  	t.Logf("CreateMetadatum result: %+v\n", metadata)
   205  
   206  	server, err = servers.Get(context.TODO(), client, server.ID).Extract()
   207  	th.AssertNoErr(t, err)
   208  
   209  	tools.PrintResource(t, server)
   210  
   211  	expectedMetadata = map[string]string{
   212  		"abc":  "def",
   213  		"this": "that",
   214  		"foo":  "baz",
   215  	}
   216  	th.AssertDeepEquals(t, expectedMetadata, server.Metadata)
   217  
   218  	metadata, err = servers.Metadatum(context.TODO(), client, server.ID, "foo").Extract()
   219  	th.AssertNoErr(t, err)
   220  	t.Logf("Metadatum result: %+v\n", metadata)
   221  	th.AssertEquals(t, "baz", metadata["foo"])
   222  
   223  	metadata, err = servers.Metadata(context.TODO(), client, server.ID).Extract()
   224  	th.AssertNoErr(t, err)
   225  	t.Logf("Metadata result: %+v\n", metadata)
   226  
   227  	th.AssertDeepEquals(t, expectedMetadata, metadata)
   228  
   229  	metadata, err = servers.ResetMetadata(context.TODO(), client, server.ID, servers.MetadataOpts{}).Extract()
   230  	th.AssertNoErr(t, err)
   231  	t.Logf("ResetMetadata result: %+v\n", metadata)
   232  	th.AssertDeepEquals(t, map[string]string{}, metadata)
   233  }
   234  
   235  func TestServersActionChangeAdminPassword(t *testing.T) {
   236  	clients.RequireLong(t)
   237  	clients.RequireGuestAgent(t)
   238  
   239  	client, err := clients.NewComputeV2Client()
   240  	th.AssertNoErr(t, err)
   241  
   242  	server, err := CreateServer(t, client)
   243  	th.AssertNoErr(t, err)
   244  	defer DeleteServer(t, client, server)
   245  
   246  	randomPassword := tools.MakeNewPassword(server.AdminPass)
   247  	res := servers.ChangeAdminPassword(context.TODO(), client, server.ID, randomPassword)
   248  	th.AssertNoErr(t, res.Err)
   249  
   250  	if err = WaitForComputeStatus(client, server, "PASSWORD"); err != nil {
   251  		t.Fatal(err)
   252  	}
   253  
   254  	if err = WaitForComputeStatus(client, server, "ACTIVE"); err != nil {
   255  		t.Fatal(err)
   256  	}
   257  }
   258  
   259  func TestServersActionReboot(t *testing.T) {
   260  	clients.RequireLong(t)
   261  
   262  	client, err := clients.NewComputeV2Client()
   263  	th.AssertNoErr(t, err)
   264  
   265  	server, err := CreateServer(t, client)
   266  	th.AssertNoErr(t, err)
   267  	defer DeleteServer(t, client, server)
   268  
   269  	rebootOpts := servers.RebootOpts{
   270  		Type: servers.SoftReboot,
   271  	}
   272  
   273  	t.Logf("Attempting reboot of server %s", server.ID)
   274  	res := servers.Reboot(context.TODO(), client, server.ID, rebootOpts)
   275  	th.AssertNoErr(t, res.Err)
   276  
   277  	if err = WaitForComputeStatus(client, server, "REBOOT"); err != nil {
   278  		t.Fatal(err)
   279  	}
   280  
   281  	if err = WaitForComputeStatus(client, server, "ACTIVE"); err != nil {
   282  		t.Fatal(err)
   283  	}
   284  }
   285  
   286  func TestServersActionRebuild(t *testing.T) {
   287  	clients.RequireLong(t)
   288  
   289  	client, err := clients.NewComputeV2Client()
   290  	th.AssertNoErr(t, err)
   291  
   292  	choices, err := clients.AcceptanceTestChoicesFromEnv()
   293  	th.AssertNoErr(t, err)
   294  
   295  	server, err := CreateServer(t, client)
   296  	th.AssertNoErr(t, err)
   297  	defer DeleteServer(t, client, server)
   298  
   299  	t.Logf("Attempting to rebuild server %s", server.ID)
   300  
   301  	rebuildOpts := servers.RebuildOpts{
   302  		Name:      tools.RandomString("ACPTTEST", 16),
   303  		AdminPass: tools.MakeNewPassword(server.AdminPass),
   304  		ImageRef:  choices.ImageID,
   305  	}
   306  
   307  	rebuilt, err := servers.Rebuild(context.TODO(), client, server.ID, rebuildOpts).Extract()
   308  	th.AssertNoErr(t, err)
   309  
   310  	th.AssertEquals(t, server.ID, rebuilt.ID)
   311  
   312  	if err = WaitForComputeStatus(client, rebuilt, "REBUILD"); err != nil {
   313  		t.Fatal(err)
   314  	}
   315  
   316  	if err = WaitForComputeStatus(client, rebuilt, "ACTIVE"); err != nil {
   317  		t.Fatal(err)
   318  	}
   319  }
   320  
   321  func TestServersActionResizeConfirm(t *testing.T) {
   322  	clients.RequireLong(t)
   323  
   324  	choices, err := clients.AcceptanceTestChoicesFromEnv()
   325  	th.AssertNoErr(t, err)
   326  
   327  	client, err := clients.NewComputeV2Client()
   328  	th.AssertNoErr(t, err)
   329  
   330  	server, err := CreateServer(t, client)
   331  	th.AssertNoErr(t, err)
   332  	defer DeleteServer(t, client, server)
   333  
   334  	t.Logf("Attempting to resize server %s", server.ID)
   335  	err = ResizeServer(t, client, server)
   336  	th.AssertNoErr(t, err)
   337  
   338  	t.Logf("Attempting to confirm resize for server %s", server.ID)
   339  	if res := servers.ConfirmResize(context.TODO(), client, server.ID); res.Err != nil {
   340  		t.Fatal(res.Err)
   341  	}
   342  
   343  	if err = WaitForComputeStatus(client, server, "ACTIVE"); err != nil {
   344  		t.Fatal(err)
   345  	}
   346  
   347  	server, err = servers.Get(context.TODO(), client, server.ID).Extract()
   348  	th.AssertNoErr(t, err)
   349  
   350  	th.AssertEquals(t, choices.FlavorIDResize, server.Flavor["id"])
   351  }
   352  
   353  func TestServersActionResizeRevert(t *testing.T) {
   354  	clients.RequireLong(t)
   355  
   356  	choices, err := clients.AcceptanceTestChoicesFromEnv()
   357  	th.AssertNoErr(t, err)
   358  
   359  	client, err := clients.NewComputeV2Client()
   360  	th.AssertNoErr(t, err)
   361  
   362  	server, err := CreateServer(t, client)
   363  	th.AssertNoErr(t, err)
   364  	defer DeleteServer(t, client, server)
   365  
   366  	t.Logf("Attempting to resize server %s", server.ID)
   367  	err = ResizeServer(t, client, server)
   368  	th.AssertNoErr(t, err)
   369  
   370  	t.Logf("Attempting to revert resize for server %s", server.ID)
   371  	if res := servers.RevertResize(context.TODO(), client, server.ID); res.Err != nil {
   372  		t.Fatal(res.Err)
   373  	}
   374  
   375  	if err = WaitForComputeStatus(client, server, "ACTIVE"); err != nil {
   376  		t.Fatal(err)
   377  	}
   378  
   379  	server, err = servers.Get(context.TODO(), client, server.ID).Extract()
   380  	th.AssertNoErr(t, err)
   381  
   382  	th.AssertEquals(t, choices.FlavorID, server.Flavor["id"])
   383  }
   384  
   385  func TestServersActionPause(t *testing.T) {
   386  	clients.RequireLong(t)
   387  
   388  	client, err := clients.NewComputeV2Client()
   389  	th.AssertNoErr(t, err)
   390  
   391  	server, err := CreateServer(t, client)
   392  	th.AssertNoErr(t, err)
   393  	defer DeleteServer(t, client, server)
   394  
   395  	t.Logf("Attempting to pause server %s", server.ID)
   396  	err = servers.Pause(context.TODO(), client, server.ID).ExtractErr()
   397  	th.AssertNoErr(t, err)
   398  
   399  	err = WaitForComputeStatus(client, server, "PAUSED")
   400  	th.AssertNoErr(t, err)
   401  
   402  	err = servers.Unpause(context.TODO(), client, server.ID).ExtractErr()
   403  	th.AssertNoErr(t, err)
   404  
   405  	err = WaitForComputeStatus(client, server, "ACTIVE")
   406  	th.AssertNoErr(t, err)
   407  }
   408  
   409  func TestServersActionSuspend(t *testing.T) {
   410  	clients.RequireLong(t)
   411  
   412  	client, err := clients.NewComputeV2Client()
   413  	th.AssertNoErr(t, err)
   414  
   415  	server, err := CreateServer(t, client)
   416  	th.AssertNoErr(t, err)
   417  	defer DeleteServer(t, client, server)
   418  
   419  	t.Logf("Attempting to suspend server %s", server.ID)
   420  	err = servers.Suspend(context.TODO(), client, server.ID).ExtractErr()
   421  	th.AssertNoErr(t, err)
   422  
   423  	err = WaitForComputeStatus(client, server, "SUSPENDED")
   424  	th.AssertNoErr(t, err)
   425  
   426  	err = servers.Resume(context.TODO(), client, server.ID).ExtractErr()
   427  	th.AssertNoErr(t, err)
   428  
   429  	err = WaitForComputeStatus(client, server, "ACTIVE")
   430  	th.AssertNoErr(t, err)
   431  }
   432  
   433  func TestServersActionLock(t *testing.T) {
   434  	clients.RequireLong(t)
   435  	clients.RequireNonAdmin(t)
   436  
   437  	client, err := clients.NewComputeV2Client()
   438  	th.AssertNoErr(t, err)
   439  
   440  	server, err := CreateServer(t, client)
   441  	th.AssertNoErr(t, err)
   442  	defer DeleteServer(t, client, server)
   443  
   444  	t.Logf("Attempting to Lock server %s", server.ID)
   445  	err = servers.Lock(context.TODO(), client, server.ID).ExtractErr()
   446  	th.AssertNoErr(t, err)
   447  
   448  	t.Logf("Attempting to delete locked server %s", server.ID)
   449  	err = servers.Delete(context.TODO(), client, server.ID).ExtractErr()
   450  	th.AssertEquals(t, true, err != nil)
   451  
   452  	t.Logf("Attempting to unlock server %s", server.ID)
   453  	err = servers.Unlock(context.TODO(), client, server.ID).ExtractErr()
   454  	th.AssertNoErr(t, err)
   455  
   456  	err = WaitForComputeStatus(client, server, "ACTIVE")
   457  	th.AssertNoErr(t, err)
   458  }
   459  
   460  func TestServersConsoleOutput(t *testing.T) {
   461  	clients.RequireLong(t)
   462  
   463  	client, err := clients.NewComputeV2Client()
   464  	th.AssertNoErr(t, err)
   465  
   466  	server, err := CreateServer(t, client)
   467  	th.AssertNoErr(t, err)
   468  	defer DeleteServer(t, client, server)
   469  
   470  	outputOpts := &servers.ShowConsoleOutputOpts{
   471  		Length: 4,
   472  	}
   473  	output, err := servers.ShowConsoleOutput(context.TODO(), client, server.ID, outputOpts).Extract()
   474  	th.AssertNoErr(t, err)
   475  
   476  	tools.PrintResource(t, output)
   477  }
   478  
   479  func TestServersTags(t *testing.T) {
   480  	clients.RequireLong(t)
   481  
   482  	choices, err := clients.AcceptanceTestChoicesFromEnv()
   483  	th.AssertNoErr(t, err)
   484  
   485  	client, err := clients.NewComputeV2Client()
   486  	th.AssertNoErr(t, err)
   487  	client.Microversion = "2.52"
   488  
   489  	networkClient, err := clients.NewNetworkV2Client()
   490  	th.AssertNoErr(t, err)
   491  
   492  	networkID, err := networks.IDFromName(networkClient, choices.NetworkName)
   493  	th.AssertNoErr(t, err)
   494  
   495  	// Create server with tags.
   496  	server, err := CreateServerWithTags(t, client, networkID)
   497  	th.AssertNoErr(t, err)
   498  	defer DeleteServer(t, client, server)
   499  
   500  	// All the following calls should work with "2.26" microversion.
   501  	client.Microversion = "2.26"
   502  
   503  	// Check server tags in body.
   504  	serverWithTags, err := servers.Get(context.TODO(), client, server.ID).Extract()
   505  	th.AssertNoErr(t, err)
   506  	th.AssertDeepEquals(t, []string{"tag1", "tag2"}, *serverWithTags.Tags)
   507  
   508  	// Check all tags.
   509  	allTags, err := tags.List(context.TODO(), client, server.ID).Extract()
   510  	th.AssertNoErr(t, err)
   511  	th.AssertDeepEquals(t, []string{"tag1", "tag2"}, allTags)
   512  
   513  	// Check single tag.
   514  	exists, err := tags.Check(context.TODO(), client, server.ID, "tag2").Extract()
   515  	th.AssertNoErr(t, err)
   516  	th.AssertEquals(t, true, exists)
   517  
   518  	// Add new tag.
   519  	newTags, err := tags.ReplaceAll(context.TODO(), client, server.ID, tags.ReplaceAllOpts{Tags: []string{"tag3", "tag4"}}).Extract()
   520  	th.AssertNoErr(t, err)
   521  	th.AssertDeepEquals(t, []string{"tag3", "tag4"}, newTags)
   522  
   523  	// Add new single tag.
   524  	err = tags.Add(context.TODO(), client, server.ID, "tag5").ExtractErr()
   525  	th.AssertNoErr(t, err)
   526  
   527  	// Check current tags.
   528  	newAllTags, err := tags.List(context.TODO(), client, server.ID).Extract()
   529  	th.AssertNoErr(t, err)
   530  	th.AssertDeepEquals(t, []string{"tag3", "tag4", "tag5"}, newAllTags)
   531  
   532  	// Remove single tag.
   533  	err = tags.Delete(context.TODO(), client, server.ID, "tag4").ExtractErr()
   534  	th.AssertNoErr(t, err)
   535  
   536  	// Check that tag doesn't exist anymore.
   537  	exists, err = tags.Check(context.TODO(), client, server.ID, "tag4").Extract()
   538  	th.AssertNoErr(t, err)
   539  	th.AssertEquals(t, false, exists)
   540  
   541  	// Remove all tags.
   542  	err = tags.DeleteAll(context.TODO(), client, server.ID).ExtractErr()
   543  	th.AssertNoErr(t, err)
   544  
   545  	// Check that there are no more tags.
   546  	currentTags, err := tags.List(context.TODO(), client, server.ID).Extract()
   547  	th.AssertNoErr(t, err)
   548  	th.AssertEquals(t, 0, len(currentTags))
   549  }
   550  
   551  func TestServersWithExtendedAttributesCreateDestroy(t *testing.T) {
   552  	clients.RequireLong(t)
   553  	clients.RequireAdmin(t)
   554  
   555  	client, err := clients.NewComputeV2Client()
   556  	th.AssertNoErr(t, err)
   557  	client.Microversion = "2.3"
   558  
   559  	server, err := CreateServer(t, client)
   560  	th.AssertNoErr(t, err)
   561  	defer DeleteServer(t, client, server)
   562  
   563  	created, err := servers.Get(context.TODO(), client, server.ID).Extract()
   564  	th.AssertNoErr(t, err)
   565  
   566  	t.Logf("Server With Extended Attributes: %#v", created)
   567  
   568  	th.AssertEquals(t, true, *created.ReservationID != "")
   569  	th.AssertEquals(t, 0, *created.LaunchIndex)
   570  	th.AssertEquals(t, true, *created.RAMDiskID == "")
   571  	th.AssertEquals(t, true, *created.KernelID == "")
   572  	th.AssertEquals(t, true, *created.Hostname != "")
   573  	th.AssertEquals(t, true, *created.RootDeviceName != "")
   574  	th.AssertEquals(t, true, created.Userdata == nil)
   575  }
   576  
   577  func TestServerNoNetworkCreateDestroy(t *testing.T) {
   578  	clients.RequireLong(t)
   579  
   580  	client, err := clients.NewComputeV2Client()
   581  	th.AssertNoErr(t, err)
   582  
   583  	choices, err := clients.AcceptanceTestChoicesFromEnv()
   584  	th.AssertNoErr(t, err)
   585  
   586  	client.Microversion = "2.37"
   587  
   588  	server, err := CreateServerNoNetwork(t, client)
   589  	th.AssertNoErr(t, err)
   590  	defer DeleteServer(t, client, server)
   591  
   592  	allPages, err := servers.List(client, servers.ListOpts{}).AllPages(context.TODO())
   593  	th.AssertNoErr(t, err)
   594  
   595  	allServers, err := servers.ExtractServers(allPages)
   596  	th.AssertNoErr(t, err)
   597  
   598  	var found bool
   599  	for _, s := range allServers {
   600  		tools.PrintResource(t, server)
   601  
   602  		if s.ID == server.ID {
   603  			found = true
   604  		}
   605  	}
   606  
   607  	th.AssertEquals(t, true, found)
   608  
   609  	allAddressPages, err := servers.ListAddresses(client, server.ID).AllPages(context.TODO())
   610  	th.AssertNoErr(t, err)
   611  
   612  	allAddresses, err := servers.ExtractAddresses(allAddressPages)
   613  	th.AssertNoErr(t, err)
   614  
   615  	for network, address := range allAddresses {
   616  		t.Logf("Addresses on %s: %+v", network, address)
   617  	}
   618  
   619  	allInterfacePages, err := attachinterfaces.List(client, server.ID).AllPages(context.TODO())
   620  	th.AssertNoErr(t, err)
   621  
   622  	allInterfaces, err := attachinterfaces.ExtractInterfaces(allInterfacePages)
   623  	th.AssertNoErr(t, err)
   624  
   625  	for _, iface := range allInterfaces {
   626  		t.Logf("Interfaces: %+v", iface)
   627  	}
   628  
   629  	_, err = servers.ListAddressesByNetwork(client, server.ID, choices.NetworkName).AllPages(context.TODO())
   630  	if err == nil {
   631  		t.Fatalf("Instance must not be a member of specified network")
   632  	}
   633  }