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())); } }
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 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()); }
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); }