/// <inheritdoc/>
        public async Task <StorageManifest> CreateStorageManifest(string containerName, string manifestName, IDictionary <string, string> metadata, IEnumerable <StorageObject> objects)
        {
            containerName.AssertIsNotNullOrEmpty("containerName", "Cannot create a storage manifest with a container name that is null or empty.");
            manifestName.AssertIsNotNullOrEmpty("manifestNamee", "Cannot create a storage manifest with a name that is null or empty.");
            metadata.AssertIsNotNull("metadata", "Cannot create a storage manifest with null metadata.");

            var client = this.GetPocoClient();

            var manifest = new StaticLargeObjectManifest(containerName, manifestName, metadata, objects.ToList());

            return(await client.CreateStorageManifest(manifest));
        }
        /// <inheritdoc/>
        public async Task <StorageManifest> CreateStorageManifest(string containerName, string manifestName, IDictionary <string, string> metadata, string segmentsPath)
        {
            containerName.AssertIsNotNullOrEmpty("containerName", "Cannot create a storage manifest with a container name that is null or empty.");
            manifestName.AssertIsNotNullOrEmpty("manifestNamee", "Cannot create a storage manifest with a name that is null or empty.");
            metadata.AssertIsNotNull("metadata", "Cannot create a storage manifest with null metadata.");
            segmentsPath.AssertIsNotNullOrEmpty("segmentsPath", "Cannot create storage manifest with a null or empty segments path.");

            var client = this.GetPocoClient();

            var manifest = new  DynamicLargeObjectManifest(containerName, manifestName, metadata, segmentsPath);

            return(await client.CreateStorageManifest(manifest));
        }
        /// <summary>
        /// Creates a new instance of the StorageObject class.
        /// </summary>
        /// <param name="fullName">The full name of the storage object.</param>
        /// <param name="containerName">The name of the parent storage container for the storage object.</param>
        /// <param name="lastModified">The last modified data for the storage object.</param>
        /// <param name="eTag">The ETag for the storage object.</param>
        /// <param name="length">The length/size of the storage object.</param>
        /// <param name="contentType">The content type of the storage object.</param>
        /// <param name="metadata">The metadata associated with the storage object.</param>
        internal StorageObject(string fullName, string containerName, DateTime lastModified, string eTag, long length, string contentType, IDictionary <string, string> metadata) : base(fullName, contentType)
        {
            containerName.AssertIsNotNullOrEmpty("containerName");
            lastModified.AssertIsNotNull("lastModified");
            eTag.AssertIsNotNull("eTag");
            length.AssertIsNotNull("length");
            metadata.AssertIsNotNull("metadata");

            this.ContainerName = containerName;
            this.LastModified  = lastModified;
            this.ETag          = eTag;
            this.Length        = length;
            this.Metadata      = metadata;
        }
        /// <summary>
        /// Creates a new instance of the StorageAccount class.
        /// </summary>
        /// <param name="name">The name of the account.</param>
        /// <param name="totalBytes">The total number of bytes used in the account.</param>
        /// <param name="totalObjects">The total number of storage objects in the account.</param>
        /// <param name="totalContainers">The total number of storage containers in the account.</param>
        /// <param name="metadata">Metadata associated with this account.</param>
        /// <param name="containers">A list of storage containers in the account.</param>
        internal StorageAccount(string name, long totalBytes, int totalObjects, int totalContainers, IDictionary<string, string> metadata, IEnumerable<StorageContainer> containers)
        {
            name.AssertIsNotNullOrEmpty("name");
            totalBytes.AssertIsNotNull("totalBytes");
            totalObjects.AssertIsNotNull("totalObjects");
            metadata.AssertIsNotNull("metadata");
            containers.AssertIsNotNull("containers");

            this.Name = name;
            this.TotalBytesUsed = totalBytes;
            this.TotalObjectCount = totalObjects;
            this.TotalContainerCount = totalContainers;
            this.Containers = containers.ToList();
            this.Metadata = metadata;
        }
        /// <summary>
        /// Creates a new instance of the StorageAccount class.
        /// </summary>
        /// <param name="name">The name of the account.</param>
        /// <param name="totalBytes">The total number of bytes used in the account.</param>
        /// <param name="totalObjects">The total number of storage objects in the account.</param>
        /// <param name="totalContainers">The total number of storage containers in the account.</param>
        /// <param name="metadata">Metadata associated with this account.</param>
        /// <param name="containers">A list of storage containers in the account.</param>
        internal StorageAccount(string name, long totalBytes, int totalObjects, int totalContainers, IDictionary <string, string> metadata, IEnumerable <StorageContainer> containers)
        {
            name.AssertIsNotNullOrEmpty("name");
            totalBytes.AssertIsNotNull("totalBytes");
            totalObjects.AssertIsNotNull("totalObjects");
            metadata.AssertIsNotNull("metadata");
            containers.AssertIsNotNull("containers");

            this.Name                = name;
            this.TotalBytesUsed      = totalBytes;
            this.TotalObjectCount    = totalObjects;
            this.TotalContainerCount = totalContainers;
            this.Containers          = containers.ToList();
            this.Metadata            = metadata;
        }
        /// <summary>
        /// Creates a new instance of the StorageContainer class.
        /// </summary>
        /// <param name="name">The name of the storage container.</param>
        /// <param name="totalBytes">The total number of bytes used in the container.</param>
        /// <param name="totalObjects">The total number of objects in the container.</param>
        /// <param name="objects">A list of storage objects that are in the container.</param>
        /// <param name="folders">A list of storage folders that are in the container.</param>
        /// <param name="metadata">Metadata associated with the storage container.</param>
        internal StorageContainer(string name, long totalBytes, int totalObjects, IDictionary <string, string> metadata, IEnumerable <StorageObject> objects, IEnumerable <StorageFolder> folders)
        {
            name.AssertIsNotNullOrEmpty("name");
            totalBytes.AssertIsNotNull("totalBytes");
            totalObjects.AssertIsNotNull("totalObjects");
            metadata.AssertIsNotNull("metadata");
            objects.AssertIsNotNull("objects");
            folders.AssertIsNotNull("folders");

            this.Name             = name;
            this.TotalBytesUsed   = totalBytes;
            this.TotalObjectCount = totalObjects;
            this.Objects          = objects.ToList();
            this.Folders          = folders.ToList();
            this.Metadata         = metadata;
        }
        /// <inheritdoc/>
        public async Task <StorageObject> Create(string containerName, string objectName, IDictionary <string, string> metadata, Stream content, int numberOfSegments, string segmentsContainer)
        {
            containerName.AssertIsNotNullOrEmpty("containerName", "Cannot create a large storage object with a null or empty container name.");
            objectName.AssertIsNotNullOrEmpty("objectName", "Cannot create a large storage object with a null or empty name.");
            metadata.AssertIsNotNull("metadata", "Cannot create a large storage object with null metadata.");
            content.AssertIsNotNull("content", "Cannot create a large storage object with null content.");
            segmentsContainer.AssertIsNotNullOrEmpty("segmentsContainer", "Cannot  create a large object with a null or empty segments container name.");

            if (numberOfSegments <= 0)
            {
                throw new ArgumentException("Cannot create a large object with zero or less segments.", "numberOfSegments");
            }

            var segmentFolder = await this.GetSegmentsFolder(segmentsContainer, objectName);

            var chunkSize           = this.GetChunkSize(content.Length, numberOfSegments);
            var lastSegmentAndId    = this.GetLastSegmentIdAndName(segmentFolder);
            var lastSegmentId       = lastSegmentAndId.Key;
            var lastSegmentFullName = string.Format("{0}/{1}", objectName, lastSegmentAndId.Value);
            var offset = lastSegmentId * chunkSize;

            if (lastSegmentId > 0)
            {
                //we should drop the last segment (as it's very possible it was corrupted)
                await StorageClient.DeleteStorageObject(segmentsContainer, lastSegmentFullName);
            }

            //Seek to the correct location based on whatever segments have been uploaded, if any
            content.Seek(offset, SeekOrigin.Begin);

            while (content.Position < content.Length)
            {
                //If the remaining data in the stream is less then the chunk size, reset the chunk size to the remaining data size.
                if ((content.Length - content.Position) < chunkSize)
                {
                    chunkSize = (content.Length - content.Position);
                }

                await CreateSegment(content, chunkSize, objectName, lastSegmentId, metadata, segmentsContainer);

                lastSegmentId++;
            }

            var segments = await StorageClient.GetStorageFolder(segmentsContainer, objectName);

            return(await CreateLargeObjectManifest(containerName, objectName, metadata, segments.Objects, segmentsContainer));
        }
        /// <inheritdoc/>
        public async Task <StorageObject> CreateLargeStorageObject(string containerName, string objectName, IDictionary <string, string> metadata, Stream content, int numberOfSegments)
        {
            containerName.AssertIsNotNullOrEmpty("containerName", "Cannot create a large storage object with a null or empty container name.");
            objectName.AssertIsNotNullOrEmpty("objectName", "Cannot create a large storage object with a null or empty name.");
            metadata.AssertIsNotNull("metadata", "Cannot create a large storage object with null metadata.");
            content.AssertIsNotNull("content", "Cannot create a large storage object with null content.");

            if (numberOfSegments <= 0)
            {
                throw new ArgumentException("Cannot create a large object with zero or less segments.", "numberOfSegments");
            }

            var factory = this.ServiceLocator.Locate <ILargeStorageObjectCreatorFactory>();
            var creator = factory.Create(this);

            return(await creator.Create(containerName, objectName, metadata, content, numberOfSegments, this.LargeObjectSegmentContainer));
        }
        /// <inheritdoc/>
        public async Task<StorageObject> Create(string containerName, string objectName, IDictionary<string, string> metadata, Stream content, int numberOfSegments, string segmentsContainer)
        {
            containerName.AssertIsNotNullOrEmpty("containerName", "Cannot create a large storage object with a null or empty container name.");
            objectName.AssertIsNotNullOrEmpty("objectName", "Cannot create a large storage object with a null or empty name.");
            metadata.AssertIsNotNull("metadata", "Cannot create a large storage object with null metadata.");
            content.AssertIsNotNull("content", "Cannot create a large storage object with null content.");
            segmentsContainer.AssertIsNotNullOrEmpty("segmentsContainer","Cannot  create a large object with a null or empty segments container name.");

            if (numberOfSegments <= 0)
            {
                throw new ArgumentException("Cannot create a large object with zero or less segments.", "numberOfSegments");
            }
            
            var segmentFolder = await this.GetSegmentsFolder(segmentsContainer, objectName);

            var chunkSize = this.GetChunkSize(content.Length, numberOfSegments);
            var lastSegmentAndId = this.GetLastSegmentIdAndName(segmentFolder);
            var lastSegmentId = lastSegmentAndId.Key;
            var lastSegmentFullName = string.Format("{0}/{1}", objectName, lastSegmentAndId.Value);
            var offset = lastSegmentId * chunkSize;
            
            if (lastSegmentId > 0)
            {
                //we should drop the last segment (as it's very possible it was corrupted)
                await StorageClient.DeleteStorageObject(segmentsContainer, lastSegmentFullName);
            }

            //Seek to the correct location based on whatever segments have been uploaded, if any
            content.Seek(offset, SeekOrigin.Begin);

            while (content.Position < content.Length)
            {
                //If the remaining data in the stream is less then the chunk size, reset the chunk size to the remaining data size.
                if ((content.Length - content.Position) < chunkSize)
                {
                    chunkSize = (content.Length - content.Position);
                }

                await CreateSegment(content, chunkSize, objectName, lastSegmentId, metadata, segmentsContainer);
                lastSegmentId++;
            }

            var segments = await StorageClient.GetStorageFolder(segmentsContainer, objectName);

            return await CreateLargeObjectManifest(containerName, objectName, metadata, segments.Objects, segmentsContainer);
        }
        /// <inheritdoc/>
        public async Task<IHttpResponseAbstraction> CreateDynamicManifest(string containerName, string manifestName, IDictionary<string, string> metadata, string segmentsPath)
        {
            AssertContainerNameIsValid(containerName);
            manifestName.AssertIsNotNullOrEmpty("manifestName","Cannot create a storage manifest with a null or empty name.");
            segmentsPath.AssertIsNotNullOrEmpty("segmentsPath","Cannot create a dynamic large object manifest with a null or empty segments path.");
            metadata.AssertIsNotNull("metadata","Cannot create a storage manifest with null metadata.");

            var client = this.GetHttpClient(this.Context);

            client.Uri = CreateRequestUri(this.Context.PublicEndpoint, containerName, manifestName);
            client.Method = HttpMethod.Put;
            client.Content = new MemoryStream();

            client.Headers.Add("X-Object-Manifest", segmentsPath);
            this.AddObjectMetadata(metadata, client);

            return await client.SendAsync();
        }
        /// <inheritdoc/>
        public async Task<IHttpResponseAbstraction> CreateStaticManifest(string containerName, string manifestName, IDictionary<string, string> metadata, Stream content)
        {
            AssertContainerNameIsValid(containerName);
            manifestName.AssertIsNotNullOrEmpty("manifestName", "Cannot create a storage manifest with a null or empty name.");
            metadata.AssertIsNotNull("metadata", "Cannot create a storage manifest with null metadata.");
            content.AssertIsNotNull("content","Cannot create a static large object manifest with null content.");

            var client = this.GetHttpClient(this.Context);

            var baseUri = CreateRequestUri(this.Context.PublicEndpoint, containerName);
            client.Uri = new Uri(string.Format("{0}/{1}?multipart-manifest=put", baseUri, manifestName));
            client.Method = HttpMethod.Put;
            client.Content = content;

            this.AddObjectMetadata(metadata, client);

            return await client.SendAsync();
        }
