use of com.google.cloud.tools.jib.image.UnwrittenLayer in project jib by google.
the class CacheWriterTest method testWriteLayer_unwritten.
@Test
public void testWriteLayer_unwritten() throws IOException, LayerPropertyNotFoundException {
ExpectedLayer expectedLayer = getExpectedLayer();
// Writes resourceBlob as a layer to the cache.
CacheWriter cacheWriter = new CacheWriter(testCache);
UnwrittenLayer unwrittenLayer = new UnwrittenLayer(Blobs.from(resourceBlob));
List<Path> fakeSourceFiles = Collections.singletonList(Paths.get("some", "source", "file"));
LayerBuilder mockLayerBuilder = Mockito.mock(LayerBuilder.class);
Mockito.when(mockLayerBuilder.build()).thenReturn(unwrittenLayer);
Mockito.when(mockLayerBuilder.getSourceFiles()).thenReturn(fakeSourceFiles);
CachedLayer cachedLayer = cacheWriter.writeLayer(mockLayerBuilder);
CachedLayerWithMetadata layerInMetadata = testCache.getMetadata().getLayers().get(0);
Assert.assertNotNull(layerInMetadata.getMetadata());
Assert.assertEquals(Collections.singletonList(Paths.get("some", "source", "file").toString()), layerInMetadata.getMetadata().getSourceFiles());
verifyCachedLayerIsExpected(expectedLayer, cachedLayer);
}
use of com.google.cloud.tools.jib.image.UnwrittenLayer in project jib by google.
the class CacheWriter method writeLayer.
/**
* Builds an {@link UnwrittenLayer} from a {@link LayerBuilder} and compresses and writes the
* {@link UnwrittenLayer}'s uncompressed layer content BLOB to cache.
*
* @param layerBuilder the layer builder
* @return the cached layer
*/
public CachedLayer writeLayer(LayerBuilder layerBuilder) throws IOException, LayerPropertyNotFoundException {
UnwrittenLayer unwrittenLayer = layerBuilder.build();
// Writes to a temporary file first because the UnwrittenLayer needs to be written first to
// obtain its digest.
Path tempLayerFile = Files.createTempFile(cache.getCacheDirectory(), null, null);
// TODO: Find a way to do this with java.nio.file
tempLayerFile.toFile().deleteOnExit();
// Writes the UnwrittenLayer layer BLOB to a file to convert into a CachedLayer.
try (CountingDigestOutputStream compressedDigestOutputStream = new CountingDigestOutputStream(new BufferedOutputStream(Files.newOutputStream(tempLayerFile)))) {
// Writes the layer with GZIP compression. The original bytes are captured as the layer's
// diff ID and the bytes outputted from the GZIP compression are captured as the layer's
// content descriptor.
GZIPOutputStream compressorStream = new GZIPOutputStream(compressedDigestOutputStream);
DescriptorDigest diffId = unwrittenLayer.getBlob().writeTo(compressorStream).getDigest();
// The GZIPOutputStream must be closed in order to write out the remaining compressed data.
compressorStream.close();
BlobDescriptor compressedBlobDescriptor = compressedDigestOutputStream.toBlobDescriptor();
// Renames the temporary layer file to the correct filename. If the file already exists, we
// skip renaming and use the existing file. This happens if a new layer happens to have the
// same content as a previously-cached layer.
Path layerFile = getLayerFile(compressedBlobDescriptor.getDigest());
Files.move(tempLayerFile, layerFile, StandardCopyOption.REPLACE_EXISTING);
CachedLayer cachedLayer = new CachedLayer(layerFile, compressedBlobDescriptor, diffId);
LayerMetadata layerMetadata = LayerMetadata.from(layerBuilder.getSourceFiles(), FileTime.from(Instant.now()));
cache.addLayerToMetadata(cachedLayer, layerMetadata);
return cachedLayer;
}
}
Aggregations