public void ListContainersControllerTest()
        {
            // Default version (2009-09-19)
            var response = _runner.ExecuteRequest("http://mydashserver/account?comp=list",
                                                  "GET",
                                                  expectedStatusCode: HttpStatusCode.OK);
            var doc = XDocument.Load(response.Content.ReadAsStreamAsync().Result);
            var enumerationResults = doc.Root;

            Assert.AreEqual("http://mydashserver", enumerationResults.Attribute("AccountName").Value);
            Assert.IsNull(enumerationResults.Element("Prefix"));
            Assert.IsNull(enumerationResults.Element("Marker"));
            Assert.IsNull(enumerationResults.Element("MaxResults"));
            Assert.IsNotNull(enumerationResults.Element("Containers"));
            var containers = enumerationResults.Element("Containers");

            Assert.AreEqual(3, containers.Elements().Count());
            var container = containers.Element("Container");

            Assert.AreEqual("anonymousblobtest", container.Element("Name").Value);
            Assert.AreEqual("http://mydashserver/anonymousblobtest", container.Element("Url").Value);
            Assert.IsNotNull(container.Element("Properties"));
            Assert.IsNull(container.Element("Properties").Element("LeaseStatus"));
            container = containers.Elements("Container").ElementAt(1);
            Assert.AreEqual("anonymouscontainertest", container.Element("Name").Value);
            Assert.AreEqual("test", containers.Elements("Container").ElementAt(2).Element("Name").Value);

            // Explicit version
            response = _runner.ExecuteRequestWithHeaders("http://mydashserver/account?comp=list",
                                                         "GET",
                                                         null,
                                                         new[] {
                Tuple.Create("x-ms-version", "2013-08-15")
            },
                                                         expectedStatusCode: HttpStatusCode.OK);
            doc = XDocument.Load(response.Content.ReadAsStreamAsync().Result);
            enumerationResults = doc.Root;
            Assert.AreEqual("http://mydashserver", enumerationResults.Attribute("ServiceEndpoint").Value);
            container = enumerationResults.Element("Containers").Element("Container");
            Assert.IsNotNull(container.Element("Properties").Element("LeaseStatus"));
            Assert.IsNull(container.Element("Metadata"));

            // Include metadata
            response = _runner.ExecuteRequestWithHeaders("http://mydashserver/account?comp=list&include=metadata",
                                                         "GET",
                                                         null,
                                                         new[] {
                Tuple.Create("x-ms-version", "2013-08-15")
            },
                                                         expectedStatusCode: HttpStatusCode.OK);
            doc = XDocument.Load(response.Content.ReadAsStreamAsync().Result);
            enumerationResults = doc.Root;
            container          = enumerationResults.Element("Containers").Element("Container");
            Assert.IsNotNull(container.Element("Metadata"));
        }