Пример #12
0
        /// <inheritdoc/>
        public async Task <IHttpResponseAbstraction> CreateDynamicManifest(string containerName, string manifestName, IDictionary <string, string> metadata, string segmentsPath)
        {
            AssertContainerNameIsValid(containerName);
            manifestName.AssertIsNotNullOrEmpty("manifestName", "Cannot create a storage manifest with a null or empty name.");
            segmentsPath.AssertIsNotNullOrEmpty("segmentsPath", "Cannot create a dynamic large object manifest with a null or empty segments path.");
            metadata.AssertIsNotNull("metadata", "Cannot create a storage manifest with null metadata.");

            var client = this.GetHttpClient(this.Context);

            client.Uri     = CreateRequestUri(this.Context.PublicEndpoint, containerName, manifestName);
            client.Method  = HttpMethod.Put;
            client.Content = new MemoryStream();

            client.Headers.Add("X-Object-Manifest", segmentsPath);
            this.AddObjectMetadata(metadata, client);

            return(await client.SendAsync());
        }
Пример #13
0
        /// <inheritdoc/>
        public async Task <IHttpResponseAbstraction> CreateStaticManifest(string containerName, string manifestName, IDictionary <string, string> metadata, Stream content)
        {
            AssertContainerNameIsValid(containerName);
            manifestName.AssertIsNotNullOrEmpty("manifestName", "Cannot create a storage manifest with a null or empty name.");
            metadata.AssertIsNotNull("metadata", "Cannot create a storage manifest with null metadata.");
            content.AssertIsNotNull("content", "Cannot create a static large object manifest with null content.");

            var client = this.GetHttpClient(this.Context);

            var baseUri = CreateRequestUri(this.Context.PublicEndpoint, containerName);

            client.Uri     = new Uri(string.Format("{0}/{1}?multipart-manifest=put", baseUri, manifestName));
            client.Method  = HttpMethod.Put;
            client.Content = content;

            this.AddObjectMetadata(metadata, client);

            return(await client.SendAsync());
        }
        /// <inheritdoc/>
        public string Convert(IDictionary<string, string> metadata)
        {
            metadata.AssertIsNotNull("metadata", "Cannot convert compute item metadata with null metadata.");
            
            var payload = new StringBuilder();
            payload.Append("{ \"metadata\" : {");
            var isFirst = true;

            foreach (var item in metadata)
            {
                if (!isFirst)
                {
                    payload.Append(",");
                }

                payload.AppendFormat("\"{0}\":\"{1}\"",item.Key, item.Value);
                isFirst = false;
            }

            payload.Append("}}");
            return payload.ToString();
        }
