Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ on: [pull_request, workflow_dispatch]

env:
GO_VERSION_BUILD: "1.25"
JAVA_VERSION: "11"
JAVA_VERSION: "25"

jobs:
main-go:
Expand Down
85 changes: 85 additions & 0 deletions CustomRegionGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,28 @@

import org.openapitools.codegen.CodegenParameter;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.HexFormat;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.parameters.Parameter;

public class CustomRegionGenerator extends GoClientCodegen {
private final static String NAMESPACE = "cloud/stackit/codegen/";
private final Map<String, OverrideConfig> overrides;

@Override
public String getName() {
Expand All @@ -20,6 +37,14 @@ public String getName() {
public CustomRegionGenerator() {
super();
System.out.println("=== CUSTOM GO CLIENT GENERATOR INITIALIZED ===");
try {
overrides = OverrideConfig.load().stream().collect(Collectors.toMap(
o -> o.path,
Function.identity()
));
} catch (IOException e) {
throw new RuntimeException(e);
}
}

@Override
Expand Down Expand Up @@ -68,4 +93,64 @@ private boolean isRegionField(String name) {
}
return name.equalsIgnoreCase("region") || name.equalsIgnoreCase("regionId");
}

@Override
public void postProcessFile(File file, String fileType) {
var path = file.getAbsolutePath();
var servicesIdx = path.indexOf("/services/");
var subPath = path.substring(servicesIdx + "/services/".length());
if (overrides.containsKey(subPath)) {
var override = overrides.get(subPath);
try {
var content = Files.readAllBytes(file.toPath());
var digest = MessageDigest.getInstance("MD5");
var hex = HexFormat.of();
var hash = hex.formatHex(digest.digest(content));
if (hash.equals(override.hash)) {
var replacementPath = Path.of(Thread.currentThread().getContextClassLoader().getResource(NAMESPACE + override.replacementPath).getPath());
var replacementContent = Files.readAllBytes(replacementPath);
Files.write(file.toPath(), replacementContent, StandardOpenOption.TRUNCATE_EXISTING);
} else {
throw new IllegalStateException(
"expected iaas/v2api/model_area_id.go to hash to " +
override.hash + " but got " + hash +
"\nedit CustomRegionGenerator.java in the sdk-generator and update IAAS_AREA_ID_HASH" +
"to accept this change"
);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
super.postProcessFile(file, fileType);
}

private static class OverrideConfig {
public String name;
public String path;
public String replacementPath;
public String hash;

public static List<OverrideConfig> load() throws IOException {
var path = Thread.currentThread().getContextClassLoader().getResource(NAMESPACE + "overrides.properties").getPath();
var overrideProps = new Properties();
overrideProps.load(new FileInputStream(path));
var byName = new HashMap<String, OverrideConfig>();
overrideProps.stringPropertyNames().forEach(key -> {
var prefixLen = key.indexOf('.');
var prefix = key.substring(0, prefixLen);
var config = byName.computeIfAbsent(prefix, (_) -> new OverrideConfig());
config.name = prefix;
var suffix = key.substring(prefixLen + 1);
switch (suffix) {
case "path" -> config.path = overrideProps.getProperty(key);
case "replacementPath" -> config.replacementPath = overrideProps.getProperty(key);
case "hash" -> config.hash = overrideProps.getProperty(key);
default -> throw new IllegalStateException("unexpected suffix: " + suffix);
}
});
return byName.values().stream().toList();
}
}

}
11 changes: 11 additions & 0 deletions languages/golang/overrides/overrides.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
iaasV2ApiAreaId.path=iaas/v2api/model_area_id.go
iaasV2ApiAreaId.replacementPath=v2api_model_area_id.go
iaasV2ApiAreaId.hash=b7425456c4633b2e8c0a61e9ab3b579e

iaasV1ApiAreaId.path=iaas/v1api/model_area_id.go
iaasV1ApiAreaId.replacementPath=v1api_model_area_id.go
iaasV1ApiAreaId.hash=a9d72364fec0794cab3b51f3680de584

iaasV2BetaApiAreaId.path="iaas/v2beta1api/model_area_id.go
iaasV2BetaApiAreaId.replacementPath=v2beta_model_area_id.go
iaasV2BetaApiAreaId.hash=bb5583419348ee95ebbde0b4133a36f0
164 changes: 164 additions & 0 deletions languages/golang/overrides/v1api_model_area_id.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading