private async Task FakePullAndMount(ManifestV2Layer layer) { _logger.LogDebug($"Mount failed, trying to fake pull and retry {_baseImageName} {layer.digest}"); try { var blobStream = await _registry.DownloadBlob(_baseImageName, layer.digest); await blobStream.CopyToAsync(System.IO.Stream.Null); } catch (Exception ex) { _logger.LogDebug(ex, $"Fake pull failed"); throw; } await _registry.MountBlob(_targetImageName, layer.digest, _baseImageName); }
private async Task MountLayer(ManifestV2Layer layer) { try { await _registry.MountBlob(_targetImageName, layer.digest, _baseImageName); } catch { if (FakePullAndRetryMount) { await FakePullAndMount(layer); } else { throw; } } }
public async Task PushConfig(ManifestV2Layer config, Func <System.IO.Stream> configStream) { await RetryHelper.Retry(_retryUpload, _logger, async() => { var uploadUri = await GetUploadUri(); _logger.LogDebug($"uploading config."); using (var stream = configStream()) { if (_chunckSize > 0) { await _registry.UploadBlobChuncks(uploadUri, config.digest, stream, _chunckSize); } else { await _registry.UploadBlob(uploadUri, config.digest, stream, config.size); } } }); }
private async Task CopyLayer(ManifestV2Layer layer, string baseImageName, Registry baseRegistry) { await RetryHelper.Retry(_retryUpload, _logger, async() => { var uploadUri = await GetUploadUri(); _logger.LogDebug($"copy layer from {baseRegistry.BaseUri}{baseImageName} - {layer.digest}, {layer.size} bytes."); using (var stream = await baseRegistry.DownloadBlob(baseImageName, layer.digest)) { if (_chunckSize > 0) { await _registry.UploadBlobChuncks(uploadUri, layer.digest, stream, _chunckSize); } else { await _registry.UploadBlob(uploadUri, layer.digest, stream, layer.size); } } }); }
private static async Task CopyBlobIfNeeded(string imageName, Registry source, Registry dest, string uploadUri, ManifestV2Layer layer) { var exist = await dest.BlobExists(imageName, layer.digest); Console.WriteLine($"{layer.digest} - {layer.mediaType} - {layer.size} = {exist.HasValue}"); if (!exist.HasValue) { Console.WriteLine($"Copying layer: {layer.digest} - {layer.mediaType} - {layer.size}"); var blob = await source.DownloadBlob(imageName, layer.digest); await dest.UploadBlobChuncks(uploadUri, layer.digest, blob, 10000); Console.WriteLine($"Done copying layer: {layer.digest} to {uploadUri}"); } }