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 }