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 }