public async Task <ICachedLayer> CallAsync()
        {
            string description = "Building " + layerType + " layer";

            buildConfiguration.GetEventHandlers().Dispatch(LogEvent.Progress(description + "..."));

            using (ProgressEventDispatcher ignored =
                       progressEventDispatcherFactory.Create("building " + layerType + " layer", 1))
                using (TimerEventDispatcher ignored2 =
                           new TimerEventDispatcher(buildConfiguration.GetEventHandlers(), description))

                {
                    LayersCache cache = buildConfiguration.GetApplicationLayersCache();

                    // Don't build the layer if it exists already.
                    Maybe <CachedLayer> optionalCachedLayer =
                        await cache.RetrieveAsync(layerConfiguration.LayerEntries).ConfigureAwait(false);

                    if (optionalCachedLayer.IsPresent())
                    {
                        return(new CachedLayerWithType(optionalCachedLayer.Get(), GetLayerType()));
                    }

                    IBlob       layerBlob   = new ReproducibleLayerBuilder(layerConfiguration.LayerEntries).Build();
                    CachedLayer cachedLayer =
                        await cache.WriteUncompressedLayerAsync(layerBlob, layerConfiguration.LayerEntries).ConfigureAwait(false);

                    buildConfiguration
                    .GetEventHandlers()
                    .Dispatch(LogEvent.Debug(description + " built " + cachedLayer.GetDigest()));

                    return(new CachedLayerWithType(cachedLayer, GetLayerType()));
                }
        }
예제 #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);
        }
예제 #3
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());
        }
예제 #4
0
        public async Task TestRunAsync()
        {
            ImmutableArray <ILayerConfiguration> fakeLayerConfigurations =
                ImmutableArray.Create(
                    fakeDependenciesLayerConfiguration,
                    fakeSnapshotDependenciesLayerConfiguration,
                    fakeResourcesLayerConfiguration,
                    fakeClassesLayerConfiguration,
                    fakeExtraFilesLayerConfiguration);

            Mock.Get(mockBuildConfiguration).Setup(m => m.GetLayerConfigurations()).Returns(fakeLayerConfigurations);

            // Populates the cache.
            ImageLayers applicationLayers = await BuildFakeLayersToCacheAsync().ConfigureAwait(false);

            Assert.AreEqual(5, applicationLayers.Size());

            ImmutableArray <LayerEntry> dependenciesLayerEntries =
                fakeLayerConfigurations[0].LayerEntries;
            ImmutableArray <LayerEntry> snapshotDependenciesLayerEntries =
                fakeLayerConfigurations[1].LayerEntries;
            ImmutableArray <LayerEntry> resourcesLayerEntries =
                fakeLayerConfigurations[2].LayerEntries;
            ImmutableArray <LayerEntry> classesLayerEntries =
                fakeLayerConfigurations[3].LayerEntries;
            ImmutableArray <LayerEntry> extraFilesLayerEntries =
                fakeLayerConfigurations[4].LayerEntries;

            CachedLayer dependenciesCachedLayer =
                await cache.RetrieveAsync(dependenciesLayerEntries).OrElseThrowAsync(() => new AssertionException("")).ConfigureAwait(false);

            CachedLayer snapshotDependenciesCachedLayer =
                await cache.RetrieveAsync(snapshotDependenciesLayerEntries).OrElseThrowAsync(() => new AssertionException("")).ConfigureAwait(false);

            CachedLayer resourcesCachedLayer =
                await cache.RetrieveAsync(resourcesLayerEntries).OrElseThrowAsync(() => new AssertionException("")).ConfigureAwait(false);

            CachedLayer classesCachedLayer =
                await cache.RetrieveAsync(classesLayerEntries).OrElseThrowAsync(() => new AssertionException("")).ConfigureAwait(false);

            CachedLayer extraFilesCachedLayer =
                await cache.RetrieveAsync(extraFilesLayerEntries).OrElseThrowAsync(() => new AssertionException("")).ConfigureAwait(false);

            // Verifies that the cached layers are up-to-date.
            Assert.AreEqual(
                applicationLayers.Get(0).GetBlobDescriptor().GetDigest(),
                dependenciesCachedLayer.GetDigest());
            Assert.AreEqual(
                applicationLayers.Get(1).GetBlobDescriptor().GetDigest(),
                snapshotDependenciesCachedLayer.GetDigest());
            Assert.AreEqual(
                applicationLayers.Get(2).GetBlobDescriptor().GetDigest(), resourcesCachedLayer.GetDigest());
            Assert.AreEqual(
                applicationLayers.Get(3).GetBlobDescriptor().GetDigest(), classesCachedLayer.GetDigest());
            Assert.AreEqual(
                applicationLayers.Get(4).GetBlobDescriptor().GetDigest(),
                extraFilesCachedLayer.GetDigest());

            // Verifies that the cache reader gets the same layers as the newest application layers.
            await AssertBlobsEqualAsync(applicationLayers.Get(0).GetBlob(), dependenciesCachedLayer.GetBlob()).ConfigureAwait(false);
            await AssertBlobsEqualAsync(applicationLayers.Get(1).GetBlob(), snapshotDependenciesCachedLayer.GetBlob()).ConfigureAwait(false);
            await AssertBlobsEqualAsync(applicationLayers.Get(2).GetBlob(), resourcesCachedLayer.GetBlob()).ConfigureAwait(false);
            await AssertBlobsEqualAsync(applicationLayers.Get(3).GetBlob(), classesCachedLayer.GetBlob()).ConfigureAwait(false);
            await AssertBlobsEqualAsync(applicationLayers.Get(4).GetBlob(), extraFilesCachedLayer.GetBlob()).ConfigureAwait(false);
        }