1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
|
package blobs
import (
"context"
"fmt"
"net/http"
"testing"
"time"
"github.com/Azure/azure-sdk-for-go/profiles/latest/storage/mgmt/storage"
"github.com/tombuildsstuff/giovanni/storage/2017-07-29/blob/containers"
"github.com/tombuildsstuff/giovanni/storage/internal/auth"
"github.com/tombuildsstuff/giovanni/testhelpers"
)
func TestSnapshotLifecycle(t *testing.T) {
client, err := testhelpers.Build(t)
if err != nil {
t.Fatal(err)
}
ctx := context.TODO()
resourceGroup := fmt.Sprintf("acctestrg-%d", testhelpers.RandomInt())
accountName := fmt.Sprintf("acctestsa%s", testhelpers.RandomString())
containerName := fmt.Sprintf("cont-%d", testhelpers.RandomInt())
fileName := "example.txt"
testData, err := client.BuildTestResources(ctx, resourceGroup, accountName, storage.BlobStorage)
if err != nil {
t.Fatal(err)
}
defer client.DestroyTestResources(ctx, resourceGroup, accountName)
storageAuth := auth.NewSharedKeyLiteAuthorizer(accountName, testData.StorageAccountKey)
containersClient := containers.NewWithEnvironment(client.Environment)
containersClient.Client = client.PrepareWithAuthorizer(containersClient.Client, storageAuth)
_, err = containersClient.Create(ctx, accountName, containerName, containers.CreateInput{})
if err != nil {
t.Fatalf("Error creating: %s", err)
}
defer containersClient.Delete(ctx, accountName, containerName)
blobClient := NewWithEnvironment(client.Environment)
blobClient.Client = client.PrepareWithAuthorizer(blobClient.Client, storageAuth)
t.Logf("[DEBUG] Copying file to Blob Storage..")
copyInput := CopyInput{
CopySource: "http://releases.ubuntu.com/14.04/ubuntu-14.04.6-desktop-amd64.iso",
}
refreshInterval := 5 * time.Second
if err := blobClient.CopyAndWait(ctx, accountName, containerName, fileName, copyInput, refreshInterval); err != nil {
t.Fatalf("Error copying: %s", err)
}
t.Logf("[DEBUG] First Snapshot..")
firstSnapshot, err := blobClient.Snapshot(ctx, accountName, containerName, fileName, SnapshotInput{})
if err != nil {
t.Fatalf("Error taking first snapshot: %s", err)
}
t.Logf("[DEBUG] First Snapshot ID: %q", firstSnapshot.SnapshotDateTime)
t.Log("[DEBUG] Waiting 2 seconds..")
time.Sleep(2 * time.Second)
t.Logf("[DEBUG] Second Snapshot..")
secondSnapshot, err := blobClient.Snapshot(ctx, accountName, containerName, fileName, SnapshotInput{
MetaData: map[string]string{
"hello": "world",
},
})
if err != nil {
t.Fatalf("Error taking Second snapshot: %s", err)
}
t.Logf("[DEBUG] Second Snapshot ID: %q", secondSnapshot.SnapshotDateTime)
t.Logf("[DEBUG] Leasing the Blob..")
leaseDetails, err := blobClient.AcquireLease(ctx, accountName, containerName, fileName, AcquireLeaseInput{
// infinite
LeaseDuration: -1,
})
if err != nil {
t.Fatalf("Error leasing Blob: %s", err)
}
t.Logf("[DEBUG] Lease ID: %q", leaseDetails.LeaseID)
t.Logf("[DEBUG] Third Snapshot..")
thirdSnapshot, err := blobClient.Snapshot(ctx, accountName, containerName, fileName, SnapshotInput{
LeaseID: &leaseDetails.LeaseID,
})
if err != nil {
t.Fatalf("Error taking Third snapshot: %s", err)
}
t.Logf("[DEBUG] Third Snapshot ID: %q", thirdSnapshot.SnapshotDateTime)
t.Logf("[DEBUG] Releasing Lease..")
if _, err := blobClient.ReleaseLease(ctx, accountName, containerName, fileName, leaseDetails.LeaseID); err != nil {
t.Fatalf("Error releasing Lease: %s", err)
}
// get the properties from the blob, which should include the LastModifiedDate
t.Logf("[DEBUG] Retrieving Properties for Blob")
props, err := blobClient.GetProperties(ctx, accountName, containerName, fileName, GetPropertiesInput{})
if err != nil {
t.Fatalf("Error getting properties: %s", err)
}
// confirm that the If-Modified-None returns an error
t.Logf("[DEBUG] Third Snapshot..")
fourthSnapshot, err := blobClient.Snapshot(ctx, accountName, containerName, fileName, SnapshotInput{
LeaseID: &leaseDetails.LeaseID,
IfModifiedSince: &props.LastModified,
})
if err == nil {
t.Fatalf("Expected an error but didn't get one")
}
if fourthSnapshot.Response.StatusCode != http.StatusPreconditionFailed {
t.Fatalf("Expected the status code to be Precondition Failed but got: %d", fourthSnapshot.Response.StatusCode)
}
t.Logf("[DEBUG] Retrieving the Second Snapshot Properties..")
getSecondSnapshotInput := GetSnapshotPropertiesInput{
SnapshotID: secondSnapshot.SnapshotDateTime,
}
if _, err := blobClient.GetSnapshotProperties(ctx, accountName, containerName, fileName, getSecondSnapshotInput); err != nil {
t.Fatalf("Error retrieving properties for the second snapshot: %s", err)
}
t.Logf("[DEBUG] Deleting the Second Snapshot..")
deleteSnapshotInput := DeleteSnapshotInput{
SnapshotDateTime: secondSnapshot.SnapshotDateTime,
}
if _, err := blobClient.DeleteSnapshot(ctx, accountName, containerName, fileName, deleteSnapshotInput); err != nil {
t.Fatalf("Error deleting snapshot: %s", err)
}
t.Logf("[DEBUG] Re-Retrieving the Second Snapshot Properties..")
secondSnapshotProps, err := blobClient.GetSnapshotProperties(ctx, accountName, containerName, fileName, getSecondSnapshotInput)
if err == nil {
t.Fatalf("Expected an error retrieving the snapshot but got none")
}
if secondSnapshotProps.Response.StatusCode != http.StatusNotFound {
t.Fatalf("Expected the status code to be %d but got %q", http.StatusNoContent, secondSnapshotProps.Response.StatusCode)
}
t.Logf("[DEBUG] Deleting all the snapshots..")
if _, err := blobClient.DeleteSnapshots(ctx, accountName, containerName, fileName, DeleteSnapshotsInput{}); err != nil {
t.Fatalf("Error deleting snapshots: %s", err)
}
t.Logf("[DEBUG] Deleting the Blob..")
deleteInput := DeleteInput{
DeleteSnapshots: false,
}
if _, err := blobClient.Delete(ctx, accountName, containerName, fileName, deleteInput); err != nil {
t.Fatalf("Error deleting Blob: %s", err)
}
}
|