Example #2
0
        public void BlobListFlatAllIncludeTest()
        {
            // The blob data includes 2 snapshots + 1 replicated blob
            var response = _runner.ExecuteRequestWithHeaders(
                "http://mydashserver/container/test?restype=container&comp=list&prefix=&include=snapshots&include=uncommittedblobs&include=metadata%2Ccopy",
                "GET",
                null,
                new [] {
                Tuple.Create("x-ms-version", "2013-08-15")
            },
                expectedStatusCode: HttpStatusCode.OK);
            var doc = XDocument.Load(response.Content.ReadAsStreamAsync().Result);
            var enumerationResults = doc.Root;

            Assert.AreEqual("http://mydashserver", enumerationResults.Attribute("ServiceEndpoint").Value);
            Assert.AreEqual("test", enumerationResults.Attribute("ContainerName").Value);
            Assert.IsNull(enumerationResults.Element("Prefix"));
            Assert.IsNull(enumerationResults.Element("Marker"));
            Assert.IsNull(enumerationResults.Element("MaxResults"));
            Assert.IsNull(enumerationResults.Element("Delimiter"));
            Assert.AreEqual(21, enumerationResults.Element("Blobs").Elements().Count());
            var firstBlob = (XElement)enumerationResults.Element("Blobs").FirstNode;

            Assert.AreEqual(".gitignore", firstBlob.Element("Name").Value);
            Assert.IsNotNull(firstBlob.Element("Snapshot").Value);
            Assert.IsNull(((XElement)firstBlob.NextNode).Element("Snapshot"));
            var replicatedBlob = (XElement)enumerationResults.Element("Blobs").Elements().Skip(2).First();

            Assert.AreEqual("DataAtScaleHub.sln", replicatedBlob.Element("Name").Value);
            Assert.AreEqual("Dpe Ted-Landcestry Application-O365 Azure-AAD Gateway-Gateway Development -- DLan-Gsx Ring-Movies-Graph API Test-6-26-2014-credentials.publishsettings",
                            ((XElement)replicatedBlob.NextNode).Element("Name").Value);
            var blobInSubDir = (XElement)enumerationResults.Element("Blobs").Elements().Skip(6).First();

            Assert.AreEqual("Package/Console/Package/UpdatePackage/console.zip", blobInSubDir.Element("Name").Value);
            Assert.AreEqual("application/x-zip-compressed", blobInSubDir.Descendants("Content-Type").First().Value);
            Assert.AreEqual("", blobInSubDir.Descendants("Content-Encoding").First().Value);
            var snapshotBlob = (XElement)enumerationResults.Element("Blobs").Elements().Skip(18).First();

            Assert.IsNotNull(snapshotBlob.Element("Snapshot").Value);
        }
Example #3
0
        public void ReplicateCopyBlobControllerTest()
        {
            string blobName = "test22/" + Guid.NewGuid().ToString();
            string blobUri  = "http://localhost/blob/" + ContainerName + "/" + blobName;
            var    response = _runner.ExecuteRequestWithHeaders(blobUri,
                                                                "PUT",
                                                                null,
                                                                new[] {
                Tuple.Create("x-ms-version", "2013-08-15"),
                Tuple.Create("x-ms-copy-source", "http://localhost/test/fixed-test.txt"),
            },
                                                                HttpStatusCode.Accepted);
            // Fetch the blob so that we can determine it's primary data account
            var    result          = BlobRequest("HEAD", blobUri);
            string dataAccountName = new Uri(result.Location).Host.Split('.')[0];

            AssertReplicationMessageIsEnqueued(MessageTypes.BeginReplicate, ContainerName, blobName, dataAccountName);
            // Cleanup
            _runner.ExecuteRequest(blobUri,
                                   "DELETE",
                                   expectedStatusCode: HttpStatusCode.Accepted);
            // Because the blob is not replicated yet, the delete should not enque any delete replica messages
            AssertQueueIsDrained();
        }
