Exemple #1
0
        public async Task TestWriteUncompressedWithLayerEntries_retrieveByLayerDigestAsync()
        {
            LayersCache cache = LayersCache.WithDirectory(temporaryFolder.NewFolder().ToPath());

            await VerifyIsLayer1Async(await cache.WriteUncompressedLayerAsync(layerBlob1, layerEntries1).ConfigureAwait(false)).ConfigureAwait(false);
            await VerifyIsLayer1Async(cache.Retrieve(layerDigest1).OrElseThrow(() => new AssertionException(""))).ConfigureAwait(false);

            Assert.IsFalse(cache.Retrieve(layerDigest2).IsPresent());
        }
Exemple #2
0
        public async Task TestRetrieveWithTwoEntriesInCacheAsync()
        {
            LayersCache cache = LayersCache.WithDirectory(temporaryFolder.NewFolder().ToPath());

            await VerifyIsLayer1Async(await cache.WriteUncompressedLayerAsync(layerBlob1, layerEntries1).ConfigureAwait(false)).ConfigureAwait(false);
            await VerifyIsLayer2Async(await cache.WriteUncompressedLayerAsync(layerBlob2, layerEntries2).ConfigureAwait(false)).ConfigureAwait(false);
            await VerifyIsLayer1Async(cache.Retrieve(layerDigest1).OrElseThrow(() => new AssertionException(""))).ConfigureAwait(false);
            await VerifyIsLayer2Async(cache.Retrieve(layerDigest2).OrElseThrow(() => new AssertionException(""))).ConfigureAwait(false);

            Maybe <CachedLayer> cachedLayer1 = await cache.RetrieveAsync(layerEntries1).ConfigureAwait(false);

            await VerifyIsLayer1Async(cachedLayer1.OrElseThrow(() => new AssertionException(""))).ConfigureAwait(false);

            Maybe <CachedLayer> cachedLayer2 = await cache.RetrieveAsync(layerEntries2).ConfigureAwait(false);

            await VerifyIsLayer2Async(cachedLayer2.OrElseThrow(() => new AssertionException(""))).ConfigureAwait(false);
        }
        public async Task <ICachedLayer> CallAsync()
        {
            using (ProgressEventDispatcher progressEventDispatcher =
                       progressEventDispatcherFactory.Create("checking base image layer " + layerDigest, 1))
                using (TimerEventDispatcher ignored =
                           new TimerEventDispatcher(
                               buildConfiguration.GetEventHandlers(), string.Format(CultureInfo.CurrentCulture, Description, layerDigest)))
                {
                    LayersCache cache = buildConfiguration.GetBaseImageLayersCache();

                    // Checks if the layer already exists in the cache.
                    Maybe <CachedLayer> optionalCachedLayer = cache.Retrieve(layerDigest);
                    if (optionalCachedLayer.IsPresent())
                    {
                        return(optionalCachedLayer.Get());
                    }
                    else if (buildConfiguration.IsOffline())
                    {
                        throw new IOException(
                                  "Cannot run Fib in offline mode; local Fib cache for base image is missing image layer "
                                  + layerDigest
                                  + ". You may need to rerun Fib in online mode to re-download the base image layers.");
                    }

                    RegistryClient registryClient =
                        buildConfiguration
                        .NewBaseImageRegistryClientFactory()
                        .SetAuthorization(pullAuthorization)
                        .NewRegistryClient();

                    using (ThrottledProgressEventDispatcherWrapper progressEventDispatcherWrapper =
                               new ThrottledProgressEventDispatcherWrapper(
                                   progressEventDispatcher.NewChildProducer(),
                                   "pulling base image layer " + layerDigest))
                    {
                        return(await cache.WriteCompressedLayerAsync(
                                   registryClient.PullBlob(
                                       layerDigest,
                                       progressEventDispatcherWrapper.SetProgressTarget,
                                       progressEventDispatcherWrapper.DispatchProgress)).ConfigureAwait(false));
                    }
                }
        }
Exemple #4
0
        public async Task TestWriteUncompressedWithLayerEntries_retrieveByLayerEntriesAsync()
        {
            LayersCache cache = LayersCache.WithDirectory(temporaryFolder.NewFolder().ToPath());

            await VerifyIsLayer1Async(await cache.WriteUncompressedLayerAsync(layerBlob1, layerEntries1).ConfigureAwait(false)).ConfigureAwait(false);

            Maybe <CachedLayer> layer = await cache.RetrieveAsync(layerEntries1).ConfigureAwait(false);

            await VerifyIsLayer1Async(layer.OrElseThrow(() => new AssertionException(""))).ConfigureAwait(false);

            Assert.IsFalse(cache.Retrieve(layerDigest2).IsPresent());

            // A source file modification results in the cached layer to be out-of-date and not retrieved.
            Files.SetLastModifiedTime(
                layerEntries1[0].SourceFile, FileTime.From(SystemClock.Instance.GetCurrentInstant() + Duration.FromSeconds(1)));
            Maybe <CachedLayer> outOfDateLayer = await cache.RetrieveAsync(layerEntries1).ConfigureAwait(false);

            Assert.IsFalse(outOfDateLayer.IsPresent());
        }