Skip to content

Commit a9ff8fd

Browse files
authored
refactor: Simplify Terraform/Tofu releases download logic (#76)
* refactor: Simplify Terraform/Tofu releases download logic - Remove redundant imports and streamline code structure. - Introduce a reusable `downloadReleasesToFile` method to handle release downloads. - Enhance temporary file handling and ensure cleanup post-download. - Replace in-memory WebClient logic with direct file downloads for better efficiency. * Merge master * Delete file
1 parent d14d7c6 commit a9ff8fd

File tree

1 file changed

+54
-42
lines changed

1 file changed

+54
-42
lines changed

terraform-client/src/main/java/io/terrakube/terraform/TerraformDownloader.java

Lines changed: 54 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import org.springframework.core.io.buffer.DataBufferUtils;
1818
import org.springframework.http.MediaType;
1919
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
20-
import org.springframework.web.reactive.function.client.ExchangeStrategies;
2120
import org.springframework.web.reactive.function.client.WebClient;
2221
import reactor.core.publisher.Mono;
2322
import reactor.netty.http.client.HttpClient;
@@ -26,11 +25,10 @@
2625
import java.io.FileInputStream;
2726
import java.io.FileOutputStream;
2827
import java.io.IOException;
28+
import java.nio.file.Files;
2929
import java.nio.file.Path;
30-
import java.util.Comparator;
31-
import java.util.HashMap;
32-
import java.util.List;
33-
import java.util.Set;
30+
import java.nio.file.Paths;
31+
import java.util.*;
3432
import java.util.stream.Collectors;
3533
import java.util.zip.ZipEntry;
3634
import java.util.zip.ZipInputStream;
@@ -53,6 +51,7 @@ public class TerraformDownloader {
5351
private File tofuDownloadDirectory;
5452
private File terraformDirectory;
5553
private String userHomeDirectory;
54+
private ObjectMapper objectMapper = new ObjectMapper();
5655

5756
public TerraformDownloader() {
5857
try {
@@ -124,23 +123,16 @@ private void createDownloadTofuTempDirectory() throws IOException {
124123
private void getTerraformReleases(String terraformReleasesUrl) throws IOException {
125124
log.info("Downloading terraform releases list");
126125
try {
127-
WebClient webClient = WebClient.builder()
128-
.exchangeStrategies(ExchangeStrategies.builder()
129-
.codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(4 * 1024 * 1024))
130-
.build())
131-
.baseUrl(terraformReleasesUrl)
132-
.clientConnector(
133-
new ReactorClientHttpConnector(
134-
HttpClient.create().proxyWithSystemProperties())
135-
)
136-
.build();
137-
138-
this.terraformReleases = webClient.get()
139-
.accept(MediaType.APPLICATION_JSON)
140-
.retrieve()
141-
.bodyToMono(TerraformResponse.class)
142-
.block();
143-
126+
Path path = Paths.get(FileUtils.getTempDirectory().getAbsolutePath(), UUID.randomUUID().toString());
127+
String tmpdir = Files.createDirectories(path).toFile().getAbsolutePath() + "/terraform-releases.json";
128+
log.info("Downloading terraform releases to {}", tmpdir);
129+
File terraformReleasesFile = new File(tmpdir);
130+
downloadReleasesToFile(terraformReleasesUrl, terraformReleasesFile);
131+
log.info("Downloaded terraform releases completed");
132+
this.terraformReleases = objectMapper.readValue(FileUtils.readFileToString(new File(tmpdir), "UTF-8"), TerraformResponse.class);
133+
log.info("Parsing terraform releases completed");
134+
Files.deleteIfExists(terraformReleasesFile.toPath());
135+
log.info("Deleting temporary files completed");
144136
} catch (Exception e) {
145137
log.error("Error fetching terraform releases {}", e.getMessage());
146138
}
@@ -151,34 +143,54 @@ private void getTerraformReleases(String terraformReleasesUrl) throws IOExceptio
151143

152144
private void getTofuReleases(String tofuReleasesUrl) throws IOException {
153145
log.info("Downloading tofu releases list");
154-
String tofuTemp = "";
155-
try {
156-
WebClient webClient = WebClient.builder()
157-
.exchangeStrategies(ExchangeStrategies.builder()
158-
.codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(15 * 1024 * 1024))
159-
.build())
160-
.baseUrl(tofuReleasesUrl)
161-
.clientConnector(
162-
new ReactorClientHttpConnector(
163-
HttpClient.create().proxyWithSystemProperties())
164-
)
165-
.build();
166146

167-
tofuTemp = webClient.get()
168-
.accept(MediaType.APPLICATION_JSON)
169-
.retrieve()
170-
.bodyToMono(String.class)
171-
.block();
172-
ObjectMapper objectMapper = new ObjectMapper();
147+
Path path = Paths.get(FileUtils.getTempDirectory().getAbsolutePath(), UUID.randomUUID().toString());
148+
String tmpdir = Files.createDirectories(path).toFile().getAbsolutePath() + "/tofu-releases.json";
149+
log.info("Downloading tofu releases to {}", tmpdir);
150+
File tofuReleasesFile = new File(tmpdir);
173151

174-
this.tofuReleases = objectMapper.readValue(tofuTemp,
152+
try {
153+
downloadReleasesToFile(tofuReleasesUrl, tofuReleasesFile);
154+
log.info("Downloaded tofu releases completed");
155+
this.tofuReleases = objectMapper.readValue(FileUtils.readFileToString(new File(tmpdir), "UTF-8"),
175156
objectMapper.getTypeFactory().constructCollectionType(List.class, TofuRelease.class));
157+
158+
log.info("Parsing tofu releases completed");
159+
Files.deleteIfExists(tofuReleasesFile.toPath());
160+
log.info("Deleting temporary tofu files completed");
161+
176162
} catch (Exception e) {
177-
log.error("Error fetching terraform releases {}", e.getMessage());
163+
log.error("Error fetching tofu releases {}", e.getMessage());
178164
}
179165
log.info("Found {} tofu releases", this.tofuReleases.size());
180166
}
181167

168+
private static void downloadReleasesToFile(String releasesUrl, File releasesFile) {
169+
WebClient webClient = WebClient.builder()
170+
.clientConnector(new ReactorClientHttpConnector(
171+
HttpClient.create()
172+
.followRedirect(true)
173+
.proxyWithSystemProperties()
174+
))
175+
.defaultHeaders(h -> {
176+
h.add("User-Agent", "releases-downloader");
177+
h.setAccept(List.of(MediaType.APPLICATION_JSON));
178+
})
179+
.build();
180+
181+
webClient.get()
182+
.uri(releasesUrl)
183+
.retrieve()
184+
.onStatus(
185+
status -> !status.is2xxSuccessful(),
186+
clientResponse -> clientResponse.createException().flatMap(Mono::error)
187+
)
188+
.bodyToFlux(DataBuffer.class)
189+
.as(dataBufferFlux -> DataBufferUtils.write(dataBufferFlux, releasesFile.toPath() ))
190+
.then()
191+
.block();
192+
}
193+
182194
private String downloadFileOrReturnPathIfAlreadyExists(String fileName, String zipReleaseUrl, String version,
183195
boolean tofu) throws IOException {
184196
String downloadPath = tofu ? TOFU_DOWNLOAD_DIRECTORY : TERRAFORM_DOWNLOAD_DIRECTORY;

0 commit comments

Comments
 (0)