Skip to content

Commit 5cce7d1

Browse files
feat: enhance image handling and add tests for getShortImage method (#9)
* feat: enhance image handling and add tests for getShortImage method * chore: update changelog for version 0.10.0 and adjust README and gradle.properties for new version * fix: update test
1 parent acbf001 commit 5cce7d1

6 files changed

Lines changed: 44 additions & 7 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## 0.10.0
4+
5+
- Enhanced image display to show full paths after registry domain (e.g., ECR URLs).
6+
- Improved test coverage for image URL parsing functionality.
7+
38
## 0.9.0
49

510
- Added support for multiple namespaces.
@@ -19,7 +24,7 @@
1924
## 0.5.0
2025

2126
- Added application cache.
22-
- Upgraded Quarkus to 3.2.x.
27+
- Upgraded Quarkus to 3.2.x.
2328

2429
## 0.4.0
2530

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ Note: currently, Heimdall only supports Flink jobs deployed with [Flink Kubernet
1313

1414
```bash
1515
kubectl apply -f https://raw.githubusercontent.com/sap1ens/heimdall/main/tools/k8s-operator/service-account.yaml
16-
kubectl run heimdall --image=ghcr.io/sap1ens/heimdall:0.9.0 --port=8080 --overrides='{ "spec": { "serviceAccount": "heimdall-service-account" } }'
16+
kubectl run heimdall --image=ghcr.io/sap1ens/heimdall:0.10.0 --port=8080 --overrides='{ "spec": { "serviceAccount": "heimdall-service-account" } }'
1717
kubectl port-forward heimdall 8080:8080
1818
open http://localhost:8080
1919
```
2020

2121
## Installation
2222

23-
Heimdall is available as a Docker container [here](https://github.com/sap1ens/heimdall/pkgs/container/heimdall). Since only
23+
Heimdall is available as a Docker container [here](https://github.com/sap1ens/heimdall/pkgs/container/heimdall). Since only
2424
Flink Kubernetes Operator as available at the moment you'd typically deploy Heimdall as a pod or deployment in the same cluster.
2525

2626
Heimdall uses port 8080 and exposes liveness and readiness endpoints at `/q/health/live` and `/q/health/ready`.
@@ -31,7 +31,7 @@ Job locator (implements `FlinkJobLocator` interface) is a mechanism for discover
3131

3232
### K8sOperatorFlinkJobLocator
3333

34-
Can be enabled with `heimdall.joblocator.k8s-operator.enabled` config. Currently, enabled by default. It loads
34+
Can be enabled with `heimdall.joblocator.k8s-operator.enabled` config. Currently, enabled by default. It loads
3535
`flinkdeployment` custom resource (CR) created by the Flink Kubernetes Operator.
3636

3737
A service account with read-only access to `flinkdeployment` CR is required. See [tools/k8s-operator/service-account.yaml](tools/k8s-operator/service-account.yaml) for an example.

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ quarkusPlatformArtifactId=quarkus-bom
55
quarkusPluginId=io.quarkus
66
quarkusPlatformGroupId=io.quarkus.platform
77
quarkusPlatformVersion=3.2.11.Final
8-
version=0.9.0-SNAPSHOT
8+
version=0.10.0-SNAPSHOT

src/main/java/com/sap1ens/heimdall/service/K8sOperatorFlinkJobLocator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ protected FlinkJobType getJobType(FlinkDeployment flinkDeployment) {
8282

8383
protected String getShortImage(FlinkDeployment flinkDeployment) {
8484
var image = flinkDeployment.getSpec().getImage();
85-
return image.contains("/") ? flinkDeployment.getSpec().getImage().split("/")[1] : image;
85+
return image.contains("/") ? image.substring(image.indexOf("/") + 1) : image;
8686
}
8787

8888
protected int getParallelism(FlinkDeployment flinkDeployment) {

src/main/webui/src/lib/FlinkJobs.svelte

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@
8080
}
8181
8282
function displayName(flinkJob) {
83+
// Fallback to just the job name if displayNamePattern is not loaded yet
84+
if (!displayNamePattern) {
85+
return flinkJob.name;
86+
}
87+
8388
let name = displayNamePattern.replace('$jobName', flinkJob.name);
8489
if (Object.keys(flinkJob.metadata).length > 0) {
8590
for (const [key, value] of Object.entries(flinkJob.metadata)) {

src/test/java/com/sap1ens/heimdall/service/K8sOperatorFlinkJobLocatorTest.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,29 @@ public void testFindAllMultipleNamespaces() {
9191
assertEquals(3, flinkJobs.size());
9292
}
9393

94+
@Test
95+
public void testGetShortImage() {
96+
// Test ECR-style image URL
97+
var ecrDeployment = generateFlinkDeploymentWithImage("000333555999.dkr.ecr.eu-west-1.amazonaws.com/servicing/team/test:0.1.4");
98+
assertEquals("servicing/team/test:0.1.4", flinkJobLocator.getShortImage(ecrDeployment));
99+
100+
// Test Docker Hub style
101+
var dockerHubDeployment = generateFlinkDeploymentWithImage("docker.io/flink:1.15");
102+
assertEquals("flink:1.15", flinkJobLocator.getShortImage(dockerHubDeployment));
103+
104+
// Test simple registry
105+
var simpleRegistryDeployment = generateFlinkDeploymentWithImage("registry.com/image:tag");
106+
assertEquals("image:tag", flinkJobLocator.getShortImage(simpleRegistryDeployment));
107+
108+
// Test image without slash
109+
var simpleImageDeployment = generateFlinkDeploymentWithImage("flink:latest");
110+
assertEquals("flink:latest", flinkJobLocator.getShortImage(simpleImageDeployment));
111+
112+
// Test complex multi-level paths
113+
var complexDeployment = generateFlinkDeploymentWithImage("gcr.io/project/namespace/app:v1");
114+
assertEquals("project/namespace/app:v1", flinkJobLocator.getShortImage(complexDeployment));
115+
}
116+
94117
private List<FlinkDeployment> generateFlinkDeployments(int num) {
95118
var flinkDeployments = new ArrayList<FlinkDeployment>();
96119
for (int i = 0; i < num; i++) {
@@ -100,6 +123,10 @@ private List<FlinkDeployment> generateFlinkDeployments(int num) {
100123
}
101124

102125
private FlinkDeployment generateFlinkDeployment() {
126+
return generateFlinkDeploymentWithImage("test-image");
127+
}
128+
129+
private FlinkDeployment generateFlinkDeploymentWithImage(String image) {
103130
var flinkDeployment = new FlinkDeployment();
104131
flinkDeployment.setMetadata(
105132
new ObjectMetaBuilder()
@@ -111,7 +138,7 @@ private FlinkDeployment generateFlinkDeployment() {
111138
var jobSpec = new JobSpec();
112139
jobSpec.setParallelism(4);
113140
var spec = new FlinkDeploymentSpec();
114-
spec.setImage("test-image");
141+
spec.setImage(image);
115142
spec.setFlinkVersion(FlinkVersion.v1_15);
116143
spec.setJob(jobSpec);
117144
var resource = new Resource();

0 commit comments

Comments
 (0)