Example #1
0
        public static async Task <IActionResult> Start(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            var copyMetadataInfo = await CopyMetadataInfo.Deserialize(req.Body);

            copyMetadataInfo.ExecutionId = Guid.NewGuid().ToString();

            if (string.IsNullOrWhiteSpace(copyMetadataInfo.SourceConnectionString))
            {
                throw new ArgumentNullException("SourceConnectionString");
            }
            if (string.IsNullOrWhiteSpace(copyMetadataInfo.SourceContainerName))
            {
                throw new ArgumentNullException("SourceContainerName");
            }
            if (string.IsNullOrWhiteSpace(copyMetadataInfo.DestinationConnectionString))
            {
                throw new ArgumentNullException("DestinationConnectionString");
            }
            if (string.IsNullOrWhiteSpace(copyMetadataInfo.DestinationContainerName))
            {
                throw new ArgumentNullException("DestinationContainerName");
            }

            await EnsureInfrastructure();

            _ = httpClient.PostAsync($"{functionAppUrl}GetBlobs", new StringContent(copyMetadataInfo.ToString()));
            return(new OkResult());
        }
Example #2
0
        public static async Task UpdateMetadata(
            [QueueTrigger("copymetadata")] string json,
            ILogger log)
        {
            var copyMetadataInfo = CopyMetadataInfo.Deserialize(json);

            var sourceBlob =
                GetBlobContainer(copyMetadataInfo.SourceConnectionString, copyMetadataInfo.SourceContainerName)
                .GetBlockBlobReference(copyMetadataInfo.BlobName);
            await sourceBlob.FetchAttributesAsync();

            if (!sourceBlob.Metadata.Any())
            {
                return;
            }

            var destinationBlob =
                GetBlobContainer(copyMetadataInfo.DestinationConnectionString, copyMetadataInfo.DestinationContainerName)
                .GetBlockBlobReference(copyMetadataInfo.BlobName);

            //await destinationBlob.FetchAttributesAsync(); // No need to fetch as being replaced.

            destinationBlob.Metadata.Clear();
            foreach (var metadata in sourceBlob.Metadata)
            {
                destinationBlob.Metadata.Add(metadata.Key, metadata.Value);
            }
            await destinationBlob.SetMetadataAsync();
        }
Example #3
0
        public static async Task GetBlobs(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            req.GetQueryParameterDictionary().TryGetValue("ContinuationToken", out var continuationToken);
            var copyMetadataInfo = await CopyMetadataInfo.Deserialize(req.Body);

            var blobContainer = GetBlobContainer(copyMetadataInfo.SourceConnectionString, copyMetadataInfo.SourceContainerName);

            var results = await blobContainer.ListBlobsSegmentedAsync(null, true, BlobListingDetails.None, 5000, new BlobContinuationToken()
            {
                NextMarker = continuationToken
            }, null, null);

            continuationToken = results.ContinuationToken?.NextMarker;
            if (!string.IsNullOrWhiteSpace(continuationToken))
            {
                _ = httpClient.PostAsync($"{functionAppUrl}GetBlobs?ContinuationToken={continuationToken}", new StringContent(copyMetadataInfo.ToString()));
            }

            List <CloudBlockBlob> blobs = results.Results.OfType <CloudBlockBlob>().ToList();
            var tracker = 0;

            while (tracker < blobs.Count)
            {
                var take         = blobs.Count - tracker > 500 ? 500 : blobs.Count - tracker;
                var pagedResults = blobs.Skip(tracker).Take(take);
                var jsonContent  = JsonConvert.SerializeObject(pagedResults.Select(blob => new CopyMetadataInfo()
                {
                    ExecutionId = copyMetadataInfo.ExecutionId,
                    BlobName    = blob.Name,
                    //Metadata = blob.Metadata.ToDictionary(kvp => kvp.Key, kvp => kvp.Value),
                    SourceConnectionString      = copyMetadataInfo.SourceConnectionString,
                    SourceContainerName         = copyMetadataInfo.SourceContainerName,
                    DestinationConnectionString = copyMetadataInfo.DestinationConnectionString,
                    DestinationContainerName    = copyMetadataInfo.DestinationContainerName,
                }));
                var httpContent = new StringContent(jsonContent);
                _        = httpClient.PostAsync($"{functionAppUrl}ProcessSegment", httpContent);
                tracker += take;
            }
        }
Example #4
0
 public static string Serialize(CopyMetadataInfo copyMetadataInfo)
 {
     return(JsonConvert.SerializeObject(copyMetadataInfo));
 }