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

     1  //go:build acceptance
     2  // +build acceptance
     3  
     4  package v2
     5  
     6  import (
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/gophercloud/gophercloud/internal/acceptance/clients"
    11  	"github.com/gophercloud/gophercloud/internal/acceptance/tools"
    12  	"github.com/gophercloud/gophercloud/openstack/sharedfilesystems/v2/replicas"
    13  	th "github.com/gophercloud/gophercloud/testhelper"
    14  )
    15  
    16  // 2.56 is required for a /v2/replicas/XXX URL support
    17  // otherwise we need to set "X-OpenStack-Manila-API-Experimental: true"
    18  const replicasPathMicroversion = "2.56"
    19  
    20  func TestReplicaCreate(t *testing.T) {
    21  	clients.RequireManilaReplicas(t)
    22  
    23  	client, err := clients.NewSharedFileSystemV2Client()
    24  	if err != nil {
    25  		t.Fatalf("Unable to create a shared file system client: %v", err)
    26  	}
    27  	client.Microversion = replicasPathMicroversion
    28  
    29  	share, err := CreateShare(t, client)
    30  	if err != nil {
    31  		t.Fatalf("Unable to create a share: %v", err)
    32  	}
    33  
    34  	defer DeleteShare(t, client, share)
    35  
    36  	replica, err := CreateReplica(t, client, share)
    37  	if err != nil {
    38  		t.Fatalf("Unable to create a replica: %v", err)
    39  	}
    40  
    41  	defer DeleteReplica(t, client, replica)
    42  
    43  	created, err := replicas.Get(client, replica.ID).Extract()
    44  	if err != nil {
    45  		t.Errorf("Unable to retrieve replica: %v", err)
    46  	}
    47  	tools.PrintResource(t, created)
    48  
    49  	allReplicas, err := ListShareReplicas(t, client, share.ID)
    50  	th.AssertNoErr(t, err)
    51  
    52  	if len(allReplicas) != 2 {
    53  		t.Errorf("Unable to list all two replicas")
    54  	}
    55  }
    56  
    57  func TestReplicaPromote(t *testing.T) {
    58  	clients.RequireManilaReplicas(t)
    59  
    60  	client, err := clients.NewSharedFileSystemV2Client()
    61  	if err != nil {
    62  		t.Fatalf("Unable to create a shared file system client: %v", err)
    63  	}
    64  	client.Microversion = replicasPathMicroversion
    65  
    66  	share, err := CreateShare(t, client)
    67  	if err != nil {
    68  		t.Fatalf("Unable to create a share: %v", err)
    69  	}
    70  
    71  	defer DeleteShare(t, client, share)
    72  
    73  	replica, err := CreateReplica(t, client, share)
    74  	if err != nil {
    75  		t.Fatalf("Unable to create a replica: %v", err)
    76  	}
    77  
    78  	defer DeleteReplica(t, client, replica)
    79  
    80  	created, err := replicas.Get(client, replica.ID).Extract()
    81  	if err != nil {
    82  		t.Fatalf("Unable to retrieve replica: %v", err)
    83  	}
    84  	tools.PrintResource(t, created)
    85  
    86  	// sync new replica
    87  	err = replicas.Resync(client, created.ID).ExtractErr()
    88  	th.AssertNoErr(t, err)
    89  	_, err = waitForReplicaState(t, client, created.ID, "in_sync")
    90  	if err != nil {
    91  		t.Fatalf("Replica status error: %v", err)
    92  	}
    93  
    94  	// promote new replica
    95  	err = replicas.Promote(client, created.ID, &replicas.PromoteOpts{}).ExtractErr()
    96  	th.AssertNoErr(t, err)
    97  
    98  	_, err = waitForReplicaState(t, client, created.ID, "active")
    99  	if err != nil {
   100  		t.Fatalf("Replica status error: %v", err)
   101  	}
   102  
   103  	// promote old replica
   104  	allReplicas, err := ListShareReplicas(t, client, share.ID)
   105  	th.AssertNoErr(t, err)
   106  	var oldReplicaID string
   107  	for _, v := range allReplicas {
   108  		if v.ID == created.ID {
   109  			// These are not the droids you are looking for
   110  			continue
   111  		}
   112  		oldReplicaID = v.ID
   113  	}
   114  	if oldReplicaID == "" {
   115  		t.Errorf("Unable to get old replica")
   116  	}
   117  	// sync old replica
   118  	err = replicas.Resync(client, oldReplicaID).ExtractErr()
   119  	th.AssertNoErr(t, err)
   120  	_, err = waitForReplicaState(t, client, oldReplicaID, "in_sync")
   121  	if err != nil {
   122  		t.Fatalf("Replica status error: %v", err)
   123  	}
   124  	err = replicas.Promote(client, oldReplicaID, &replicas.PromoteOpts{}).ExtractErr()
   125  	th.AssertNoErr(t, err)
   126  
   127  	_, err = waitForReplicaState(t, client, oldReplicaID, "active")
   128  	if err != nil {
   129  		t.Fatalf("Replica status error: %v", err)
   130  	}
   131  }
   132  
   133  func TestReplicaExportLocations(t *testing.T) {
   134  	clients.RequireManilaReplicas(t)
   135  
   136  	client, err := clients.NewSharedFileSystemV2Client()
   137  	if err != nil {
   138  		t.Fatalf("Unable to create a shared file system client: %v", err)
   139  	}
   140  	client.Microversion = replicasPathMicroversion
   141  
   142  	share, err := CreateShare(t, client)
   143  	if err != nil {
   144  		t.Fatalf("Unable to create a share: %v", err)
   145  	}
   146  
   147  	defer DeleteShare(t, client, share)
   148  
   149  	replica, err := CreateReplica(t, client, share)
   150  	if err != nil {
   151  		t.Fatalf("Unable to create a replica: %v", err)
   152  	}
   153  
   154  	defer DeleteReplica(t, client, replica)
   155  
   156  	// this call should return empty list, since replica is not yet active
   157  	exportLocations, err := replicas.ListExportLocations(client, replica.ID).Extract()
   158  	if err != nil {
   159  		t.Errorf("Unable to list replica export locations: %v", err)
   160  	}
   161  	tools.PrintResource(t, exportLocations)
   162  
   163  	opts := replicas.ListOpts{
   164  		ShareID: share.ID,
   165  	}
   166  	pages, err := replicas.List(client, opts).AllPages()
   167  	th.AssertNoErr(t, err)
   168  
   169  	allReplicas, err := replicas.ExtractReplicas(pages)
   170  	th.AssertNoErr(t, err)
   171  
   172  	var activeReplicaID string
   173  	for _, v := range allReplicas {
   174  		if v.State == "active" && v.Status == "available" {
   175  			activeReplicaID = v.ID
   176  		}
   177  	}
   178  
   179  	if activeReplicaID == "" {
   180  		t.Errorf("Unable to get active replica")
   181  	}
   182  
   183  	exportLocations, err = replicas.ListExportLocations(client, activeReplicaID).Extract()
   184  	if err != nil {
   185  		t.Errorf("Unable to list replica export locations: %v", err)
   186  	}
   187  	tools.PrintResource(t, exportLocations)
   188  
   189  	exportLocation, err := replicas.GetExportLocation(client, activeReplicaID, exportLocations[0].ID).Extract()
   190  	if err != nil {
   191  		t.Errorf("Unable to get replica export location: %v", err)
   192  	}
   193  	tools.PrintResource(t, exportLocation)
   194  	// unset CreatedAt and UpdatedAt
   195  	exportLocation.CreatedAt = time.Time{}
   196  	exportLocation.UpdatedAt = time.Time{}
   197  	th.AssertEquals(t, exportLocations[0], *exportLocation)
   198  }
   199  
   200  func TestReplicaListDetail(t *testing.T) {
   201  	clients.RequireManilaReplicas(t)
   202  
   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 = replicasPathMicroversion
   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  	replica, err := CreateReplica(t, client, share)
   217  	if err != nil {
   218  		t.Fatalf("Unable to create a replica: %v", err)
   219  	}
   220  
   221  	defer DeleteReplica(t, client, replica)
   222  
   223  	ss, err := ListShareReplicas(t, client, share.ID)
   224  	if err != nil {
   225  		t.Fatalf("Unable to list replicas: %v", err)
   226  	}
   227  
   228  	for i := range ss {
   229  		tools.PrintResource(t, &ss[i])
   230  	}
   231  }
   232  
   233  func TestReplicaResetStatus(t *testing.T) {
   234  	clients.RequireManilaReplicas(t)
   235  
   236  	client, err := clients.NewSharedFileSystemV2Client()
   237  	if err != nil {
   238  		t.Fatalf("Unable to create a shared file system client: %v", err)
   239  	}
   240  	client.Microversion = replicasPathMicroversion
   241  
   242  	share, err := CreateShare(t, client)
   243  	if err != nil {
   244  		t.Fatalf("Unable to create a share: %v", err)
   245  	}
   246  
   247  	defer DeleteShare(t, client, share)
   248  
   249  	replica, err := CreateReplica(t, client, share)
   250  	if err != nil {
   251  		t.Fatalf("Unable to create a replica: %v", err)
   252  	}
   253  
   254  	defer DeleteReplica(t, client, replica)
   255  
   256  	resetStatusOpts := &replicas.ResetStatusOpts{
   257  		Status: "error",
   258  	}
   259  	err = replicas.ResetStatus(client, replica.ID, resetStatusOpts).ExtractErr()
   260  	if err != nil {
   261  		t.Fatalf("Unable to reset a replica status: %v", err)
   262  	}
   263  
   264  	// We need to wait till the Extend operation is done
   265  	_, err = waitForReplicaStatus(t, client, replica.ID, "error")
   266  	if err != nil {
   267  		t.Fatalf("Replica status error: %v", err)
   268  	}
   269  
   270  	t.Logf("Replica %s status successfuly reset", replica.ID)
   271  }
   272  
   273  // This test available only for cloud admins
   274  func TestReplicaForceDelete(t *testing.T) {
   275  	clients.RequireManilaReplicas(t)
   276  	clients.RequireAdmin(t)
   277  
   278  	client, err := clients.NewSharedFileSystemV2Client()
   279  	if err != nil {
   280  		t.Fatalf("Unable to create a shared file system client: %v", err)
   281  	}
   282  	client.Microversion = replicasPathMicroversion
   283  
   284  	share, err := CreateShare(t, client)
   285  	if err != nil {
   286  		t.Fatalf("Unable to create a share: %v", err)
   287  	}
   288  
   289  	defer DeleteShare(t, client, share)
   290  
   291  	replica, err := CreateReplica(t, client, share)
   292  	if err != nil {
   293  		t.Fatalf("Unable to create a replica: %v", err)
   294  	}
   295  
   296  	defer DeleteReplica(t, client, replica)
   297  
   298  	err = replicas.ForceDelete(client, replica.ID).ExtractErr()
   299  	if err != nil {
   300  		t.Fatalf("Unable to force delete a replica: %v", err)
   301  	}
   302  
   303  	_, err = waitForReplicaStatus(t, client, replica.ID, "deleted")
   304  	if err != nil {
   305  		t.Fatalf("Replica status error: %v", err)
   306  	}
   307  
   308  	t.Logf("Replica %s was successfuly deleted", replica.ID)
   309  }