Example #4
0
        public void ImportAccountContainersTest()
        {
            var importAccount = DashConfiguration.DataAccounts[1];
            var importClient  = importAccount.CreateCloudBlobClient();

            InitializeImportClient(importClient);
            string containerName = "import-container-" + Guid.NewGuid().ToString("N");
            var    newContainer  = importClient.GetContainerReference(containerName);

            newContainer.CreateIfNotExists();

            AccountManager.ImportAccountAsync(importAccount.Credentials.AccountName).Wait();

            // Verify that our container was imported
            string baseUri        = "http://mydashserver/container/" + containerName + "?restype=container";
            string appVersion     = "2014-02-14";
            var    requestHeaders = new[] {
                Tuple.Create("x-ms-version", appVersion),
            };
            var results = _runner.ExecuteRequestWithHeaders(baseUri, "GET", null, requestHeaders, HttpStatusCode.OK);

            // Verify that all the existing containers were created in the import account
            Assert.IsTrue(importClient.ListContainers().Count() > 1);

            // Cleanup
            _runner.ExecuteRequest(baseUri, "DELETE", (HttpContent)null, HttpStatusCode.Accepted);

            // Test container permissions & metadata on import
            containerName = "import-container-" + Guid.NewGuid().ToString("N");
            newContainer  = importClient.GetContainerReference(containerName);
            newContainer.CreateIfNotExists(BlobContainerPublicAccessType.Blob);
            var permissions = newContainer.GetPermissions();
            var policy      = new SharedAccessBlobPolicy {
                Permissions = SharedAccessBlobPermissions.Read, SharedAccessStartTime = DateTimeOffset.UtcNow, SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddDays(5)
            };

            permissions.SharedAccessPolicies.Add("TestPolicy", policy);
            newContainer.SetPermissions(permissions);
            var metadata = new[] {
                Tuple.Create("Metadata1", "Value1"),
                Tuple.Create("Metadata2", "Value2"),
            };

            CopyMetadata(newContainer.Metadata, metadata);
            newContainer.SetMetadata();

            AccountManager.ImportAccountAsync(importAccount.Credentials.AccountName).Wait();

            // Verify that our container was imported
            baseUri = "http://mydashserver/container/" + containerName + "?restype=container";
            results = _runner.ExecuteRequestWithHeaders(baseUri, "GET", null, requestHeaders, HttpStatusCode.OK);
            results = _runner.ExecuteRequestWithHeaders(baseUri + "&comp=acl", "GET", null, requestHeaders, HttpStatusCode.OK);
            Assert.AreEqual(results.Headers.GetValues("x-ms-blob-public-access").First(), "blob");
            var storedPolicyResponse = XDocument.Load(results.Content.ReadAsStreamAsync().Result);
            var storedPolicy         = (XElement)storedPolicyResponse.Root.FirstNode;

            Assert.IsNotNull(storedPolicy);
            Assert.AreEqual(storedPolicy.Element("Id").Value, "TestPolicy");
            var accessPolicy = (XElement)storedPolicy.Element("AccessPolicy");

            Assert.AreEqual(accessPolicy.Element("Permission").Value, "r");
            Assert.AreEqual(DateTimeOffset.Parse(accessPolicy.Element("Start").Value).ToString(), policy.SharedAccessStartTime.Value.ToString());
            Assert.AreEqual(DateTimeOffset.Parse(accessPolicy.Element("Expiry").Value).ToString(), policy.SharedAccessExpiryTime.Value.ToString());

            results = _runner.ExecuteRequestWithHeaders(baseUri + "&comp=metadata", "GET", null, requestHeaders, HttpStatusCode.OK);
            ValidateMetadata(results.Headers, metadata);

            // Cleanup
            CleanupImportClient(importClient, containerName);
        }
Example #5
0
        void PutAndValidateBlob(string blobUri)
        {
            var content = new StringContent("hello world", System.Text.Encoding.UTF8, "text/plain");

            content.Headers.Add("x-ms-version", "2013-08-15");
            content.Headers.Add("x-ms-date", "Wed, 23 Oct 2013 22:33:355 GMT");
            content.Headers.Add("x-ms-blob-content-disposition", "attachment; filename=\"fname.ext\"");
            content.Headers.Add("x-ms-blob-type", "BlockBlob");
            content.Headers.Add("x-ms-meta-m1", "v1");
            content.Headers.Add("x-ms-meta-m2", "v2");

            var response = _runner.ExecuteRequest(blobUri,
                                                  "PUT",
                                                  content,
                                                  HttpStatusCode.Created);

            // Get it back & verify via the ETag
            _runner.ExecuteRequestWithHeaders(blobUri,
                                              "GET",
                                              null,
                                              new[] {
                Tuple.Create("If-Match", response.Headers.ETag.Tag),
            },
                                              expectedStatusCode: HttpStatusCode.OK);
            // Verify with an invalid ETag
            _runner.ExecuteRequestWithHeaders(blobUri,
                                              "GET",
                                              null,
                                              new[] {
                Tuple.Create("If-Match", "FredFlinstone"),
            },
                                              expectedStatusCode: HttpStatusCode.PreconditionFailed);

            // Cleanup
            _runner.ExecuteRequest(blobUri,
                                   "DELETE",
                                   expectedStatusCode: HttpStatusCode.Accepted);
        }
