From 8a8117b7f3bd7eb66c4fa4f6d34af0c14289ad0e Mon Sep 17 00:00:00 2001 From: Tad Cordle Date: Thu, 3 May 2018 15:40:51 -0400 Subject: [PATCH 1/8] Break apart container configuration build and push step --- .../cloud/tools/jib/blob/BlobAndDigest.java | 36 ++++++++++ ...a => BuildContainerConfigurationStep.java} | 35 +++------- .../tools/jib/builder/BuildImageSteps.java | 29 +++++--- .../PushContainerConfigurationStep.java | 69 +++++++++++++++++++ 4 files changed, 134 insertions(+), 35 deletions(-) create mode 100644 jib-core/src/main/java/com/google/cloud/tools/jib/blob/BlobAndDigest.java rename jib-core/src/main/java/com/google/cloud/tools/jib/builder/{BuildAndPushContainerConfigurationStep.java => BuildContainerConfigurationStep.java} (77%) create mode 100644 jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/blob/BlobAndDigest.java b/jib-core/src/main/java/com/google/cloud/tools/jib/blob/BlobAndDigest.java new file mode 100644 index 0000000000..40094a8fbc --- /dev/null +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/blob/BlobAndDigest.java @@ -0,0 +1,36 @@ +/* + * Copyright 2018 Google LLC. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.google.cloud.tools.jib.blob; + +/** Struct for pairing a Blob and its digest. */ +public class BlobAndDigest { + private Blob blob; + private BlobDescriptor blobDescriptor; + + public BlobAndDigest(Blob blob, BlobDescriptor blobDescriptor) { + this.blob = blob; + this.blobDescriptor = blobDescriptor; + } + + public Blob getBlob() { + return blob; + } + + public BlobDescriptor getBlobDescriptor() { + return blobDescriptor; + } +} diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildAndPushContainerConfigurationStep.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java similarity index 77% rename from jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildAndPushContainerConfigurationStep.java rename to jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java index fae50e7cf9..890cecff85 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildAndPushContainerConfigurationStep.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java @@ -18,15 +18,13 @@ import com.google.cloud.tools.jib.Timer; import com.google.cloud.tools.jib.blob.Blob; -import com.google.cloud.tools.jib.blob.BlobDescriptor; +import com.google.cloud.tools.jib.blob.BlobAndDigest; import com.google.cloud.tools.jib.cache.CachedLayer; import com.google.cloud.tools.jib.hash.CountingDigestOutputStream; import com.google.cloud.tools.jib.http.Authorization; import com.google.cloud.tools.jib.image.Image; import com.google.cloud.tools.jib.image.LayerPropertyNotFoundException; import com.google.cloud.tools.jib.image.json.ImageToJsonTranslator; -import com.google.cloud.tools.jib.registry.RegistryClient; -import com.google.cloud.tools.jib.registry.RegistryException; import com.google.common.io.ByteStreams; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -38,7 +36,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -class BuildAndPushContainerConfigurationStep implements Callable> { +class BuildContainerConfigurationStep implements Callable> { private static final String DESCRIPTION = "Building container configuration"; @@ -50,7 +48,7 @@ class BuildAndPushContainerConfigurationStep implements Callable> buildApplicationLayerFutures; private final List entrypoint; - BuildAndPushContainerConfigurationStep( + BuildContainerConfigurationStep( BuildConfiguration buildConfiguration, ListeningExecutorService listeningExecutorService, ListenableFuture pushAuthorizationFuture, @@ -67,7 +65,7 @@ class BuildAndPushContainerConfigurationStep implements Callable call() throws ExecutionException, InterruptedException { + public ListenableFuture call() throws ExecutionException, InterruptedException { // TODO: This might need to belong in BuildImageSteps. List> afterBaseImageLayerFuturesFutureDependencies = new ArrayList<>(); afterBaseImageLayerFuturesFutureDependencies.add(pushAuthorizationFuture); @@ -82,17 +80,9 @@ public ListenableFuture call() throws ExecutionException, Interr * Depends on {@code pushAuthorizationFuture}, {@code pullBaseImageLayerFuturesFuture.get()}, and * {@code buildApplicationLayerFutures}. */ - private BlobDescriptor afterBaseImageLayerFuturesFuture() - throws ExecutionException, InterruptedException, LayerPropertyNotFoundException, IOException, - RegistryException { - try (Timer timer = new Timer(buildConfiguration.getBuildLogger(), DESCRIPTION)) { - RegistryClient registryClient = - new RegistryClient( - NonBlockingFutures.get(pushAuthorizationFuture), - buildConfiguration.getTargetRegistry(), - buildConfiguration.getTargetRepository()) - .setTimer(timer); - + private BlobAndDigest afterBaseImageLayerFuturesFuture() + throws ExecutionException, InterruptedException, LayerPropertyNotFoundException, IOException { + try (Timer ignored = new Timer(buildConfiguration.getBuildLogger(), DESCRIPTION)) { // Constructs the image. Image image = new Image(); for (Future cachedLayerFuture : @@ -112,17 +102,8 @@ private BlobDescriptor afterBaseImageLayerFuturesFuture() CountingDigestOutputStream digestOutputStream = new CountingDigestOutputStream(ByteStreams.nullOutputStream()); containerConfigurationBlob.writeTo(digestOutputStream); - BlobDescriptor containerConfigurationBlobDescriptor = digestOutputStream.toBlobDescriptor(); - - timer.lap( - "Pushing container configuration " + containerConfigurationBlobDescriptor.getDigest()); - - // TODO: Use PushBlobStep. - // Pushes the container configuration. - registryClient.pushBlob( - containerConfigurationBlobDescriptor.getDigest(), containerConfigurationBlob); - return containerConfigurationBlobDescriptor; + return new BlobAndDigest(containerConfigurationBlob, digestOutputStream.toBlobDescriptor()); } } } diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java index 1889c2cf15..b63c4afaee 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java @@ -17,6 +17,7 @@ package com.google.cloud.tools.jib.builder; import com.google.cloud.tools.jib.Timer; +import com.google.cloud.tools.jib.blob.BlobAndDigest; import com.google.cloud.tools.jib.blob.BlobDescriptor; import com.google.cloud.tools.jib.cache.Cache; import com.google.cloud.tools.jib.cache.CacheDirectoryNotOwnedException; @@ -144,13 +145,13 @@ public void run() listeningExecutorService) .call(); - timer2.lap("Setting up container configuration push"); - // Builds and pushes the container configuration. - ListenableFuture> - buildAndPushContainerConfigurationFutureFuture = + timer2.lap("Building container configuration"); + // Builds the container configuration. + ListenableFuture> + buildContainerConfigurationFutureFuture = Futures.whenAllSucceed(pullBaseImageLayerFuturesFuture) .call( - new BuildAndPushContainerConfigurationStep( + new BuildContainerConfigurationStep( buildConfiguration, listeningExecutorService, authenticatePushFuture, @@ -159,6 +160,19 @@ public void run() entrypoint), listeningExecutorService); + timer2.lap("Setting up container configuration push"); + // Pushes the container configuration. + ListenableFuture> + pushContainerConfigurationFutureFuture = + Futures.whenAllSucceed(buildContainerConfigurationFutureFuture) + .call( + new PushContainerConfigurationStep( + buildConfiguration, + authenticatePushFuture, + buildContainerConfigurationFutureFuture.get(), + listeningExecutorService), + listeningExecutorService); + timer2.lap("Setting up application layer push"); // Pushes the application layers. List> pushApplicationLayersFuture = @@ -173,8 +187,7 @@ public void run() // Pushes the new image manifest. ListenableFuture pushImageFuture = Futures.whenAllSucceed( - pushBaseImageLayerFuturesFuture, - buildAndPushContainerConfigurationFutureFuture) + pushBaseImageLayerFuturesFuture, pushContainerConfigurationFutureFuture) .call( new PushImageStep( buildConfiguration, @@ -184,7 +197,7 @@ public void run() buildAndCacheApplicationLayerFutures, pushBaseImageLayerFuturesFuture, pushApplicationLayersFuture, - buildAndPushContainerConfigurationFutureFuture), + pushContainerConfigurationFutureFuture), listeningExecutorService); timer2.lap("Running push new image"); diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java new file mode 100644 index 0000000000..eebf3ee794 --- /dev/null +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java @@ -0,0 +1,69 @@ +/* + * Copyright 2018 Google LLC. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.google.cloud.tools.jib.builder; + +import com.google.cloud.tools.jib.Timer; +import com.google.cloud.tools.jib.blob.BlobAndDigest; +import com.google.cloud.tools.jib.blob.BlobDescriptor; +import com.google.cloud.tools.jib.http.Authorization; +import com.google.cloud.tools.jib.registry.RegistryClient; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; +import java.util.concurrent.Callable; + +class PushContainerConfigurationStep implements Callable> { + + private static final String DESCRIPTION = "Pushing container configuration"; + + private final BuildConfiguration buildConfiguration; + private final ListenableFuture pushAuthorizationFuture; + private final ListenableFuture blobAndDigestFuture; + private final ListeningExecutorService listeningExecutorService; + + PushContainerConfigurationStep( + BuildConfiguration buildConfiguration, + ListenableFuture pushAuthorizationFuture, + ListenableFuture blobAndDigestFuture, + ListeningExecutorService listeningExecutorService) { + this.buildConfiguration = buildConfiguration; + this.pushAuthorizationFuture = pushAuthorizationFuture; + this.blobAndDigestFuture = blobAndDigestFuture; + this.listeningExecutorService = listeningExecutorService; + } + + @Override + public ListenableFuture call() { + return listeningExecutorService.submit( + () -> { + try (Timer timer = new Timer(buildConfiguration.getBuildLogger(), DESCRIPTION)) { + RegistryClient registryClient = + new RegistryClient( + NonBlockingFutures.get(pushAuthorizationFuture), + buildConfiguration.getTargetRegistry(), + buildConfiguration.getTargetRepository()) + .setTimer(timer); + + // TODO: Use PushBlobStep. + // Pushes the container configuration. + BlobAndDigest blobAndDigest = blobAndDigestFuture.get(); + registryClient.pushBlob( + blobAndDigest.getBlobDescriptor().getDigest(), blobAndDigest.getBlob()); + return blobAndDigest.getBlobDescriptor(); + } + }); + } +} From 995c3aa70c2245679d260e6fe963b384b2287b4b Mon Sep 17 00:00:00 2001 From: Tad Cordle Date: Thu, 3 May 2018 15:49:41 -0400 Subject: [PATCH 2/8] Debug message consistency --- .../com/google/cloud/tools/jib/builder/BuildImageSteps.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java index b63c4afaee..5a8db8d6a9 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java @@ -145,7 +145,7 @@ public void run() listeningExecutorService) .call(); - timer2.lap("Building container configuration"); + timer2.lap("Setting up build container configuration"); // Builds the container configuration. ListenableFuture> buildContainerConfigurationFutureFuture = From b71b3a104f7fce82adc8a2e0bf1e3a495995c2c4 Mon Sep 17 00:00:00 2001 From: Tad Cordle Date: Thu, 3 May 2018 17:01:36 -0400 Subject: [PATCH 3/8] Delete tuple --- .../cloud/tools/jib/blob/BlobAndDigest.java | 36 ----------- .../BuildContainerConfigurationStep.java | 16 ++--- .../tools/jib/builder/BuildImageSteps.java | 29 +++++---- .../PushContainerConfigurationStep.java | 63 ++++++++++++------- 4 files changed, 59 insertions(+), 85 deletions(-) delete mode 100644 jib-core/src/main/java/com/google/cloud/tools/jib/blob/BlobAndDigest.java diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/blob/BlobAndDigest.java b/jib-core/src/main/java/com/google/cloud/tools/jib/blob/BlobAndDigest.java deleted file mode 100644 index 40094a8fbc..0000000000 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/blob/BlobAndDigest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2018 Google LLC. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.google.cloud.tools.jib.blob; - -/** Struct for pairing a Blob and its digest. */ -public class BlobAndDigest { - private Blob blob; - private BlobDescriptor blobDescriptor; - - public BlobAndDigest(Blob blob, BlobDescriptor blobDescriptor) { - this.blob = blob; - this.blobDescriptor = blobDescriptor; - } - - public Blob getBlob() { - return blob; - } - - public BlobDescriptor getBlobDescriptor() { - return blobDescriptor; - } -} diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java index 890cecff85..65f1376a3e 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java @@ -18,14 +18,11 @@ import com.google.cloud.tools.jib.Timer; import com.google.cloud.tools.jib.blob.Blob; -import com.google.cloud.tools.jib.blob.BlobAndDigest; import com.google.cloud.tools.jib.cache.CachedLayer; -import com.google.cloud.tools.jib.hash.CountingDigestOutputStream; import com.google.cloud.tools.jib.http.Authorization; import com.google.cloud.tools.jib.image.Image; import com.google.cloud.tools.jib.image.LayerPropertyNotFoundException; import com.google.cloud.tools.jib.image.json.ImageToJsonTranslator; -import com.google.common.io.ByteStreams; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; @@ -36,7 +33,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -class BuildContainerConfigurationStep implements Callable> { +class BuildContainerConfigurationStep implements Callable> { private static final String DESCRIPTION = "Building container configuration"; @@ -65,7 +62,7 @@ class BuildContainerConfigurationStep implements Callable call() throws ExecutionException, InterruptedException { + public ListenableFuture call() throws ExecutionException, InterruptedException { // TODO: This might need to belong in BuildImageSteps. List> afterBaseImageLayerFuturesFutureDependencies = new ArrayList<>(); afterBaseImageLayerFuturesFutureDependencies.add(pushAuthorizationFuture); @@ -80,7 +77,7 @@ public ListenableFuture call() throws ExecutionException, Interru * Depends on {@code pushAuthorizationFuture}, {@code pullBaseImageLayerFuturesFuture.get()}, and * {@code buildApplicationLayerFutures}. */ - private BlobAndDigest afterBaseImageLayerFuturesFuture() + private Blob afterBaseImageLayerFuturesFuture() throws ExecutionException, InterruptedException, LayerPropertyNotFoundException, IOException { try (Timer ignored = new Timer(buildConfiguration.getBuildLogger(), DESCRIPTION)) { // Constructs the image. @@ -98,12 +95,7 @@ private BlobAndDigest afterBaseImageLayerFuturesFuture() ImageToJsonTranslator imageToJsonTranslator = new ImageToJsonTranslator(image); // Gets the container configuration content descriptor. - Blob containerConfigurationBlob = imageToJsonTranslator.getContainerConfigurationBlob(); - CountingDigestOutputStream digestOutputStream = - new CountingDigestOutputStream(ByteStreams.nullOutputStream()); - containerConfigurationBlob.writeTo(digestOutputStream); - - return new BlobAndDigest(containerConfigurationBlob, digestOutputStream.toBlobDescriptor()); + return imageToJsonTranslator.getContainerConfigurationBlob(); } } } diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java index 5a8db8d6a9..2de31d301b 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java @@ -17,7 +17,7 @@ package com.google.cloud.tools.jib.builder; import com.google.cloud.tools.jib.Timer; -import com.google.cloud.tools.jib.blob.BlobAndDigest; +import com.google.cloud.tools.jib.blob.Blob; import com.google.cloud.tools.jib.blob.BlobDescriptor; import com.google.cloud.tools.jib.cache.Cache; import com.google.cloud.tools.jib.cache.CacheDirectoryNotOwnedException; @@ -147,29 +147,28 @@ public void run() timer2.lap("Setting up build container configuration"); // Builds the container configuration. - ListenableFuture> - buildContainerConfigurationFutureFuture = - Futures.whenAllSucceed(pullBaseImageLayerFuturesFuture) - .call( - new BuildContainerConfigurationStep( - buildConfiguration, - listeningExecutorService, - authenticatePushFuture, - pullBaseImageLayerFuturesFuture, - buildAndCacheApplicationLayerFutures, - entrypoint), - listeningExecutorService); + ListenableFuture> buildContainerConfigurationFuturesFuture = + Futures.whenAllSucceed(pullBaseImageLayerFuturesFuture) + .call( + new BuildContainerConfigurationStep( + buildConfiguration, + listeningExecutorService, + authenticatePushFuture, + pullBaseImageLayerFuturesFuture, + buildAndCacheApplicationLayerFutures, + entrypoint), + listeningExecutorService); timer2.lap("Setting up container configuration push"); // Pushes the container configuration. ListenableFuture> pushContainerConfigurationFutureFuture = - Futures.whenAllSucceed(buildContainerConfigurationFutureFuture) + Futures.whenAllSucceed(buildContainerConfigurationFuturesFuture) .call( new PushContainerConfigurationStep( buildConfiguration, authenticatePushFuture, - buildContainerConfigurationFutureFuture.get(), + buildContainerConfigurationFuturesFuture, listeningExecutorService), listeningExecutorService); diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java index eebf3ee794..d9fc36c5fd 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java @@ -17,13 +17,21 @@ package com.google.cloud.tools.jib.builder; import com.google.cloud.tools.jib.Timer; -import com.google.cloud.tools.jib.blob.BlobAndDigest; +import com.google.cloud.tools.jib.blob.Blob; import com.google.cloud.tools.jib.blob.BlobDescriptor; +import com.google.cloud.tools.jib.hash.CountingDigestOutputStream; import com.google.cloud.tools.jib.http.Authorization; import com.google.cloud.tools.jib.registry.RegistryClient; +import com.google.cloud.tools.jib.registry.RegistryException; +import com.google.common.io.ByteStreams; +import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; class PushContainerConfigurationStep implements Callable> { @@ -31,39 +39,50 @@ class PushContainerConfigurationStep implements Callable pushAuthorizationFuture; - private final ListenableFuture blobAndDigestFuture; + private final ListenableFuture> blobFuturesFuture; private final ListeningExecutorService listeningExecutorService; PushContainerConfigurationStep( BuildConfiguration buildConfiguration, ListenableFuture pushAuthorizationFuture, - ListenableFuture blobAndDigestFuture, + ListenableFuture> blobFuturesFuture, ListeningExecutorService listeningExecutorService) { this.buildConfiguration = buildConfiguration; this.pushAuthorizationFuture = pushAuthorizationFuture; - this.blobAndDigestFuture = blobAndDigestFuture; + this.blobFuturesFuture = blobFuturesFuture; this.listeningExecutorService = listeningExecutorService; } + /** Depends on {@code blobFutureFuture}. */ @Override - public ListenableFuture call() { - return listeningExecutorService.submit( - () -> { - try (Timer timer = new Timer(buildConfiguration.getBuildLogger(), DESCRIPTION)) { - RegistryClient registryClient = - new RegistryClient( - NonBlockingFutures.get(pushAuthorizationFuture), - buildConfiguration.getTargetRegistry(), - buildConfiguration.getTargetRepository()) - .setTimer(timer); + public ListenableFuture call() throws ExecutionException, InterruptedException { + List> afterBlobFutureFutureDependencies = new ArrayList<>(); + afterBlobFutureFutureDependencies.add(pushAuthorizationFuture); + afterBlobFutureFutureDependencies.add(NonBlockingFutures.get(blobFuturesFuture)); + return Futures.whenAllSucceed(afterBlobFutureFutureDependencies) + .call(this::afterBlobFuturesFuture, listeningExecutorService); + } + + /** Depends on {@code blobFutureFuture.get()} and {@code pushAuthorizationFuture}. */ + private BlobDescriptor afterBlobFuturesFuture() + throws ExecutionException, InterruptedException, IOException, RegistryException { + try (Timer timer = new Timer(buildConfiguration.getBuildLogger(), DESCRIPTION)) { + RegistryClient registryClient = + new RegistryClient( + NonBlockingFutures.get(pushAuthorizationFuture), + buildConfiguration.getTargetRegistry(), + buildConfiguration.getTargetRepository()) + .setTimer(timer); + + // TODO: Use PushBlobStep. + // Pushes the container configuration. + CountingDigestOutputStream digestOutputStream = + new CountingDigestOutputStream(ByteStreams.nullOutputStream()); + Blob blob = NonBlockingFutures.get(NonBlockingFutures.get(blobFuturesFuture)); + blob.writeTo(digestOutputStream); - // TODO: Use PushBlobStep. - // Pushes the container configuration. - BlobAndDigest blobAndDigest = blobAndDigestFuture.get(); - registryClient.pushBlob( - blobAndDigest.getBlobDescriptor().getDigest(), blobAndDigest.getBlob()); - return blobAndDigest.getBlobDescriptor(); - } - }); + registryClient.pushBlob(digestOutputStream.toBlobDescriptor().getDigest(), blob); + return digestOutputStream.toBlobDescriptor(); + } } } From c6fba8cf868e55c528f7019dc6205df17635480e Mon Sep 17 00:00:00 2001 From: Tad Cordle Date: Fri, 4 May 2018 11:47:22 -0400 Subject: [PATCH 4/8] Fix blob descriptor error --- .../BuildContainerConfigurationStep.java | 12 ++--------- .../tools/jib/builder/BuildImageSteps.java | 1 - .../PushContainerConfigurationStep.java | 21 ++++++++++--------- .../jib/hash/CountingDigestOutputStream.java | 5 ++++- 4 files changed, 17 insertions(+), 22 deletions(-) diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java index 65f1376a3e..5dd9600c87 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java @@ -19,14 +19,12 @@ import com.google.cloud.tools.jib.Timer; import com.google.cloud.tools.jib.blob.Blob; import com.google.cloud.tools.jib.cache.CachedLayer; -import com.google.cloud.tools.jib.http.Authorization; import com.google.cloud.tools.jib.image.Image; import com.google.cloud.tools.jib.image.LayerPropertyNotFoundException; import com.google.cloud.tools.jib.image.json.ImageToJsonTranslator; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; -import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; @@ -39,7 +37,6 @@ class BuildContainerConfigurationStep implements Callable private final BuildConfiguration buildConfiguration; private final ListeningExecutorService listeningExecutorService; - private final ListenableFuture pushAuthorizationFuture; private final ListenableFuture>> pullBaseImageLayerFuturesFuture; private final List> buildApplicationLayerFutures; @@ -48,13 +45,11 @@ class BuildContainerConfigurationStep implements Callable BuildContainerConfigurationStep( BuildConfiguration buildConfiguration, ListeningExecutorService listeningExecutorService, - ListenableFuture pushAuthorizationFuture, ListenableFuture>> pullBaseImageLayerFuturesFuture, List> buildApplicationLayerFutures, List entrypoint) { this.buildConfiguration = buildConfiguration; this.listeningExecutorService = listeningExecutorService; - this.pushAuthorizationFuture = pushAuthorizationFuture; this.pullBaseImageLayerFuturesFuture = pullBaseImageLayerFuturesFuture; this.buildApplicationLayerFutures = buildApplicationLayerFutures; this.entrypoint = entrypoint; @@ -65,7 +60,6 @@ class BuildContainerConfigurationStep implements Callable public ListenableFuture call() throws ExecutionException, InterruptedException { // TODO: This might need to belong in BuildImageSteps. List> afterBaseImageLayerFuturesFutureDependencies = new ArrayList<>(); - afterBaseImageLayerFuturesFutureDependencies.add(pushAuthorizationFuture); afterBaseImageLayerFuturesFutureDependencies.addAll( NonBlockingFutures.get(pullBaseImageLayerFuturesFuture)); afterBaseImageLayerFuturesFutureDependencies.addAll(buildApplicationLayerFutures); @@ -78,7 +72,7 @@ public ListenableFuture call() throws ExecutionException, InterruptedExcep * {@code buildApplicationLayerFutures}. */ private Blob afterBaseImageLayerFuturesFuture() - throws ExecutionException, InterruptedException, LayerPropertyNotFoundException, IOException { + throws ExecutionException, InterruptedException, LayerPropertyNotFoundException { try (Timer ignored = new Timer(buildConfiguration.getBuildLogger(), DESCRIPTION)) { // Constructs the image. Image image = new Image(); @@ -92,10 +86,8 @@ private Blob afterBaseImageLayerFuturesFuture() image.setEnvironment(buildConfiguration.getEnvironment()); image.setEntrypoint(entrypoint); - ImageToJsonTranslator imageToJsonTranslator = new ImageToJsonTranslator(image); - // Gets the container configuration content descriptor. - return imageToJsonTranslator.getContainerConfigurationBlob(); + return new ImageToJsonTranslator(image).getContainerConfigurationBlob(); } } } diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java index 2de31d301b..c36bf7bd54 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java @@ -153,7 +153,6 @@ public void run() new BuildContainerConfigurationStep( buildConfiguration, listeningExecutorService, - authenticatePushFuture, pullBaseImageLayerFuturesFuture, buildAndCacheApplicationLayerFutures, entrypoint), diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java index d9fc36c5fd..cafa84ebe3 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java @@ -53,20 +53,22 @@ class PushContainerConfigurationStep implements Callable call() throws ExecutionException, InterruptedException { - List> afterBlobFutureFutureDependencies = new ArrayList<>(); - afterBlobFutureFutureDependencies.add(pushAuthorizationFuture); - afterBlobFutureFutureDependencies.add(NonBlockingFutures.get(blobFuturesFuture)); - return Futures.whenAllSucceed(afterBlobFutureFutureDependencies) + List> blobFuturesFutureDependencies = new ArrayList<>(); + blobFuturesFutureDependencies.add(pushAuthorizationFuture); + blobFuturesFutureDependencies.add(NonBlockingFutures.get(blobFuturesFuture)); + return Futures.whenAllSucceed(blobFuturesFutureDependencies) .call(this::afterBlobFuturesFuture, listeningExecutorService); } - /** Depends on {@code blobFutureFuture.get()} and {@code pushAuthorizationFuture}. */ + /** Depends on {@code blobFuturesFuture.get()} and {@code pushAuthorizationFuture}. */ private BlobDescriptor afterBlobFuturesFuture() throws ExecutionException, InterruptedException, IOException, RegistryException { try (Timer timer = new Timer(buildConfiguration.getBuildLogger(), DESCRIPTION)) { + // TODO: Use PushBlobStep. + // Pushes the container configuration. RegistryClient registryClient = new RegistryClient( NonBlockingFutures.get(pushAuthorizationFuture), @@ -74,15 +76,14 @@ private BlobDescriptor afterBlobFuturesFuture() buildConfiguration.getTargetRepository()) .setTimer(timer); - // TODO: Use PushBlobStep. - // Pushes the container configuration. CountingDigestOutputStream digestOutputStream = new CountingDigestOutputStream(ByteStreams.nullOutputStream()); Blob blob = NonBlockingFutures.get(NonBlockingFutures.get(blobFuturesFuture)); blob.writeTo(digestOutputStream); - registryClient.pushBlob(digestOutputStream.toBlobDescriptor().getDigest(), blob); - return digestOutputStream.toBlobDescriptor(); + BlobDescriptor descriptor = digestOutputStream.toBlobDescriptor(); + registryClient.pushBlob(descriptor.getDigest(), blob); + return descriptor; } } } diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/hash/CountingDigestOutputStream.java b/jib-core/src/main/java/com/google/cloud/tools/jib/hash/CountingDigestOutputStream.java index fd82a758a7..fcb78218fb 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/hash/CountingDigestOutputStream.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/hash/CountingDigestOutputStream.java @@ -44,7 +44,10 @@ public CountingDigestOutputStream(OutputStream outputStream) { } } - /** Builds a {@link BlobDescriptor} with the hash and size of the bytes written. */ + /** + * Builds a {@link BlobDescriptor} with the hash and size of the bytes written. The buffer resets + * after this method is called, so this method should only be called once per BlobDescriptor. + */ public BlobDescriptor toBlobDescriptor() { try { byte[] hashedBytes = digest.digest(); From cb89a3bf602d8a789743a677bc158dd1736b53c9 Mon Sep 17 00:00:00 2001 From: Tad Cordle Date: Fri, 4 May 2018 12:47:18 -0400 Subject: [PATCH 5/8] Naming, javadocs --- .../builder/BuildContainerConfigurationStep.java | 9 +++++---- .../cloud/tools/jib/builder/BuildImageSteps.java | 6 +++--- .../jib/builder/PushContainerConfigurationStep.java | 13 ++++++++----- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java index 5dd9600c87..dbff09fdb1 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java @@ -31,6 +31,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +/** Builds the container configuration. */ class BuildContainerConfigurationStep implements Callable> { private static final String DESCRIPTION = "Building container configuration"; @@ -59,11 +60,11 @@ class BuildContainerConfigurationStep implements Callable @Override public ListenableFuture call() throws ExecutionException, InterruptedException { // TODO: This might need to belong in BuildImageSteps. - List> afterBaseImageLayerFuturesFutureDependencies = new ArrayList<>(); - afterBaseImageLayerFuturesFutureDependencies.addAll( + List> afterBaseImageLayerFutureFutureDependencies = new ArrayList<>(); + afterBaseImageLayerFutureFutureDependencies.addAll( NonBlockingFutures.get(pullBaseImageLayerFuturesFuture)); - afterBaseImageLayerFuturesFutureDependencies.addAll(buildApplicationLayerFutures); - return Futures.whenAllSucceed(afterBaseImageLayerFuturesFutureDependencies) + afterBaseImageLayerFutureFutureDependencies.addAll(buildApplicationLayerFutures); + return Futures.whenAllSucceed(afterBaseImageLayerFutureFutureDependencies) .call(this::afterBaseImageLayerFuturesFuture, listeningExecutorService); } diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java index c36bf7bd54..f98502bc6a 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildImageSteps.java @@ -147,7 +147,7 @@ public void run() timer2.lap("Setting up build container configuration"); // Builds the container configuration. - ListenableFuture> buildContainerConfigurationFuturesFuture = + ListenableFuture> buildContainerConfigurationFutureFuture = Futures.whenAllSucceed(pullBaseImageLayerFuturesFuture) .call( new BuildContainerConfigurationStep( @@ -162,12 +162,12 @@ public void run() // Pushes the container configuration. ListenableFuture> pushContainerConfigurationFutureFuture = - Futures.whenAllSucceed(buildContainerConfigurationFuturesFuture) + Futures.whenAllSucceed(buildContainerConfigurationFutureFuture) .call( new PushContainerConfigurationStep( buildConfiguration, authenticatePushFuture, - buildContainerConfigurationFuturesFuture, + buildContainerConfigurationFutureFuture, listeningExecutorService), listeningExecutorService); diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java index cafa84ebe3..b06ebbd6fb 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java @@ -33,23 +33,24 @@ import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; +/** Pushes the container configuration. */ class PushContainerConfigurationStep implements Callable> { private static final String DESCRIPTION = "Pushing container configuration"; private final BuildConfiguration buildConfiguration; private final ListenableFuture pushAuthorizationFuture; - private final ListenableFuture> blobFuturesFuture; + private final ListenableFuture> buildContainerConfigurationFutureFuture; private final ListeningExecutorService listeningExecutorService; PushContainerConfigurationStep( BuildConfiguration buildConfiguration, ListenableFuture pushAuthorizationFuture, - ListenableFuture> blobFuturesFuture, + ListenableFuture> buildContainerConfigurationFutureFuture, ListeningExecutorService listeningExecutorService) { this.buildConfiguration = buildConfiguration; this.pushAuthorizationFuture = pushAuthorizationFuture; - this.blobFuturesFuture = blobFuturesFuture; + this.buildContainerConfigurationFutureFuture = buildContainerConfigurationFutureFuture; this.listeningExecutorService = listeningExecutorService; } @@ -58,7 +59,8 @@ class PushContainerConfigurationStep implements Callable call() throws ExecutionException, InterruptedException { List> blobFuturesFutureDependencies = new ArrayList<>(); blobFuturesFutureDependencies.add(pushAuthorizationFuture); - blobFuturesFutureDependencies.add(NonBlockingFutures.get(blobFuturesFuture)); + blobFuturesFutureDependencies.add( + NonBlockingFutures.get(buildContainerConfigurationFutureFuture)); return Futures.whenAllSucceed(blobFuturesFutureDependencies) .call(this::afterBlobFuturesFuture, listeningExecutorService); } @@ -78,7 +80,8 @@ private BlobDescriptor afterBlobFuturesFuture() CountingDigestOutputStream digestOutputStream = new CountingDigestOutputStream(ByteStreams.nullOutputStream()); - Blob blob = NonBlockingFutures.get(NonBlockingFutures.get(blobFuturesFuture)); + Blob blob = + NonBlockingFutures.get(NonBlockingFutures.get(buildContainerConfigurationFutureFuture)); blob.writeTo(digestOutputStream); BlobDescriptor descriptor = digestOutputStream.toBlobDescriptor(); From dc784ff9e8aacd76a610d23392a5027dcd01eb03 Mon Sep 17 00:00:00 2001 From: Tad Cordle Date: Fri, 4 May 2018 13:51:07 -0400 Subject: [PATCH 6/8] Naming --- .../BuildContainerConfigurationStep.java | 8 ++++---- .../PushContainerConfigurationStep.java | 18 +++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java index dbff09fdb1..bbcde14340 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/BuildContainerConfigurationStep.java @@ -60,11 +60,11 @@ class BuildContainerConfigurationStep implements Callable @Override public ListenableFuture call() throws ExecutionException, InterruptedException { // TODO: This might need to belong in BuildImageSteps. - List> afterBaseImageLayerFutureFutureDependencies = new ArrayList<>(); - afterBaseImageLayerFutureFutureDependencies.addAll( + List> afterBaseImageLayerFuturesFutureDependencies = new ArrayList<>(); + afterBaseImageLayerFuturesFutureDependencies.addAll( NonBlockingFutures.get(pullBaseImageLayerFuturesFuture)); - afterBaseImageLayerFutureFutureDependencies.addAll(buildApplicationLayerFutures); - return Futures.whenAllSucceed(afterBaseImageLayerFutureFutureDependencies) + afterBaseImageLayerFuturesFutureDependencies.addAll(buildApplicationLayerFutures); + return Futures.whenAllSucceed(afterBaseImageLayerFuturesFutureDependencies) .call(this::afterBaseImageLayerFuturesFuture, listeningExecutorService); } diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java index b06ebbd6fb..2c6bc76d8f 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java @@ -57,16 +57,16 @@ class PushContainerConfigurationStep implements Callable call() throws ExecutionException, InterruptedException { - List> blobFuturesFutureDependencies = new ArrayList<>(); - blobFuturesFutureDependencies.add(pushAuthorizationFuture); - blobFuturesFutureDependencies.add( + List> afterConfigBuildFutureFutureDependencies = new ArrayList<>(); + afterConfigBuildFutureFutureDependencies.add(pushAuthorizationFuture); + afterConfigBuildFutureFutureDependencies.add( NonBlockingFutures.get(buildContainerConfigurationFutureFuture)); - return Futures.whenAllSucceed(blobFuturesFutureDependencies) - .call(this::afterBlobFuturesFuture, listeningExecutorService); + return Futures.whenAllSucceed(afterConfigBuildFutureFutureDependencies) + .call(this::afterConfigBuildFutureFuture, listeningExecutorService); } /** Depends on {@code blobFuturesFuture.get()} and {@code pushAuthorizationFuture}. */ - private BlobDescriptor afterBlobFuturesFuture() + private BlobDescriptor afterConfigBuildFutureFuture() throws ExecutionException, InterruptedException, IOException, RegistryException { try (Timer timer = new Timer(buildConfiguration.getBuildLogger(), DESCRIPTION)) { // TODO: Use PushBlobStep. @@ -80,12 +80,12 @@ private BlobDescriptor afterBlobFuturesFuture() CountingDigestOutputStream digestOutputStream = new CountingDigestOutputStream(ByteStreams.nullOutputStream()); - Blob blob = + Blob containerConfigurationBlob = NonBlockingFutures.get(NonBlockingFutures.get(buildContainerConfigurationFutureFuture)); - blob.writeTo(digestOutputStream); + containerConfigurationBlob.writeTo(digestOutputStream); BlobDescriptor descriptor = digestOutputStream.toBlobDescriptor(); - registryClient.pushBlob(descriptor.getDigest(), blob); + registryClient.pushBlob(descriptor.getDigest(), containerConfigurationBlob); return descriptor; } } From c6fae59af50f4477b80efcf37a77eb7317990e27 Mon Sep 17 00:00:00 2001 From: Tad Cordle Date: Fri, 4 May 2018 13:54:43 -0400 Subject: [PATCH 7/8] Naming --- .../PushContainerConfigurationStep.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java index 2c6bc76d8f..73fd6103ef 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java @@ -40,7 +40,7 @@ class PushContainerConfigurationStep implements Callable pushAuthorizationFuture; - private final ListenableFuture> buildContainerConfigurationFutureFuture; + private final ListenableFuture> buildConfigFutureFuture; private final ListeningExecutorService listeningExecutorService; PushContainerConfigurationStep( @@ -50,23 +50,22 @@ class PushContainerConfigurationStep implements Callable call() throws ExecutionException, InterruptedException { - List> afterConfigBuildFutureFutureDependencies = new ArrayList<>(); - afterConfigBuildFutureFutureDependencies.add(pushAuthorizationFuture); - afterConfigBuildFutureFutureDependencies.add( - NonBlockingFutures.get(buildContainerConfigurationFutureFuture)); - return Futures.whenAllSucceed(afterConfigBuildFutureFutureDependencies) - .call(this::afterConfigBuildFutureFuture, listeningExecutorService); + List> afterBuildConfigFutureFutureDependencies = new ArrayList<>(); + afterBuildConfigFutureFutureDependencies.add(pushAuthorizationFuture); + afterBuildConfigFutureFutureDependencies.add(NonBlockingFutures.get(buildConfigFutureFuture)); + return Futures.whenAllSucceed(afterBuildConfigFutureFutureDependencies) + .call(this::afterBuildConfigFutureFuture, listeningExecutorService); } /** Depends on {@code blobFuturesFuture.get()} and {@code pushAuthorizationFuture}. */ - private BlobDescriptor afterConfigBuildFutureFuture() + private BlobDescriptor afterBuildConfigFutureFuture() throws ExecutionException, InterruptedException, IOException, RegistryException { try (Timer timer = new Timer(buildConfiguration.getBuildLogger(), DESCRIPTION)) { // TODO: Use PushBlobStep. @@ -81,7 +80,7 @@ private BlobDescriptor afterConfigBuildFutureFuture() CountingDigestOutputStream digestOutputStream = new CountingDigestOutputStream(ByteStreams.nullOutputStream()); Blob containerConfigurationBlob = - NonBlockingFutures.get(NonBlockingFutures.get(buildContainerConfigurationFutureFuture)); + NonBlockingFutures.get(NonBlockingFutures.get(buildConfigFutureFuture)); containerConfigurationBlob.writeTo(digestOutputStream); BlobDescriptor descriptor = digestOutputStream.toBlobDescriptor(); From 6a1b5916c535cc2281a27064770947fb9c75ce6c Mon Sep 17 00:00:00 2001 From: Tad Cordle Date: Fri, 4 May 2018 14:44:35 -0400 Subject: [PATCH 8/8] Naming --- .../PushContainerConfigurationStep.java | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java index 73fd6103ef..d143b4aa9d 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/builder/PushContainerConfigurationStep.java @@ -40,32 +40,35 @@ class PushContainerConfigurationStep implements Callable pushAuthorizationFuture; - private final ListenableFuture> buildConfigFutureFuture; + private final ListenableFuture> buildConfigurationFutureFuture; private final ListeningExecutorService listeningExecutorService; PushContainerConfigurationStep( BuildConfiguration buildConfiguration, ListenableFuture pushAuthorizationFuture, - ListenableFuture> buildContainerConfigurationFutureFuture, + ListenableFuture> buildConfigurationFutureFuture, ListeningExecutorService listeningExecutorService) { this.buildConfiguration = buildConfiguration; this.pushAuthorizationFuture = pushAuthorizationFuture; - this.buildConfigFutureFuture = buildContainerConfigurationFutureFuture; + this.buildConfigurationFutureFuture = buildConfigurationFutureFuture; this.listeningExecutorService = listeningExecutorService; } - /** Depends on {@code blobFuturesFuture} and {@code pushAuthorizationFuture}. */ + /** Depends on {@code buildConfigurationFutureFuture} and {@code pushAuthorizationFuture}. */ @Override public ListenableFuture call() throws ExecutionException, InterruptedException { - List> afterBuildConfigFutureFutureDependencies = new ArrayList<>(); - afterBuildConfigFutureFutureDependencies.add(pushAuthorizationFuture); - afterBuildConfigFutureFutureDependencies.add(NonBlockingFutures.get(buildConfigFutureFuture)); - return Futures.whenAllSucceed(afterBuildConfigFutureFutureDependencies) - .call(this::afterBuildConfigFutureFuture, listeningExecutorService); + List> afterBuildConfigurationFutureFutureDependencies = new ArrayList<>(); + afterBuildConfigurationFutureFutureDependencies.add(pushAuthorizationFuture); + afterBuildConfigurationFutureFutureDependencies.add( + NonBlockingFutures.get(buildConfigurationFutureFuture)); + return Futures.whenAllSucceed(afterBuildConfigurationFutureFutureDependencies) + .call(this::afterBuildConfigurationFutureFuture, listeningExecutorService); } - /** Depends on {@code blobFuturesFuture.get()} and {@code pushAuthorizationFuture}. */ - private BlobDescriptor afterBuildConfigFutureFuture() + /** + * Depends on {@code buildConfigurationFutureFuture.get()} and {@code pushAuthorizationFuture}. + */ + private BlobDescriptor afterBuildConfigurationFutureFuture() throws ExecutionException, InterruptedException, IOException, RegistryException { try (Timer timer = new Timer(buildConfiguration.getBuildLogger(), DESCRIPTION)) { // TODO: Use PushBlobStep. @@ -80,7 +83,7 @@ private BlobDescriptor afterBuildConfigFutureFuture() CountingDigestOutputStream digestOutputStream = new CountingDigestOutputStream(ByteStreams.nullOutputStream()); Blob containerConfigurationBlob = - NonBlockingFutures.get(NonBlockingFutures.get(buildConfigFutureFuture)); + NonBlockingFutures.get(NonBlockingFutures.get(buildConfigurationFutureFuture)); containerConfigurationBlob.writeTo(digestOutputStream); BlobDescriptor descriptor = digestOutputStream.toBlobDescriptor();