github.com/gophercloud/gophercloud@v1.11.0/internal/acceptance/openstack/sharedfilesystems/v2/shares_test.go (about)

     1  //go:build acceptance
     2  // +build acceptance
     3  
     4  package v2
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/gophercloud/gophercloud/internal/acceptance/clients"
    10  	"github.com/gophercloud/gophercloud/internal/acceptance/tools"
    11  	"github.com/gophercloud/gophercloud/openstack/sharedfilesystems/v2/shares"
    12  	th "github.com/gophercloud/gophercloud/testhelper"
    13  )
    14  
    15  func TestShareCreate(t *testing.T) {
    16  	client, err := clients.NewSharedFileSystemV2Client()
    17  	if err != nil {
    18  		t.Fatalf("Unable to create a shared file system client: %v", err)
    19  	}
    20  
    21  	share, err := CreateShare(t, client)
    22  	if err != nil {
    23  		t.Fatalf("Unable to create a share: %v", err)
    24  	}
    25  
    26  	defer DeleteShare(t, client, share)
    27  
    28  	created, err := shares.Get(client, share.ID).Extract()
    29  	if err != nil {
    30  		t.Errorf("Unable to retrieve share: %v", err)
    31  	}
    32  	tools.PrintResource(t, created)
    33  }
    34  
    35  func TestShareExportLocations(t *testing.T) {
    36  	client, err := clients.NewSharedFileSystemV2Client()
    37  	if err != nil {
    38  		t.Fatalf("Unable to create a shared file system client: %v", err)
    39  	}
    40  
    41  	share, err := CreateShare(t, client)
    42  	if err != nil {
    43  		t.Fatalf("Unable to create a share: %v", err)
    44  	}
    45  
    46  	defer DeleteShare(t, client, share)
    47  
    48  	_, err = waitForStatus(t, client, share.ID, "available")
    49  	if err != nil {
    50  		t.Fatalf("Share status error: %v", err)
    51  	}
    52  
    53  	client.Microversion = "2.9"
    54  
    55  	exportLocations, err := shares.ListExportLocations(client, share.ID).Extract()
    56  	if err != nil {
    57  		t.Errorf("Unable to list share export locations: %v", err)
    58  	}
    59  	tools.PrintResource(t, exportLocations)
    60  
    61  	exportLocation, err := shares.GetExportLocation(client, share.ID, exportLocations[0].ID).Extract()
    62  	if err != nil {
    63  		t.Errorf("Unable to get share export location: %v", err)
    64  	}
    65  	tools.PrintResource(t, exportLocation)
    66  	th.AssertEquals(t, exportLocations[0], *exportLocation)
    67  }
    68  
    69  func TestShareUpdate(t *testing.T) {
    70  	client, err := clients.NewSharedFileSystemV2Client()
    71  	if err != nil {
    72  		t.Fatalf("Unable to create shared file system client: %v", err)
    73  	}
    74  
    75  	share, err := CreateShare(t, client)
    76  	if err != nil {
    77  		t.Fatalf("Unable to create share: %v", err)
    78  	}
    79  
    80  	defer DeleteShare(t, client, share)
    81  
    82  	expectedShare, err := shares.Get(client, share.ID).Extract()
    83  	if err != nil {
    84  		t.Errorf("Unable to retrieve share: %v", err)
    85  	}
    86  
    87  	name := "NewName"
    88  	description := ""
    89  	iFalse := false
    90  	options := shares.UpdateOpts{
    91  		DisplayName:        &name,
    92  		DisplayDescription: &description,
    93  		IsPublic:           &iFalse,
    94  	}
    95  
    96  	expectedShare.Name = name
    97  	expectedShare.Description = description
    98  	expectedShare.IsPublic = iFalse
    99  
   100  	_, err = shares.Update(client, share.ID, options).Extract()
   101  	if err != nil {
   102  		t.Errorf("Unable to update share: %v", err)
   103  	}
   104  
   105  	updatedShare, err := shares.Get(client, share.ID).Extract()
   106  	if err != nil {
   107  		t.Errorf("Unable to retrieve share: %v", err)
   108  	}
   109  
   110  	// Update time has to be set in order to get the assert equal to pass
   111  	expectedShare.UpdatedAt = updatedShare.UpdatedAt
   112  
   113  	tools.PrintResource(t, share)
   114  
   115  	th.CheckDeepEquals(t, expectedShare, updatedShare)
   116  }
   117  
   118  func TestShareListDetail(t *testing.T) {
   119  	client, err := clients.NewSharedFileSystemV2Client()
   120  	if err != nil {
   121  		t.Fatalf("Unable to create a shared file system client: %v", err)
   122  	}
   123  
   124  	share, err := CreateShare(t, client)
   125  	if err != nil {
   126  		t.Fatalf("Unable to create a share: %v", err)
   127  	}
   128  
   129  	defer DeleteShare(t, client, share)
   130  
   131  	ss, err := ListShares(t, client)
   132  	if err != nil {
   133  		t.Fatalf("Unable to list shares: %v", err)
   134  	}
   135  
   136  	for i := range ss {
   137  		tools.PrintResource(t, &ss[i])
   138  	}
   139  }
   140  
   141  func TestGrantAndRevokeAccess(t *testing.T) {
   142  	client, err := clients.NewSharedFileSystemV2Client()
   143  	if err != nil {
   144  		t.Fatalf("Unable to create a shared file system client: %v", err)
   145  	}
   146  	client.Microversion = "2.49"
   147  
   148  	share, err := CreateShare(t, client)
   149  	if err != nil {
   150  		t.Fatalf("Unable to create a share: %v", err)
   151  	}
   152  
   153  	defer DeleteShare(t, client, share)
   154  
   155  	accessRight, err := GrantAccess(t, client, share)
   156  	if err != nil {
   157  		t.Fatalf("Unable to grant access: %v", err)
   158  	}
   159  
   160  	tools.PrintResource(t, accessRight)
   161  
   162  	if err = RevokeAccess(t, client, share, accessRight); err != nil {
   163  		t.Fatalf("Unable to revoke access: %v", err)
   164  	}
   165  }
   166  
   167  func TestListAccessRights(t *testing.T) {
   168  	client, err := clients.NewSharedFileSystemV2Client()
   169  	if err != nil {
   170  		t.Fatalf("Unable to create a shared file system client: %v", err)
   171  	}
   172  	client.Microversion = "2.7"
   173  
   174  	share, err := CreateShare(t, client)
   175  	if err != nil {
   176  		t.Fatalf("Unable to create a share: %v", err)
   177  	}
   178  
   179  	defer DeleteShare(t, client, share)
   180  
   181  	_, err = GrantAccess(t, client, share)
   182  	if err != nil {
   183  		t.Fatalf("Unable to grant access: %v", err)
   184  	}
   185  
   186  	rs, err := GetAccessRightsSlice(t, client, share)
   187  	if err != nil {
   188  		t.Fatalf("Unable to retrieve list of access rules for share %s: %v", share.ID, err)
   189  	}
   190  
   191  	if len(rs) != 1 {
   192  		t.Fatalf("Unexpected number of access rules for share %s: got %d, expected 1", share.ID, len(rs))
   193  	}
   194  
   195  	t.Logf("Share %s has %d access rule(s):", share.ID, len(rs))
   196  
   197  	for _, r := range rs {
   198  		tools.PrintResource(t, &r)
   199  	}
   200  }
   201  
   202  func TestExtendAndShrink(t *testing.T) {
   203  	client, err := clients.NewSharedFileSystemV2Client()
   204  	if err != nil {
   205  		t.Fatalf("Unable to create a shared file system client: %v", err)
   206  	}
   207  	client.Microversion = "2.7"
   208  
   209  	share, err := CreateShare(t, client)
   210  	if err != nil {
   211  		t.Fatalf("Unable to create a share: %v", err)
   212  	}
   213  
   214  	defer DeleteShare(t, client, share)
   215  
   216  	err = ExtendShare(t, client, share, 2)
   217  	if err != nil {
   218  		t.Fatalf("Unable to extend a share: %v", err)
   219  	}
   220  
   221  	// We need to wait till the Extend operation is done
   222  	_, err = waitForStatus(t, client, share.ID, "available")
   223  	if err != nil {
   224  		t.Fatalf("Share status error: %v", err)
   225  	}
   226  
   227  	t.Logf("Share %s successfuly extended", share.ID)
   228  
   229  	/* disable shrinking for the LVM dhss=false
   230  	err = ShrinkShare(t, client, share, 1)
   231  	if err != nil {
   232  		t.Fatalf("Unable to shrink a share: %v", err)
   233  	}
   234  
   235  	// We need to wait till the Shrink operation is done
   236  	_, err = waitForStatus(t, client, share.ID, "available")
   237  	if err != nil {
   238  		t.Fatalf("Share status error: %v", err)
   239  	}
   240  
   241  	t.Logf("Share %s successfuly shrunk", share.ID)
   242  	*/
   243  }
   244  
   245  func TestShareMetadata(t *testing.T) {
   246  	client, err := clients.NewSharedFileSystemV2Client()
   247  	if err != nil {
   248  		t.Fatalf("Unable to create a shared file system client: %v", err)
   249  	}
   250  	client.Microversion = "2.7"
   251  
   252  	share, err := CreateShare(t, client)
   253  	if err != nil {
   254  		t.Fatalf("Unable to create a share: %v", err)
   255  	}
   256  
   257  	defer DeleteShare(t, client, share)
   258  
   259  	const (
   260  		k  = "key"
   261  		v1 = "value1"
   262  		v2 = "value2"
   263  	)
   264  
   265  	checkMetadataEq := func(m map[string]string, value string) {
   266  		if m == nil || len(m) != 1 || m[k] != value {
   267  			t.Fatalf("Unexpected metadata contents %v", m)
   268  		}
   269  	}
   270  
   271  	metadata, err := shares.SetMetadata(client, share.ID, shares.SetMetadataOpts{Metadata: map[string]string{k: v1}}).Extract()
   272  	if err != nil {
   273  		t.Fatalf("Unable to set share metadata: %v", err)
   274  	}
   275  	checkMetadataEq(metadata, v1)
   276  
   277  	metadata, err = shares.UpdateMetadata(client, share.ID, shares.UpdateMetadataOpts{Metadata: map[string]string{k: v2}}).Extract()
   278  	if err != nil {
   279  		t.Fatalf("Unable to update share metadata: %v", err)
   280  	}
   281  	checkMetadataEq(metadata, v2)
   282  
   283  	metadata, err = shares.GetMetadatum(client, share.ID, k).Extract()
   284  	if err != nil {
   285  		t.Fatalf("Unable to get share metadatum: %v", err)
   286  	}
   287  	checkMetadataEq(metadata, v2)
   288  
   289  	err = shares.DeleteMetadatum(client, share.ID, k).ExtractErr()
   290  	if err != nil {
   291  		t.Fatalf("Unable to delete share metadatum: %v", err)
   292  	}
   293  
   294  	metadata, err = shares.GetMetadata(client, share.ID).Extract()
   295  	if err != nil {
   296  		t.Fatalf("Unable to get share metadata: %v", err)
   297  	}
   298  
   299  	if metadata == nil || len(metadata) != 0 {
   300  		t.Fatalf("Unexpected metadata contents %v, expected an empty map", metadata)
   301  	}
   302  }
   303  
   304  func TestRevert(t *testing.T) {
   305  	client, err := clients.NewSharedFileSystemV2Client()
   306  	if err != nil {
   307  		t.Fatalf("Unable to create a shared file system client: %v", err)
   308  	}
   309  	client.Microversion = "2.27"
   310  
   311  	share, err := CreateShare(t, client)
   312  	if err != nil {
   313  		t.Fatalf("Unable to create a share: %v", err)
   314  	}
   315  
   316  	defer DeleteShare(t, client, share)
   317  
   318  	_, err = waitForStatus(t, client, share.ID, "available")
   319  	if err != nil {
   320  		t.Fatalf("Share status error: %v", err)
   321  	}
   322  
   323  	snapshot, err := CreateSnapshot(t, client, share.ID)
   324  	if err != nil {
   325  		t.Fatalf("Unable to create a snapshot: %v", err)
   326  	}
   327  	defer DeleteSnapshot(t, client, snapshot)
   328  
   329  	err = waitForSnapshotStatus(t, client, snapshot.ID, "available")
   330  	if err != nil {
   331  		t.Fatalf("Snapshot status error: %v", err)
   332  	}
   333  
   334  	revertOpts := &shares.RevertOpts{
   335  		SnapshotID: snapshot.ID,
   336  	}
   337  	err = shares.Revert(client, share.ID, revertOpts).ExtractErr()
   338  	if err != nil {
   339  		t.Fatalf("Unable to revert a snapshot: %v", err)
   340  	}
   341  
   342  	// We need to wait till the Extend operation is done
   343  	_, err = waitForStatus(t, client, share.ID, "available")
   344  	if err != nil {
   345  		t.Fatalf("Share status error: %v", err)
   346  	}
   347  
   348  	err = waitForSnapshotStatus(t, client, snapshot.ID, "available")
   349  	if err != nil {
   350  		t.Fatalf("Snapshot status error: %v", err)
   351  	}
   352  
   353  	t.Logf("Share %s successfuly reverted", share.ID)
   354  }
   355  
   356  func TestShareRestoreFromSnapshot(t *testing.T) {
   357  	client, err := clients.NewSharedFileSystemV2Client()
   358  	if err != nil {
   359  		t.Fatalf("Unable to create a shared file system client: %v", err)
   360  	}
   361  	client.Microversion = "2.27"
   362  
   363  	shareType := "default"
   364  	share, err := CreateShare(t, client, shareType)
   365  	if err != nil {
   366  		t.Fatalf("Unable to create a share: %v", err)
   367  	}
   368  
   369  	defer DeleteShare(t, client, share)
   370  
   371  	_, err = waitForStatus(t, client, share.ID, "available")
   372  	if err != nil {
   373  		t.Fatalf("Share status error: %v", err)
   374  	}
   375  
   376  	snapshot, err := CreateSnapshot(t, client, share.ID)
   377  	if err != nil {
   378  		t.Fatalf("Unable to create a snapshot: %v", err)
   379  	}
   380  	defer DeleteSnapshot(t, client, snapshot)
   381  
   382  	err = waitForSnapshotStatus(t, client, snapshot.ID, "available")
   383  	if err != nil {
   384  		t.Fatalf("Snapshot status error: %v", err)
   385  	}
   386  
   387  	// create a bigger share from a snapshot
   388  	iTrue := true
   389  	newSize := share.Size + 1
   390  	createOpts := shares.CreateOpts{
   391  		Size:        newSize,
   392  		Name:        "My Test Share",
   393  		Description: "My Test Description",
   394  		ShareProto:  "NFS",
   395  		ShareType:   shareType,
   396  		SnapshotID:  snapshot.ID,
   397  		IsPublic:    &iTrue,
   398  	}
   399  	restored, err := shares.Create(client, createOpts).Extract()
   400  	if err != nil {
   401  		t.Fatalf("Unable to create a share from a snapshot: %v", err)
   402  	}
   403  	defer DeleteShare(t, client, restored)
   404  
   405  	if restored.Size != newSize {
   406  		t.Fatalf("Unexpected restored share size: %d", restored.Size)
   407  	}
   408  
   409  	// We need to wait till the Extend operation is done
   410  	checkShare, err := waitForStatus(t, client, restored.ID, "available")
   411  	if err != nil {
   412  		t.Fatalf("Share status error: %v", err)
   413  	}
   414  
   415  	t.Logf("Share %s has been successfully restored: %+#v", checkShare.ID, checkShare)
   416  
   417  	err = waitForSnapshotStatus(t, client, snapshot.ID, "available")
   418  	if err != nil {
   419  		t.Fatalf("Snapshot status error: %v", err)
   420  	}
   421  }
   422  
   423  func TestResetStatus(t *testing.T) {
   424  	client, err := clients.NewSharedFileSystemV2Client()
   425  	if err != nil {
   426  		t.Fatalf("Unable to create a shared file system client: %v", err)
   427  	}
   428  	client.Microversion = "2.7"
   429  
   430  	share, err := CreateShare(t, client)
   431  	if err != nil {
   432  		t.Fatalf("Unable to create a share: %v", err)
   433  	}
   434  
   435  	defer DeleteShare(t, client, share)
   436  
   437  	_, err = waitForStatus(t, client, share.ID, "available")
   438  	if err != nil {
   439  		t.Fatalf("Share status error: %v", err)
   440  	}
   441  
   442  	resetStatusOpts := &shares.ResetStatusOpts{
   443  		Status: "error",
   444  	}
   445  	err = shares.ResetStatus(client, share.ID, resetStatusOpts).ExtractErr()
   446  	if err != nil {
   447  		t.Fatalf("Unable to reset a share status: %v", err)
   448  	}
   449  
   450  	// We need to wait till the Extend operation is done
   451  	_, err = waitForStatus(t, client, share.ID, "error")
   452  	if err != nil {
   453  		t.Fatalf("Share status error: %v", err)
   454  	}
   455  
   456  	t.Logf("Share %s status successfuly reset", share.ID)
   457  }
   458  
   459  func TestForceDelete(t *testing.T) {
   460  	client, err := clients.NewSharedFileSystemV2Client()
   461  	if err != nil {
   462  		t.Fatalf("Unable to create a shared file system client: %v", err)
   463  	}
   464  	client.Microversion = "2.7"
   465  
   466  	share, err := CreateShare(t, client)
   467  	if err != nil {
   468  		t.Fatalf("Unable to create a share: %v", err)
   469  	}
   470  
   471  	defer DeleteShare(t, client, share)
   472  
   473  	_, err = waitForStatus(t, client, share.ID, "available")
   474  	if err != nil {
   475  		t.Fatalf("Share status error: %v", err)
   476  	}
   477  
   478  	err = shares.ForceDelete(client, share.ID).ExtractErr()
   479  	if err != nil {
   480  		t.Fatalf("Unable to force delete a share: %v", err)
   481  	}
   482  
   483  	_, err = waitForStatus(t, client, share.ID, "deleted")
   484  	if err != nil {
   485  		t.Fatalf("Share status error: %v", err)
   486  	}
   487  
   488  	t.Logf("Share %s was successfuly deleted", share.ID)
   489  }
   490  
   491  func TestUnmanage(t *testing.T) {
   492  	clients.RequireAdmin(t)
   493  
   494  	client, err := clients.NewSharedFileSystemV2Client()
   495  	if err != nil {
   496  		t.Fatalf("Unable to create a shared file system client: %v", err)
   497  	}
   498  	client.Microversion = "2.7"
   499  
   500  	share, err := CreateShare(t, client)
   501  	if err != nil {
   502  		t.Fatalf("Unable to create a share: %v", err)
   503  	}
   504  
   505  	defer DeleteShare(t, client, share)
   506  
   507  	_, err = waitForStatus(t, client, share.ID, "available")
   508  	if err != nil {
   509  		t.Fatalf("Share status error: %v", err)
   510  	}
   511  
   512  	err = shares.Unmanage(client, share.ID).ExtractErr()
   513  	if err != nil {
   514  		t.Fatalf("Unable to unmanage a share: %v", err)
   515  	}
   516  
   517  	_, err = waitForStatus(t, client, share.ID, "deleted")
   518  	if err != nil {
   519  		t.Fatalf("Share status error: %v", err)
   520  	}
   521  
   522  	t.Logf("Share %s was successfuly unmanaged", share.ID)
   523  }