Пример #15
0
        /// <inheritdoc/>
        public string Convert(IDictionary <string, string> metadata)
        {
            metadata.AssertIsNotNull("metadata", "Cannot convert compute item metadata with null metadata.");

            var payload = new StringBuilder();

            payload.Append("{ \"metadata\" : {");
            var isFirst = true;

            foreach (var item in metadata)
            {
                if (!isFirst)
                {
                    payload.Append(",");
                }

                payload.AppendFormat("\"{0}\":\"{1}\"", item.Key, item.Value);
                isFirst = false;
            }

            payload.Append("}}");
            return(payload.ToString());
        }
        /// <summary>
        /// Creates a new instance of the StorageContainer class.
        /// </summary>
        /// <param name="name">The name of the storage container.</param>
        /// <param name="totalBytes">The total number of bytes used in the container.</param>
        /// <param name="totalObjects">The total number of objects in the container.</param>
        /// <param name="objects">A list of storage objects that are in the container.</param>
        /// <param name="folders">A list of storage folders that are in the container.</param>
        /// <param name="metadata">Metadata associated with the storage container.</param>
        internal StorageContainer(string name, long totalBytes, int totalObjects, IDictionary<string, string> metadata, IEnumerable<StorageObject> objects, IEnumerable<StorageFolder> folders)
        {
            name.AssertIsNotNullOrEmpty("name");
            totalBytes.AssertIsNotNull("totalBytes");
            totalObjects.AssertIsNotNull("totalObjects");
            metadata.AssertIsNotNull("metadata");
            objects.AssertIsNotNull("objects");
            folders.AssertIsNotNull("folders");

            this.Name = name;
            this.TotalBytesUsed = totalBytes;
            this.TotalObjectCount = totalObjects;
            this.Objects = objects.ToList();
            this.Folders = folders.ToList();
            this.Metadata = metadata;
        }
        /// <inheritdoc/>
        public async Task<StorageObject> CreateLargeStorageObject(string containerName, string objectName, IDictionary<string, string> metadata, Stream content, int numberOfSegments)
        {
            containerName.AssertIsNotNullOrEmpty("containerName", "Cannot create a large storage object with a null or empty container name.");
            objectName.AssertIsNotNullOrEmpty("objectName", "Cannot create a large storage object with a null or empty name.");
            metadata.AssertIsNotNull("metadata", "Cannot create a large storage object with null metadata.");
            content.AssertIsNotNull("content", "Cannot create a large storage object with null content.");

            if (numberOfSegments <= 0)
            {
                throw new ArgumentException("Cannot create a large object with zero or less segments.", "numberOfSegments");
            }

            var factory = this.ServiceLocator.Locate<ILargeStorageObjectCreatorFactory>();
            var creator = factory.Create(this);
            return await creator.Create(containerName, objectName, metadata, content, numberOfSegments, this.LargeObjectSegmentContainer);
        }
        /// <inheritdoc/>
        public async Task<StorageManifest> CreateStorageManifest(string containerName, string manifestName, IDictionary<string, string> metadata, string segmentsPath)
        {
            containerName.AssertIsNotNullOrEmpty("containerName", "Cannot create a storage manifest with a container name that is null or empty.");
            manifestName.AssertIsNotNullOrEmpty("manifestNamee", "Cannot create a storage manifest with a name that is null or empty.");
            metadata.AssertIsNotNull("metadata", "Cannot create a storage manifest with null metadata.");
            segmentsPath.AssertIsNotNullOrEmpty("segmentsPath", "Cannot create storage manifest with a null or empty segments path.");

            var client = this.GetPocoClient();

            var manifest = new  DynamicLargeObjectManifest(containerName, manifestName, metadata, segmentsPath);

            return await client.CreateStorageManifest(manifest);
        }
        /// <inheritdoc/>
        public async Task<StorageManifest> CreateStorageManifest(string containerName, string manifestName, IDictionary<string, string> metadata, IEnumerable<StorageObject> objects)
        {
            containerName.AssertIsNotNullOrEmpty("containerName", "Cannot create a storage manifest with a container name that is null or empty.");
            manifestName.AssertIsNotNullOrEmpty("manifestNamee", "Cannot create a storage manifest with a name that is null or empty.");
            metadata.AssertIsNotNull("metadata","Cannot create a storage manifest with null metadata.");

            var client = this.GetPocoClient();

            var manifest = new StaticLargeObjectManifest(containerName, manifestName, metadata, objects.ToList());

            return await client.CreateStorageManifest(manifest);
        }
        /// <inheritdoc/>
        public async Task UpdateServerMetadata(string serverId, IDictionary<string, string> metadata)
        {
            serverId.AssertIsNotNullOrEmpty("flavorId", "Cannot update compute server metadata with a null or empty id.");
            metadata.AssertIsNotNull("metadata", "Cannot update compute server metadata with a null or empty metadata.");

            var client = this.GetPocoClient();
            await client.UpdateServerMetadata(serverId, metadata);
        }
        /// <inheritdoc/>
        public async Task UpdateImageMetadata(string imageId, IDictionary<string, string> metadata)
        {
            imageId.AssertIsNotNullOrEmpty("imageId", "Cannot update compute image metadata with a null or empty id.");
            metadata.AssertIsNotNull("metadata", "Cannot update compute image metadata with a null or empty metadata.");

            var client = this.GetPocoClient();
            await client.UpdateImageMetadata(imageId, metadata);
        }
        /// <summary>
        /// Creates a new instance of the StorageObject class.
        /// </summary>
        /// <param name="fullName">The full name of the storage object.</param>
        /// <param name="containerName">The name of the parent storage container for the storage object.</param>
        /// <param name="lastModified">The last modified data for the storage object.</param>
        /// <param name="eTag">The ETag for the storage object.</param>
        /// <param name="length">The length/size of the storage object.</param>
        /// <param name="contentType">The content type of the storage object.</param>
        /// <param name="metadata">The metadata associated with the storage object.</param>
        internal StorageObject(string fullName, string containerName, DateTime lastModified, string eTag, long length, string contentType, IDictionary<string, string> metadata) : base(fullName, contentType)
        {
            containerName.AssertIsNotNullOrEmpty("containerName");
            lastModified.AssertIsNotNull("lastModified");
            eTag.AssertIsNotNull("eTag");
            length.AssertIsNotNull("length");
            metadata.AssertIsNotNull("metadata");

            this.ContainerName = containerName;
            this.LastModified = lastModified;
            this.ETag = eTag;
            this.Length = length;
            this.Metadata = metadata;
        }