diff --git a/clouddriver-appengine/src/main/groovy/com/netflix/spinnaker/clouddriver/appengine/gcsClient/AppengineGcsRepositoryClient.groovy b/clouddriver-appengine/src/main/groovy/com/netflix/spinnaker/clouddriver/appengine/gcsClient/AppengineGcsRepositoryClient.groovy index 1e8e04c4b1c..780472d4a9b 100644 --- a/clouddriver-appengine/src/main/groovy/com/netflix/spinnaker/clouddriver/appengine/gcsClient/AppengineGcsRepositoryClient.groovy +++ b/clouddriver-appengine/src/main/groovy/com/netflix/spinnaker/clouddriver/appengine/gcsClient/AppengineGcsRepositoryClient.groovy @@ -20,11 +20,13 @@ import com.netflix.spinnaker.clouddriver.appengine.AppengineJobExecutor import com.netflix.spinnaker.clouddriver.appengine.artifacts.GcsStorageService import com.netflix.spinnaker.clouddriver.appengine.model.AppengineRepositoryClient import com.netflix.spinnaker.clouddriver.artifacts.ArtifactUtils +import groovy.transform.CompileStatic import groovy.transform.TupleConstructor import groovy.util.logging.Slf4j import org.apache.commons.io.FileUtils import org.apache.commons.io.IOUtils +@CompileStatic @Slf4j @TupleConstructor class AppengineGcsRepositoryClient implements AppengineRepositoryClient { @@ -57,6 +59,16 @@ class AppengineGcsRepositoryClient implements AppengineRepositoryClient { def slash = fullPath.indexOf("/") def bucketName = fullPath.substring(0, slash) def bucketPath = fullPath.substring(slash + 1) + Long version = null + + def versionSeparator = bucketPath.indexOf("#") + if (versionSeparator >= 0) { + String versionString = bucketPath.substring(versionSeparator + 1) + if (!versionString.isEmpty()) { + version = Long.parseLong(versionString) + } + bucketPath = bucketPath.substring(0, versionSeparator) + } // Start with a clean directory for each deployment. File targetDirectory = new File(targetDirectoryPath) @@ -67,8 +79,8 @@ class AppengineGcsRepositoryClient implements AppengineRepositoryClient { throw new IllegalArgumentException("GAE staging directory resolved to a file: ${}, failing...") } - if (fullPath.endsWith(".tar")) { - InputStream tas = storage.openObjectStream(bucketName, bucketPath) + if (bucketPath.endsWith(".tar")) { + InputStream tas = storage.openObjectStream(bucketName, bucketPath, version) // NOTE: We write the tar file out to an intermediate temp file because the tar input stream // directly from openObjectStream() closes unexpectedly when accessed from untarStreamToPath() diff --git a/clouddriver-appengine/src/main/java/com/netflix/spinnaker/clouddriver/appengine/artifacts/GcsStorageService.java b/clouddriver-appengine/src/main/java/com/netflix/spinnaker/clouddriver/appengine/artifacts/GcsStorageService.java index db1e72300ec..023926b33c5 100644 --- a/clouddriver-appengine/src/main/java/com/netflix/spinnaker/clouddriver/appengine/artifacts/GcsStorageService.java +++ b/clouddriver-appengine/src/main/java/com/netflix/spinnaker/clouddriver/appengine/artifacts/GcsStorageService.java @@ -97,8 +97,12 @@ public GcsStorageService(Storage storage) { storage_ = storage; } - public InputStream openObjectStream(String bucketName, String path) throws IOException { + public InputStream openObjectStream(String bucketName, String path, Long generation) + throws IOException { Storage.Objects.Get get = storage_.objects().get(bucketName, path); + if (generation != null) { + get.setGeneration(generation); + } return get.executeMediaAsInputStream(); } @@ -143,7 +147,7 @@ public void visitObjects(String bucketName, VisitorOperation op) throws IOExcept public void downloadStorageObjectRelative( StorageObject obj, String ignorePrefix, String baseDirectory) throws IOException { - InputStream stream = openObjectStream(obj.getBucket(), obj.getName()); + InputStream stream = openObjectStream(obj.getBucket(), obj.getName(), obj.getGeneration()); String objPath = obj.getName(); if (!ignorePrefix.isEmpty()) { ignorePrefix += File.separator;