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 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 #3
0
 public void ReplicateWithMetadataPutBlobControllerTest()
 {
     // We need exclusive access to the queue to validate queue behavior
     lock (this)
     {
         string blobName = Guid.NewGuid().ToString();
         string blobUri  = "http://localhost/blob/" + ContainerName + "/" + blobName;
         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-type", "BlockBlob");
         content.Headers.Add("x-ms-meta-" + ReplicateMetadataName, "true");
         var response = _runner.ExecuteRequest(blobUri,
                                               "PUT",
                                               content,
                                               HttpStatusCode.Created);
         // 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 GetBlobControllerTest()
        {
            var response = _runner.ExecuteRequest("http://localhost/blob/test/fixed-test.txt",
                                                  "GET",
                                                  expectedStatusCode: HttpStatusCode.OK);

            Assert.AreEqual(response.Content.Headers.ContentLength.Value, 423);
        }
Example #5
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);
        }