Example #6
0
        public void ContainerLifecycleTest()
        {
            string containerName = Guid.NewGuid().ToString("N");
            string baseUri       = "http://mydashserver/container/" + containerName + "?restype=container";
            var    results       = _runner.ExecuteRequest(baseUri, "PUT", expectedStatusCode: HttpStatusCode.Created);

            //Try to re-create the same container again.
            results = _runner.ExecuteRequest(baseUri, "PUT", expectedStatusCode: HttpStatusCode.Conflict);
            //TODO: Add more variations on create container, including attempt to create already existing container

            //Test insertion of metatags
            var content = new StringContent("", System.Text.Encoding.UTF8, "application/xml");

            content.Headers.Add("x-ms-meta-foo", "fee");
            content.Headers.Add("x-ms-meta-Dog", "Cat");
            results = _runner.ExecuteRequest(baseUri + "&comp=metadata", "PUT");
            List <Tuple <string, string> > customHeaders = new List <Tuple <string, string> >();
            string requestGuid = Guid.NewGuid().ToString("N");
            string appVersion  = "2014-02-14";
            string metadataUri = baseUri + "&comp=metadata";

            customHeaders.Add(new Tuple <string, string>("x-ms-meta-foo", "fee"));
            customHeaders.Add(new Tuple <string, string>("x-ms-meta-Dog", "Cat"));
            customHeaders.Add(new Tuple <string, string>("x-ms-client-request-id", requestGuid));
            customHeaders.Add(new Tuple <string, string>("x-ms-version", appVersion));
            results = _runner.ExecuteRequestWithHeaders(metadataUri, "PUT", content, customHeaders, HttpStatusCode.OK);
            Assert.AreEqual(requestGuid, results.Headers.GetValues("x-ms-request-id").First());
            Assert.AreEqual(appVersion, results.Headers.GetValues("x-ms-version").First());

            //Test retrieval of metatags
            customHeaders = new List <Tuple <string, string> >();
            requestGuid   = Guid.NewGuid().ToString("N");
            customHeaders.Add(new Tuple <string, string>("x-ms-client-request-id", requestGuid));
            customHeaders.Add(new Tuple <string, string>("x-ms-version", appVersion));
            results = _runner.ExecuteRequestWithHeaders(metadataUri, "GET", content, customHeaders, HttpStatusCode.OK);
            Assert.AreEqual(requestGuid, results.Headers.GetValues("x-ms-request-id").First());
            Assert.AreEqual(appVersion, results.Headers.GetValues("x-ms-version").First());
            Assert.AreEqual("fee", results.Headers.GetValues("x-ms-meta-foo").First());
            Assert.AreEqual("Cat", results.Headers.GetValues("x-ms-meta-Dog").First());

            //Test leasing of container
            string leaseUri = baseUri + "&comp=lease";

            requestGuid   = Guid.NewGuid().ToString("N");
            customHeaders = new List <Tuple <string, string> >();
            customHeaders.Add(new Tuple <string, string>("x-ms-client-request-id", requestGuid));
            customHeaders.Add(new Tuple <string, string>("x-ms-version", appVersion));
            customHeaders.Add(new Tuple <string, string>("x-ms-lease-action", "acquire"));
            customHeaders.Add(new Tuple <string, string>("x-ms-lease-duration", "30")); //30 second lease
            results = _runner.ExecuteRequestWithHeaders(leaseUri, "PUT", content, customHeaders, HttpStatusCode.Created);
            Assert.AreEqual(requestGuid, results.Headers.GetValues("x-ms-request-id").First());
            Assert.AreEqual(appVersion, results.Headers.GetValues("x-ms-version").First());
            Assert.IsNotNull(results.Headers.GetValues("x-ms-lease-id").First());
            string leaseId = results.Headers.GetValues("x-ms-lease-id").First();

            //Test renewal of lease
            requestGuid   = Guid.NewGuid().ToString("N");
            customHeaders = new List <Tuple <string, string> >();
            customHeaders.Add(new Tuple <string, string>("x-ms-client-request-id", requestGuid));
            customHeaders.Add(new Tuple <string, string>("x-ms-version", appVersion));
            customHeaders.Add(new Tuple <string, string>("x-ms-lease-action", "renew"));
            customHeaders.Add(new Tuple <string, string>("x-ms-lease-id", leaseId));
            results = _runner.ExecuteRequestWithHeaders(leaseUri, "PUT", content, customHeaders, HttpStatusCode.OK);
            Assert.AreEqual(requestGuid, results.Headers.GetValues("x-ms-request-id").First());
            Assert.AreEqual(appVersion, results.Headers.GetValues("x-ms-version").First());
            Assert.AreEqual(leaseId, results.Headers.GetValues("x-ms-lease-id").First());

            //Test changing of lease id
            requestGuid = Guid.NewGuid().ToString("N");
            string proposedLeaseId = Guid.NewGuid().ToString("N");

            customHeaders = new List <Tuple <string, string> >();
            customHeaders.Add(new Tuple <string, string>("x-ms-client-request-id", requestGuid));
            customHeaders.Add(new Tuple <string, string>("x-ms-version", appVersion));
            customHeaders.Add(new Tuple <string, string>("x-ms-lease-action", "change"));
            customHeaders.Add(new Tuple <string, string>("x-ms-lease-id", leaseId));
            customHeaders.Add(new Tuple <string, string>("x-ms-proposed-lease-id", proposedLeaseId));
            results = _runner.ExecuteRequestWithHeaders(leaseUri, "PUT", content, customHeaders, HttpStatusCode.OK);
            Assert.AreEqual(requestGuid, results.Headers.GetValues("x-ms-request-id").First());
            Assert.AreEqual(appVersion, results.Headers.GetValues("x-ms-version").First());
            Assert.AreEqual(proposedLeaseId, results.Headers.GetValues("x-ms-lease-id").First().Replace("-", ""));

            string oldLeaseId = leaseId;

            leaseId = results.Headers.GetValues("x-ms-lease-id").First();

            //Test renewing on now-invalid lease id
            requestGuid   = Guid.NewGuid().ToString("N");
            customHeaders = new List <Tuple <string, string> >();
            customHeaders.Add(new Tuple <string, string>("x-ms-client-request-id", requestGuid));
            customHeaders.Add(new Tuple <string, string>("x-ms-version", appVersion));
            customHeaders.Add(new Tuple <string, string>("x-ms-lease-action", "renew"));
            customHeaders.Add(new Tuple <string, string>("x-ms-lease-id", oldLeaseId));
            results = _runner.ExecuteRequestWithHeaders(leaseUri, "PUT", content, customHeaders, HttpStatusCode.PreconditionFailed);

            //Test breaking of lease
            requestGuid   = Guid.NewGuid().ToString("N");
            customHeaders = new List <Tuple <string, string> >();
            customHeaders.Add(new Tuple <string, string>("x-ms-client-request-id", requestGuid));
            customHeaders.Add(new Tuple <string, string>("x-ms-version", appVersion));
            customHeaders.Add(new Tuple <string, string>("x-ms-lease-action", "break"));
            customHeaders.Add(new Tuple <string, string>("x-ms-lease-id", leaseId));
            customHeaders.Add(new Tuple <string, string>("x-ms-lease-break-period", "0"));
            results = _runner.ExecuteRequestWithHeaders(leaseUri, "PUT", content, customHeaders, HttpStatusCode.Accepted);
            Assert.AreEqual(requestGuid, results.Headers.GetValues("x-ms-request-id").First());
            Assert.AreEqual(appVersion, results.Headers.GetValues("x-ms-version").First());
            Assert.AreEqual("0", results.Headers.GetValues("x-ms-lease-time").First());

            //Test leasing and then releasing the lease
            requestGuid   = Guid.NewGuid().ToString("N");
            customHeaders = new List <Tuple <string, string> >();
            customHeaders.Add(new Tuple <string, string>("x-ms-client-request-id", requestGuid));
            customHeaders.Add(new Tuple <string, string>("x-ms-version", appVersion));
            customHeaders.Add(new Tuple <string, string>("x-ms-lease-action", "acquire"));
            customHeaders.Add(new Tuple <string, string>("x-ms-lease-duration", "30")); //30 second lease
            results = _runner.ExecuteRequestWithHeaders(leaseUri, "PUT", content, customHeaders, HttpStatusCode.Created);
            Assert.AreEqual(requestGuid, results.Headers.GetValues("x-ms-request-id").First());
            Assert.AreEqual(appVersion, results.Headers.GetValues("x-ms-version").First());
            Assert.IsNotNull(results.Headers.GetValues("x-ms-lease-id").First());
            leaseId = results.Headers.GetValues("x-ms-lease-id").First();

            //Now release the lease
            requestGuid   = Guid.NewGuid().ToString("N");
            customHeaders = new List <Tuple <string, string> >();
            customHeaders.Add(new Tuple <string, string>("x-ms-client-request-id", requestGuid));
            customHeaders.Add(new Tuple <string, string>("x-ms-version", appVersion));
            customHeaders.Add(new Tuple <string, string>("x-ms-lease-action", "release"));
            customHeaders.Add(new Tuple <string, string>("x-ms-lease-id", leaseId));
            results = _runner.ExecuteRequestWithHeaders(leaseUri, "PUT", content, customHeaders, HttpStatusCode.OK);
            Assert.AreEqual(requestGuid, results.Headers.GetValues("x-ms-request-id").First());
            Assert.AreEqual(appVersion, results.Headers.GetValues("x-ms-version").First());

            //Test setting of ACLs
            string aclUri = baseUri + "&comp=acl";

            customHeaders = new List <Tuple <string, string> >();
            requestGuid   = Guid.NewGuid().ToString("N");
            customHeaders.Add(new Tuple <string, string>("x-ms-client-request-id", requestGuid));
            customHeaders.Add(new Tuple <string, string>("x-ms-version", appVersion));
            customHeaders.Add(new Tuple <string, string>("x-ms-blob-public-access", "container"));
            string policyGuid = Guid.NewGuid().ToString("N");
            string xmlBody    = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";

            xmlBody += "<SignedIdentifiers>";
            xmlBody += "<SignedIdentifier>";
            xmlBody += "<Id>" + policyGuid + "</Id>";
            xmlBody += "<AccessPolicy>";
            xmlBody += "<Start>" + DateTimeOffset.UtcNow.ToString() + "</Start>";
            xmlBody += "<Expiry>" + (DateTimeOffset.UtcNow + new TimeSpan(0, 0, 30)).ToString() + "</Expiry>";
            xmlBody += "<Permission>r</Permission>";
            xmlBody += "</AccessPolicy>";
            xmlBody += "</SignedIdentifier>";
            xmlBody += "</SignedIdentifiers>";
            var xmlContent = new StringContent(xmlBody, System.Text.Encoding.UTF8, "application/xml");

            results = _runner.ExecuteRequestWithHeaders(aclUri, "PUT", xmlContent, customHeaders, HttpStatusCode.OK);
            Assert.AreEqual(requestGuid, results.Headers.GetValues("x-ms-request-id").First());
            Assert.AreEqual(appVersion, results.Headers.GetValues("x-ms-version").First());

            //Test getting of ACLs
            customHeaders = new List <Tuple <string, string> >();
            requestGuid   = Guid.NewGuid().ToString("N");
            customHeaders.Add(new Tuple <string, string>("x-ms-client-request-id", requestGuid));
            customHeaders.Add(new Tuple <string, string>("x-ms-version", appVersion));
            results = _runner.ExecuteRequestWithHeaders(aclUri, "GET", content, customHeaders, HttpStatusCode.OK);
            Assert.AreEqual(requestGuid, results.Headers.GetValues("x-ms-request-id").First());
            Assert.AreEqual(appVersion, results.Headers.GetValues("x-ms-version").First());
            Assert.AreEqual("container", results.Headers.GetValues("x-ms-blob-public-access").First());
            XDocument xmlResponse        = XDocument.Load(results.Content.ReadAsStreamAsync().Result);
            var       enumerationResults = xmlResponse.Root;
            var       firstPolicy        = (XElement)enumerationResults.Element("SignedIdentifier");

            Assert.AreEqual(policyGuid, firstPolicy.Element("Id").Value);
            var accessPolicy = firstPolicy.Element("AccessPolicy");

            Assert.AreEqual("r", accessPolicy.Element("Permission").Value);

            //Test deletion of container (and cleanup)
            results = _runner.ExecuteRequest(baseUri, "DELETE", expectedStatusCode: HttpStatusCode.Accepted);
        }